include "pl6f84.inc"
_work equ h’4E’; Для сохранения W при входе в обработчик
_status equ h’4F’; Для сохранения STATUS при входе в обработчик
EVENT equ h’20’; Счетчик количества банок
BATCH equ h’21’; Флаг прохода 24 банок
; ---------------------
org 000; Вектор сброса
goto MAIN; Переходим к началу фоновой программы
; ---------------------
org 004; Вектор прерывания
goto CAN_COUNT; Переходим к началу обработчика прерывания
; ---------------------
; Фоновая программа начинается с секции инициализации
MAIN bcf PORTA,0; Гарантируем наличие 0 на выводе RA0
bsf STATUS,RP0; Переключаемся в 1-й банк
bcf TRISA,0; Переключаем вывод RA0 на выход
; Примечание. При использовании модели с модулем АЦП, например PIC16F877,
; вывод PortA[0] должен быть сконфигурирован как цифровой вход!!!
bcf STATUS,RP0; Переключаемся обратно в 0-й банк
clrf BATCH; Обнуляем флаг группы
clrf EVENT; и счетчик банок
clrf INTCON; Сбрасываем все флаги прерывания
bsf INTCON,GIE; Разрешаем все прерывания
bsf INTCON,INTE; Разрешаем внешнее прерывание
; ----------------------
ПОКА флаг группы равен нулю, ничего не делаем
LOOP movf BATCH,f; Проверяем BATCH == 0?
btfsc STATUS,Z; Пропускаем, если нет
goto M_LOOP; В противном случае проверяем снова
; 24 банки прошло, Формируем импульс —
clrf BATCH; Обнуляем флаг
bsf PORTA,0; Выставляем на RA0 ВЫСОКИЙ уровень
call DELAY; Ждем 1 мс
bcf PORTA,0 ;Выставляем на RA0 НИЗКИЙ уровень
goto M_LOOP;Возвращаемся к началу
; ----------------------
; ***********************
; Это процедура обработки прерывания
CAN_COUNT
movwf _work; Сохраняем W в памяти данных
swapf STATUS,w; Считываем текущее состояние STATUS
movwf _status; и сохраняем его в памяти данных
; -----------------------
dcf INTCON,INF; Сбрасываем флаг внешнего прерывания
incf EVENT,f; Регистрируем очередное событие
movf EVENT,w; Читаем значение счетчика
addlw -d’24’; Сравниваем с 24 (EVENT — 24)
btfss STATUS,С; ЕСЛИ EVENT больше или равно, ТО пропускаем (нет заема)
goto CAN_EXIT; ИНАЧЕ выходим
clrf EVENT; Обнуляем счетчик банок и сообщаем
incf BАТСН, f; в фоновую программу, что прошло 24 банки
; ---------------------
CAN_EXIT
swapf _status,w; Восстанавливаем исходное состояние STATUS
movwf STATUS; из памяти данных
swapf _work,f; Теперь восстанавливаем исходное состояние
swapf _work,w; рабочего регистра, не воздействуя на флаги,
retfie; и возвращаемся в фоновую программу
При возникновении прерывания (при пересечении банкой луча фотодетектора) управление будет передано в процедуру обработки прерывания, т. е. произойдет следующая последовательность переходов: прерывание — > h’004’ —> CAN_COUNT. Как обычно, эта процедура состоит из трех секций.
Сохранение контекста