Home / Posts / Электроника / AVR спящий режим /


AVR спящий режим



 Не так давно я решил собрать себе велокомпьютер на микроконтроллере, и мне пришлось столкнуться с несколькими моментами и нюансами, о которых и хочу рассказать.

Эти моменты могут относиться к любому устройству на микроконтроллере, к которому предъявляются особые требования по потреблению тока, а также предусматривается чтение или запись в память eeprom или flash.

Допустим, у нас имеется какая-то схема с микроконтроллером Attiny2313A (в моем случае), к которому подключен ЖК дисплей, несколько кнопок с датчиком, и кварцевый резонатор. Среда программирования - CodeVision AVR.

Нам нужно, чтобы контроллер засыпал в периодах между сигналами датчика, поскольку это позволяет снизить энергопотребление. Для этого нужно настроить регистр MCUCR соответствующим образом:

Еще нужно записать 1 в бит SE регистра SMCR и выполнить инструкцию SLEEP.

Это можно сделать прямо в функции. Ниже - пример перевода в режим IDLE (холостой).

"При этом останавливается ЦПУ,  но при этом разрешена и продолжается работа таких модулей ,  как UART,  Аналоговый   Компаратор,  АЦП , USI- интерфейс ,  Таймеры / Счетчики ,  Сторожевой Таймер и Система Прерываний." - выдержка из datasheet.

Эта функция вызывается в бесконечном цикле, чтобы контроллер большую часть времени не работал впустую, а отдыхал.

 

void perecur(void)
{
MCUCR = 0b00100000;
#asm("sleep")
}

 

 Когда нужно еще более снизить токопотребление, применяют режим PowerDown.

"В этом режиме внутренний генератор останавливается,  в то время, как внешние прерывания,  такие,  как Определение Начала Передачи Данных по интерфейсу  USI   и Сторожевой Таймер,  продолжают работать  ( если,  конечно ОНИ разрешены ).  Вывести МК из этого режима могут только следующие прерывания:  Внешний Сброс,  Сброс от Сторожевого Таймера,  Сброс   BOD- схемой,  Прерывание от  USI- интерфейса при определении условия начала передачи данных,  изменением внешнего уровня сигнала на выводе   INT0  или прерывание на другом выводе,  служащим источником прерывания,  определенном пользователем."

Но это еще не все - в таком случае нужно предотвратить токовые утечки через выходы контроллера, иначе ток будет продолжать потребляться. Опять же, прямо в функции можно перевести порты в Z - состояние (высокоомный вход).

Этот режим можно задействовать, когда с датчика долго не поступает сигнал. Прерывание обычного таймера инкременирует переменную, и при достижении ей определенного порога (времени), запускается соответствующая функция.

 

void sleep(void)
{
MCUCR = 0b00110000;
PORTD=0x00;
DDRD=0x00;
PORTB=0x00;
DDRB=0x00;
#asm("sleep")
}

 

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

 


,






Еще статьи по теме


AVR запись и работа с eeprom
AVR и sd-карта. Библиотека avr-dos
Программатор для PIC, AVR и микросхем памяти
программатор apu-2
AVR DIP




Свежие статьи


Как сделать аппаратное сцепление
Педали для компьютера своими руками со сцеплением
Коробка передач для ПК своими руками
Светодиодный фонарик своими руками
Лабораторный блок питания на LM317 LM337 с предрегулятором



Главная



Комментарии (0)










Поиск