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




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


Часы на газоразрядных индикаторах ИН-8
Инфракрасный барьер своими руками
Светодиодное освещение - продолжение эволюции
Часы на газоразрядных индикаторах ИН-12 (Nixie Clock)
Светодиодное освещение своими руками



Главная



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











Мужской Проект

Подписка


Поиск