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

Глава 14. Режимы энергосбережения и сторожевой таймер 369 ном регистре мcucR там зато есть биты управления отключением системы BOD - в обход обычно управляющего этим процессом fusе-бита BODEN (о чем авторы реко­ мендаций по части энергосбережения Arduino почему-то благополучно забывают и рекомендуют лезть в конфигурационные ячейки). Мы будем здесь рассматривать только классический случай управления через мcucR. По умолчанию все биты установки Sleep Mode, сколько их есть (три sмо . . 2, два sмо . . 1 или один sм) установлены в нулевое состояние, что означает режим Idle. Тогда достаточно установить бит разрешения SE и вызвать команду sleep. Для ус­ тановки режима Power Down надо дополнительно установить бит sм1 : ldi temp , ( 1<< SMl ) 1 ( l<<SE ) ; разрешение S leep , режим Power Down out MCUCR, temp Как мы помним из главы 7, команду s leep нельзя вызывать из прерывания (она по­ просту не сработает). Напомним также, что инструкция рекомендует устанавливать бит разрешения непосредственно перед вызовом команды sleep, - фактически это предохранитель, как и в некоторых других случаях (см. , например, описание записи в EEPROM или обращения со сторожевым таймером далее), обеспечивающий дуб­ лирование одной и той же операции во избежание самопроизвольного «ухода» МК в спящее состояние при наличии помех. Обратите внимание, что первым делом по­ сле выхода из режима «сна>> выполнится обработчик прерывания, «разбудившего» компьютер, а после него - команда, следующая после sleep. Дополнительно снизить потребление может отключение системы BOD. В боль­ шинстве контроллеров отключить ее можно только программированием «фьюзов» (вернуть BODEN в состояние 1, - см. главу 5) . В моделях с пикопотреблением (ATmega88P/ 1 68P/328P) в регистре мcucR есть биты вооsЕ и вооs, позволяющие от­ ключать BOD программно. Отключение BOD должно экономить около 20-30 мкА, в зависимости от контроллера. Мы уже знаем, что в любом из S lеер-режимов ника­ ких непредсказуемых операций контроллер совершать не может, потому система BOD не требуется . Но прежде чем уводить контроллер в спящий режим, нужно озаботиться его спосо­ бом вывода оттуда, иначе он просто заснет навсегда, и ничего полезного сделать уже не сможет. При всей видимой скудности средств вывода из глубокого сна в режиме Power Down, они предоставляют достаточно богатый набор возможно­ стей. Начнем с классического пробуждения по внешнему импульсу, пришедшему на вывод внешнего прерывания . В ыход по внешнему п рерыванию Напомним, что вывести из режима Power Down можно только прерыванием, про­ исходящим асинхронно; т. е. не связанным с наличием тактовых импульсов. Уни­ версальный способ состоит в объявлении прерывания по уровню INTO или INT l , которые имеются во всех моделях контроллеров (разве что в самых младших Тiny имеется только INTO). Внешний импульс может поступить от банального нажатия

RkJQdWJsaXNoZXIy MTExODQxMg==