Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру

Глава 14. Режимы энергосбережения и сторожевой таймер 375 ЗАМЕТКИ НА ПОЛЯХ Наверное, можно представить реальный случай , когда такой перезапуск может пона­ добиться при нормальной работе : если , скажем, есть вероятность , что очередной бес­ конечный цикл ожидания, которых у нас предостаточно по разным поводам, не закон­ чится ничем, а продолжать работу надо. Но как на страховку от нештатной ситуации проще, на мой взгляд, на перезапуск не надеяться . Нештатная ситуация , требующая перезагрузки контроллера, в огромном большинстве случаев означает, что либо схе­ ма, либо программа составлены с ошибками , и их надо просто отладить как следует. Аналогия с ранними Windows , которые уходили в перезагрузку по каждому чиху (зна­ менитый «синий экран смерти») , тут не катит: не бывает в контроллерах близких по сложности программ, а если вдруг бывает, то чего-то тут не додумали . У контроллеров другое назначение, чем у традиционных микропроцессоров: схема вместе с програм­ мой представляют единый комплекс, и если в нем что-то сбоит, то это означает нера­ ботоспособность прибора в целом. И тут уж безразлично, перезагрузится он и снова зайдет в тупик или просто повиснет. Так что обычно периодическая принудительная перезагрузка - это в лучшем случае отладочный режим, но никак не нормальная ра­ бота . Зато для многих других целей сторожевой таймер весьма полезная вещь - прежде всего потому, что он выводит контроллер из любого режима энергосбережения . Представим себе прибор, который основное время бездельничает, и только редко­ редко должен что-то делать (датчик, измеряющий какую-то медленно меняющуюся величину) . Тогда мы просто загоняем контроллер в «СОЮ>, периодически просыпа­ емся, выполняем работу и опять засыпаем. Если WDT будет «будить» контроллер каждые две секунды, а выполняемая операция занимает, допустим, 4 миллисекунды (длинная операция типа отсылки данных по UART или записи в EEPROM), то доля активного состояния во времени составит 1 / 500• Соответственно, общее потребление в активном состоянии нужно тоже поделить на 500, и если оно составляет, допус­ тим, 1 5 мА, то в среднем эта доля потребления составит 30 мкА- совсем неболь­ шая добавка к потреблению контроллера в «спящем» режиме (не забудем, что сам включенный WDT также потребляет, потому общая добавка может превысить 1 00 мкА) . Классический WDT, который унаследован многими относительно старыми моде­ лями контроллеров (включая «наши» ATmega8 и ATmega8535 ) еще от семейства Classic, только это и умеет делать: перезагружать контроллер через заданные про­ межутки времени (как если бы мы нажали на кнопочку Reset), если его вовремя не сбросить. В последующих моделях появился расширенный WDT, который допол­ нительно приобрел одно крайне полезное свойство - он может при пробуждении входить в режим специального прерывания WDT. При этом все регистры и память остаются в неприкосновенности - как будто мы вообще ни в какой сон не уходи­ ли, а начинаем выполнять действия просто по обычному таймеру или другому со­ бытию. Это, повторимся, крайне полезное свойство позволяет решить кучу разных проблем : поскольку мы теперь можем хранить данные хоть в регистрах, хоть в па­ мяти, то очень просто строить те же датчики с любым периодом измерения и осреднением измеряемой величины за любой произвольный срок, причем с эко­ номным расходом энергии. В семействе Mega такой расширенный WDT начинается с модели АTmega88 и да­ лее, а вот в семействе Ti n y все проще : его, подобно прерыванию PCINT, имеет

RkJQdWJsaXNoZXIy MTExODQxMg==