Автор: WildCat
Спящий режим, выход из него, сторожевой пёс
Спящий режим (Sleep) и остановка (Powerdown) обычно применяются при автономном питании устройства, когда контроллер бездельничает и жрет энергию впустую. Вполне разумно приостанавливать его работу на это время.
AT90S2313 может погрузиться в сон двумя способами:
- Команда Idle. Останавливает тактовый генератор, но UART, внешние прерывания и прерывания по таймеру/счетчику продолжают работать. Все они выводят микроконтроллер из спящего режима.
- Команда Powerdown останавливает тактовый генератор, но работать продолжают только внешние прерывания.
Рассмотрим пример работы с режимом Powerdown и выходом из него:
powerdown.bas
$regfile = "2313def.dat" $crystal = 4000000 Config Pind.6 = Output Config Int0 = Low Level On Int0 Button: Enable Interrupts Enable Int0 Do Set Portd.6 Wait 1 Reset Portd.6 Cls Lcd "power-idle..." Lowerline Lcd "pushbtn to wake" Powerdown Loop Button: Cls Lcd "awake!" Wait 1 Return EndПосле того, как контроллер поморгает светодиодом и напишет сообщение на ЖКИ, Powerdown погрузит его в сон.
Нажатие кнопки на Int0 разбудит его.
Сторожевой пес (watchdog)
Bascom позволяет реализовать функцию ватчдога в программе. Ватчдог - такая функция, которая сбрасывает контроллер, если программа начинает тупить или зависает. По сути это - таймер, который нужно регулярно обнулять. Если программа зависает, она не делает очередной сброс счетчика. Как только он переполняется, происходит аппаратный сброс контроллера. Эта функция нужна в приложениях, где стабильность работы критична, и устройство должно работать, что бы ни произошло.
Естественно, программа контроллера должна взаимодействовать с таймером ватчдога. Его срабатывание - серьезная внештатная ситуация, которая может быть вызвана как неисправностью самой программы, так и оборудования. В любом случае, если вы применяете сторожевой таймер, позаботьтесь о системе протоколирования ошибок, иначе вы рискуете никогда не узнать причину сбоя. И маловероятно, что он не повторится снова.
Ватчдог настраивается следующим образом:
Config Watchdog 16|32|64|128|256|512|1024|2048В диапазоне от 16 до 2048 мс.
Счетчик нужно постоянно сбрасывать перед переполнением:
Reset WatchdogЧтобы предотвратить аппаратный сброс.
Ватчдог может быть запущен или остановлен в нужный момент:
Start Watchdog Stop WatchdogНо похоже, одно только наличие команды Stop Watchdog попирает всю идею его применения.
В AT90S2313 ватчдог использует отдельный тактовый генератор 1 МГц, встроенный в чип. Он не очень точный, так что задержки таймера могут слегка варьироваться.
Вот пример вынужденного срабатывания таймера:
watchdog.bas
$regfile = "2313def.dat" $crystal = 4000000 Config Pind.6 = Output Config Watchdog = 2048 Do Cls Set Portd.6 Wait 2 Reset Portd.6 Lcd "wd running." Lowerline Lcd "wait 2 secs..." Start Watchdog Idle Loop EndПосле команды Start Watchdog контроллер отправляется в режим Sleep, останавливая тактовый генератор. Так как ватчдог работает на независимом тактовом генераторе, такой ход вещей его не устраивает, и он генерирует принудительный аппаратный сброс примерно через 2 секунды.