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

380 Часть 111. Практическое программирование микроконтроллеров А VR sbci Razrl , O sbci Razr2 , 0 brcc R sub . endm Reset : ldi temp, low (RAМEND ) out SPL, temp ldi temp , high (RAМEND) out SPH, temp ; устанавливаем указатель на стек ldi temp , ObO O O O O O O l ; порт В контакт РВО на выход out DDRВ , temp ; ==== установка Watchdog , прерывания запрещены ! wdr ; сбрасываем WDT ldi temp , ( l<<WDCE ) 1 ( l<<WDE ) ; разрешение изменений + запуск out WDTCR, temp ldi temp , ( l«WDE ) 1 ( 1« WDP2 ) 1 ( l«WDPl ) 1 ( l«WDPO ) ; внесение изменений : прерывание , (WDPЗ : O = 0 1 1 1 = 2 сек) + запуск out WDTCR, temp ldi temp , ( 1<< SMl ) 1 ( l<<SE ) ; разрешение S leep, режим Power Down out MCUCR, temp Gcykle : ; главный цикл sbi PortB , O ; зажигаем светодиод Delay2 0 $ 0 3 , $ 0D , 4 0 ; задержка 0 , 2 5 с при 4 МГц cbi PortB , 0 ; гасим светодиод s leep ; уходим в сон rjmp Gcykle ; По этой программе контроллер будет каждые две секунды подмигивать светодио­ дом, сигнализируя, что он «проснулся», загрузился и что-то делает. Причем от так­ товой частоты здесь будет меняться только задержка, т. е. время нахождения кон­ троллера в активном режиме, о чем сигнализирует включенный светодиод. Период между перезапусками, независимо от того, что контроллер в это время делает, от частоты тактирования не зависит и будет всегда равным примерно 2, 1 секунды. Не забывайте только, что по умолчанию время выхода из режима Power Down при так­ тировании контроллера от внешнего кварца 4 МГц составит около 8 мс, а от внут­ реннего генератора- почти одну десятую секунды (о конфигурационных ячейках suтo и suт1 , определяющих эти моменты, рассказано в главе 5), что может оказаться критичным в некоторых ситуациях. Повторим еще раз про ограничение на длительность работы при включенном WDT (задаваемое в рассматриваемом случае задержкой Delay2 0 ) : время пребывания в активном состоянии не должно превысить установленного интервала WDT, иначе контроллер уйдет на перезагрузку, не окончив работу. Но можно, конечно, посту­ пить и иначе - не дожидаясь очередной перезагрузки, своевременно сбрасывать WDT командой wdr.

RkJQdWJsaXNoZXIy MTExODQxMg==