17. Спящий режим, сторожевой пес (watchdog)



Автор: 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 секунды.



DECADALAB ALFA