Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру
Глава 14. Режимы энергосбережения и сторожевой таймер 377 дует делать, даже если у вас никаких прерываний в программе не предусмотре но, - просто на всякий случай. И обязательно не забыть восстановить разрешение прерываний в конце процедуры (команда sei), иначе после установок контроллер может оказаться неработоспособным. Заметим в скобках, что Arduino этот момент особенно касается - там неявные прерывания возникают постоянно. Поэтому, если здесь мы можем специально ничего не запрещать, поскольку будем произво дить инициализацию режима в начале программы, когда прерывания запрещены заведомо, то в Arduino мы ни в чем не уверены, и там правило запрета прерываний нужно соблюдать во всех случаях. В расширенном WDT (АТtiny23 1 3 , «ардуиновские» АTmega88/ l 68/328) простой запуск с целью последующего сброса осуществляется точно так же, только для задания времени в регистре WDTCR имеется четыре бита: WDPЗ : о, а не три. Но нам интереснее режим прерывания, который можно включить следующим способом (листинг 4. 1 4) . cli wdr ldi temp , ( l<<WDCE ) 1 ( l<<WDE ) ; разрешение изменений + запуск out WDTCR, temp ldi temp , ( l«WDIE ) 1 ( 1« WDPЗ ) 1 ( l«WDPO ) ; внесение изменений : прерывание , (WDPЗ : O = 1 0 0 1 = 8 сек) + запуск out WDTCR, temp sei Разумеется, прерывание WDT нужно инициализовать еще и обычным способом через таблицу векторов. Если вы одновременно с разрешением прерываний (бит WDIE ) еще и установите обычный запуск (бит WDE, как в листинге 1 4 .3), то у вас кон троллер окажется в комбинированном режиме прерывания+сброса. В этом режиме первый раз контроллер просыпается на выполнение только прерывания, в конце которого он переключается на сброс, и в следующий раз окажется в режиме сброса. В обычных программах такое не требуется - режим может пригодиться, чтобы куда-то сохранить ценные данные перед тем, как сбросить контроллер полностью, и затем опять начать с нуля . В приведенном примере (см. листинг 4 . 1 4) мы установили максимальное время срабатывания расширенного WDT, равное 8 с. Тактирование WDT происходит от отдельного RС-генератора, который у классического таймера «шлепает» с частотой 1 МГц, а у расширенного - с частотой 1 28 кГц (тем же генератором отсчитывается задержка запуска после сброса, - см. описание fusе-битов suтo и suт1 в главе 5). Разумеется, это величины приблизительные и зависят как от напряжения питания, так и от температуры кристалла (в модернизированном расширенном WDT эта за висимость несколько меньше, чем в классическом). Значения временного интервала в зависимости от состояния битов WDP2 : о и WDPЗ : о приведены в табл. 1 4 . 1 и 1 4.2 для разных вариантов таймеров.
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==