Ревич, Ю.В. Программирование микроконтроллеров 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, имеет
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==