include "p12f629.inc”
__config _WDT_ON & _CP_OFF & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF
cblock h’20’
_work 1, _status:1
FIRST_HI:1, FIRST_LO:1
ROLL_OVER:2, LO_TEMP:2, HI_TEMP:2
DELTA _TEMP:1
endc
org 0
START goto MAIN
org 4
goto ISR
; При каждом сбросе инициализируем Таймер 0, порт ввода/вывода и пр.
MAIN movlw h’07’; Выключаем аналоговый компаратор
movwf CMCON
movlw b’11011010’; Предделитель — к WDT, коэффициент 1:8
bsf STATUS,RP0; Переключаемся в 1-й банк
movwf OPTION_REG; Таймер 0 тактируется внутренним сигналом
bcf STATUS,RP0; Возвращаемся в 0-й банк
clrf TMR0; Обнуляем таймер
bsf INTCON,T0IE; Разрешаем прерывание от Таймера 0
bsf INTCON,GIE; Разрешаем все прерывания
btfss STATUS,NOT_TO; ЕСЛИ тайм-аут сторожевого таймера,
goto READING; ТО идем на обработку значений
; ИНАЧЕ это был сброс по питанию
clrf ROLL_OVER+1; Обнуляем 2-байтный счетчик переполнений Таймера 0
clrf ROLL_OVER
clrf FIRST_HI
clrf FIRST_LO
clrf LO_TEMP+1; Обнуляем регистры результата для низкой температуры
clrf LO_TEMP
clrf HI_TEMP+1;и для высокой температуры
clrf HI_TEMP
clrwdt;Сбрасываем сторожевой таймер
goto $;Ждем следующего сброса от сторожевого таймера
; *******************************
; * В обработчике прерывания при прерывании от Таймера 0 *
; * инкрементируем 2-байтное число переполнений таймера *
; *******************************
;Сначала сохраняем контекст
ISR movwf _work; Сохраняем W
swapf STATUS,w; и регистр STATUS
movwf status
; *******************************
; Основной код обработчика
incf ROLL_OVER+1,f; Регистрируем новое переполнение
btfsc STATUS,Z; Пропускаем, если не ноль
incf ROLL_OVER,f; Инкрементируем старший байт
bcf INTCON,TOIF; Сбрасываем флаг прерывания
; ********************************
swapf _status,w; Восстанавливаем исходное значение
movwf STATUS; регистра STATUS
swapf _work,f; Восстанавливаем исходное значение W
swapf _work,w; не меняя STATUS
retfie; и выходим из прерывания
В этой же программе приведен код процедуры обработки прерывания от Таймера 0. В обработчике осуществляется инкрементирование 2-байтной переменной, расположенной в регистрах ROLL_OVER: ROLL_OVER+1, которая представляет собой числовое выражение длительности периода сторожевого таймера, считываемое системой при сбросе по тайм-ауту сторожевого таймера.
Во время работы программы процессор будет периодически сбрасываться по тайм-ауту сторожевого таймера. А поскольку при этом событии бит