Спящий режим микроконтроллеров AVR

21 ноября 2014

Спящий режим и управление питанием микроконтроллеров AVR может оказаться очень полезным, если микроконтроллер какое-то время ничего не делает, а просто тикает и ожидает какого-нибудь события. А также, для выключения не используемой периферии МК в целях экономии ресурсов батареи питания. Для перевода МК в режим сна в WinAVR нужно установить нужные биты регистра управления микроконтроллером и воспользоваться инструкцией SLEEP таким образом
asm("sleep");


Вообще у разных микроконтроллеров биты управления режимами энергосбережения могут быть разбросаны по разным регистрам. А также количество режимов может изменяться от 2 до 6 у разных моделей МК. Чтобы посмотреть регистры конкретного микроконтроллера загляните в даташит в раздел "Power management and sleep modes". В данной статье мы рассмотрим МК mega8.


Рассмотрим регистр управления режимами питания микроконтроллера.

MCUCR

Бит 7 - SE: Разрешение спящего режима. Этот бит должен быть установлен в "1", чтобы МК смог войти в один из режимов сна.
Биты 6:4 - SM2:0: Выбор спящего режима

А теперь давайте кратко рассмотрим все спящие режимы, а также способы выхода из этих режимов.
Idle Mode. Режим ожидания (общий для всех моделей). В этом режим останавливается ЦПУ, а периферия - SPI, USART, Аналоговый компаратор, ADC, TWI, таймеры/счетчики, сторожевой таймер и система прерываний продолжает работать.
ADC Noise Reduction Mode. В этом режиме останавливается процессор, но АЦП, внешние прерывания, TWI, таймер/счетчик2, сторожевой таймер (если включен) продолжают работать. Этот режим служит для уменьшения разных наводок во время преобразования АЦП. Кроме прерывания по завершению преобразования АЦП, микроконтроллер из этого режима энергосбережения может вывести внешний сброс, сброс сторожевым таймером, прерывание TWI, прерывание таймера/счетчика2, прерывание готовности EEPROM, изменение уровня на INT0 или INT1.


Power-down Mode. Общий для всех микроконтроллеров AVR. В этом режиме останавливается все что есть в микроконтроллере, кроме сторожевого таймера (если его включить), внешних прерываний и TWI. Только внешний сброс, сброс сторожевым таймером, прерывание TWI или изменение уровня на INT0 или INT1 может разбудить микроконтроллер. Следует учесть, что в этом режиме останавливается тактовый генератор, поэтому чтобы проснуться микроконтроллеру может понадобиться какое-то время. Учитывайте это при разработке программ. Самый экономный режим.


Power-save Mode. Этот режим похож на Power-down mode. Отличается он тем, что если Таймер/счетчик2 работает асинхронно, то он продолжит свою работу и во время сна. Это может пригодиться при реализации часов реального времени на микроконтроллере.
StandbyMode. Этот режим также похож на режим Power-down mode. Но в этом режиме тактовый генератор продолжает работать (если установлен внешний кварц). Из этого режима МК просыпается за 6 тактов.


Да, еще отмечу, что нужно быть аккуратным при вызове режима энергосбережения из обработчика прерывания. Может оказаться так, что вы усыпляете МК, а он сразу просыпается и таким образом он не будет находиться в режиме энергосбережения. На этом закончу описание режимов сна. Пример приведу в ближайшее время.