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’0
7’; Выключаем аналоговый компараторmovwf CMCON
movlw b’11011010’
; Предделитель — к WDT, коэффициент 1:8bsf STATUS,RP0
; Переключаемся в 1-й банкmovwf OPTION_REG
; Таймер 0 тактируется внутренним сигналомbcf STATUS,RP0
; Возвращаемся в 0-й банкclrf TMR0
; Обнуляем таймерbsf INTCON,T0IE
; Разрешаем прерывание от Таймера 0bsf INTCON,GIE
; Разрешаем все прерыванияbtfss STATUS,NOT_TO
; ЕСЛИ тайм-аут сторожевого таймера,goto READING
; ТО идем на обработку значений; ИНАЧЕ это был сброс по питанию
clrf ROLL_OVER+1
; Обнуляем 2-байтный счетчик переполнений Таймера 0clrf 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
; Сохраняем Wswapf STATUS,w
; и регистр STATUSmovwf status
; *******************************
; Основной код обработчика
incf ROLL_OVER+1,f
; Регистрируем новое переполнениеbtfsc STATUS,Z
; Пропускаем, если не нольincf ROLL_OVER,f
; Инкрементируем старший байтbcf INTCON,TOIF
; Сбрасываем флаг прерывания; ********************************
swapf _status,w
; Восстанавливаем исходное значениеmovwf STATUS
; регистра STATUSswapf _work,f
; Восстанавливаем исходное значение Wswapf _work,w
; не меняя STATUSretfie
; и выходим из прерыванияВ этой же программе приведен код процедуры обработки прерывания от Таймера 0. В обработчике осуществляется инкрементирование 2-байтной переменной, расположенной в регистрах ROLL_OVER: ROLL_OVER+1, которая представляет собой числовое выражение длительности периода сторожевого таймера, считываемое системой при сбросе по тайм-ауту сторожевого таймера.
Во время работы программы процессор будет периодически сбрасываться по тайм-ауту сторожевого таймера. А поскольку при этом событии бит