Ревич, Ю.В. Программирование микроконтроллеров 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). Внешний импульс может поступить от банального нажатия
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==