; ****************
; * В обработчике формируется импульс управления упаковочной *
; * машиной и реинициализируется Таймер 0 значением -24. Также *
; * в COUNT:2 накапливается общее количество упакованных коробок *
; * для анализа в фоновом цикле *
; ****************
; Сначала сохраняем контекст
ISR movwf _work; Сохраняем W
swapf STATUS,w; и регистр STATUS
movwf _status
; =============
; Основной код
btfss INTCON,T0IF; Было переполнение таймера?
goto ISR_EXIT; ЕСЛИ нет, ТО ложная тревога
bcf PORTB,1; Формируем передний фронт импульса
movlw -d’24’; Реинициализируем Таймер 0
movwf TMR0
incf COUNT+1,f; Увеличиваем счетчик коробок на 1
btfsc STATUS,Z
incf COUNT,f
bcf INTCON,T0IF; Сбрасываем флаг прерывания
bsf PORTB,1; Формируем задний фронт импульса
; ===============
ISR_EXIT swapf _status,w; Восстанавливаем регистр STATUS
movwf STATUS
swapf _work,f; Восстанавливаем W,
swapf _work,w; не затрагивая STATUS,
retfie; и выходим из прерывания
Основной код обработчика заключен в «обертку», выполняющую переключение контекста согласно Программе 7.2 (стр. 226). Ядро обработчика выполняет следующие операции:
• Формирует импульс управления упаковочной машиной на выводе RB1.
• Заносит в счетный регистр таймера число —24.
• Инкрементирует двухбайтную переменную общего количества коробок.
• Сбрасывает флаг прерывания от Таймера 0 — T0IF.
При входе в обработчик прерывания проверяется флаг T0IF, и если он не установлен, то осуществляется выход из процедуры обработки прерывания. Если бы в устройстве использовались и другие источники прерывания, то вместо выхода из обработчика нам надо было бы перейти к другой его секции, как показано в листинге, приведенном на стр. 219.
Альтернативный подход с использованием внешнего прерывания можно посмотреть в Программе 7.2, приведенной на стр. 226.
Во втором примере демонстрируется работа модуля Таймера 0 в качестве собственно таймера, выполняющего измерение времени между событиями. В данном случае этими событиями являются всплески ЭКГ, изображенные на Рис. 7.1 (стр. 208). При обнаружении такого всплеска пиковый детектор прерывает работу микроконтроллера, в котором организован 2-байтный счетчик, работающий от внешнего генератора частотой 10 кГц. Таким образом, мы можем с дискретностью 100 мкс (назовем эту величину «тиком») определить интервал между событиями. Мы несколько изменим требования, предъявляемые к системе, чтобы избавиться от внешнего генератора, и воспользуемся для накопления числа тиков Таймером 0 (один тик в данном случае будет равен 1 мс).
Для решения данной задачи нам потребуется так сконфигурировать Таймер 0, чтобы при его работе от основного тактового сигнал микроконтроллера (через предделитель) переполнение происходило бы каждую миллисекунду (1000 мкс). Если мы возьмем кварцевый резонатор с частотой 4.096 МГц, то из уравнения
Тайм-аут = 1000 мкс = (4/4.096) х 256 х Коэффициент деления предделителя
получим, что коэффициент деления предделителя должен быть равен 4. Учитывая указанные требования, напишем секцию инициализации: