__config _WDT_ON; Включаем сторожевой таймер
org h’000’; Вектор сброса
MAIN btfSS STATUS,NOT_TO; Сброс от сторожевого таймера?
clrf BEAN_COUNT; ЕСЛИ нет, ТО обнуляем счетчик
; Остальной инициализационный код ------------
clrwdt; Устанавливаем NOT_ТO и сбрасываем сторожевой таймер
Строго говоря, при инициализации после сброса по питанию команду clrwdt вызывать не обязательно. Однако из-за этой секции инициализации увеличивается время перехода к основной части программы и, соответственно, время до запланированного вызова команды clrwdt. Так что дополнительная команда clrwdt в конце любого блока инициализации является полезной предосторожностью.
Поскольку генератор сторожевого таймера полностью независим от системного тактового сигнала, он продолжает работать даже после перевода микроконтроллера в «спящий» режим. Для этого команда sleep сбрасывает сторожевой таймер и деактивирует флаг
При необходимости программа может определить, что выход из спящего режима произошел по тайм-ауту сторожевого таймера, проверив флаги
* * *
Модели младшего уровня имеют базовый 8-битный счетчик/предделитель, который первоначально назывался счетчиком/таймером реального времени (Real-Time Clock/Counter — RTCC). Хотя этот термин до сих пор встречается в документации на старые микроконтроллеры линейки PIC16CXXX, появление дополнительных таймеров привело к возникновению более логичного термина — Таймер 0. Тем не менее сокращение «RTCC» до сих пор встречается в старых книгах и программном обеспечении. Например, в компиляторе CCS задание внешнего тактового сигнала Таймера 0 с активным спадающим фронтом и коэффициента деления предделителя, равного 4, осуществляется вызовом функции setup_counters (rtcc_ext_1_to_h, rtcc_div_4[171]).
Из Рис. 13.3 можно заметить, что Таймер 0 представляет собой 8-битный счетчик, расположенный в регистре с адресом h’01’, подключенный к 8-битному предделителю. Таким образом, с помощью трех битов PS[2:0] регистра OPTION_REG мы можем задавать восемь различных частот сигнала, подаваемого на вход счетного регистра таймера. Поскольку предделитель Таймера 0 является также постделителем сторожевого таймера[172], для его подключения к Таймеру 0 необходимо сбросить бит PSA регистра OPTION_REG.
Рис. 13.3.
По умолчанию после сброса предделитель подключен к сторожевому таймеру. В этом случае счетчик таймера может работать либо от внутреннего системного тактового сигнала частотой