Подписаться на получение новых статей на почту:

Спящий (ждущий) режим AVR. Режимы, команды и библиотеки. Шаг №36

Всем привет. Как вы помните в прошлой статье мы описали пример использования двух ведущих на линии а также режимы ведомого передатчика. Как я и писал в этой статье рассмотрим виды спящих(ждущих) режимов их аппаратную настройку, библиотеки и функции для программного запуска и применим его к нашему примеру из предыдущего поста. Используем режим Power Down и «пробуждение» по прерыванию по сравнению адреса по TWI. Как обычно протестируем в симуляторе и железе на примере использования интерфейса TWI для передачи данныхДавайте все по порядку.

Что такое спящий режим? В первую очередь он создан для экономии питания батареи. Это очень весомая мотивация, при нехватке ресурсов. Так же за счет разновидности спящего режима можно также отключать разнообразную периферию на МК. В разных моделях микроконтроллеры поддерживают 3...6 режимов(это я про ATtiny and ATmega):
Idle (Ждущий режим). В этом режиме останавливается тактирование ЦПУ микроконтроллера и Flash. Выйти из этого режима можно по внешнему и внутреннему прерыванию. Преимущества: быстрая реакция на события. Недостаток самый прожорливый из спящих режимов.

ADC Noise Reduction (Режим снижения шумов АЦП). Отключается тактирование ЦПУ, Flash, подсистемы ввода/вывода. !!!При включенном АЦП преобразование начинается сразу же после перехода в этот спящий режим. «Разбудить» можно прерыванием по совпадению адреса по интерфейсу TWI, внешним прерыванием (обнаруживаемого асинхронно), прерывание от EEPROM и прерывание от АЦП.

Power Down (режим микро потребления). Отключаются все внутренние тактовые сигналы. Продолжают работать только асинхронные модули. Выход из этого режима можно прерыванием по совпадению адреса по интерфейсу TWI, внешним прерыванием (обнаруживаемого асинхронно). Задержка включения тактового генератора, по событию, определяется конфигурационными ячейками, которые определяют задержку сброса микроконтроллера. Т.е. смотрите ячейки CKSEL0, SUT1, SUT0.

Power Save (Режим ожидания). Аналогичен Power Down. За исключением того что если таймер/счетчик МК поддерживает работу в асинхронном режиме, сконфигурирован для работы в этом режиме, то он будет работать во время сна МК. Для выхода добавляется еще и прерывание о таймера/счетчика.

Standby (режим ожидания) – доступен только при использовании генератоора с внешним резонатором. Аналогичен Power Down, за исключением того что тактовый генератор продолжает функционировать. Переход в рабочий режим происхлдит за 6 машинных циклов .

Extended standby (расширенный режим ожидания). Также используется с внешним резонатором. Аналогичен Power Save. Пробуждение также происходит быстрей за 6 машинных циклов.

!!! Кроме всего из всех режимов можно выйти в результате сброса: аппаратного, от сторожевого таймера и от схемы управления питанием BOD.

Теперь перейдем конкретно к настройке. Как говорилось выше настройки зависят от модели контроллера. Мы используем ATmega8. Для управления спящим режимом этого контроллера и некоторых его сородичей используется регистр MCUCR. (смотри даташит). Данный регистр управляет не только спящим режимом но и внешним прерыванием. Поэтому используем только последние 4-ри разряда. Рисунок ниже.

MCUCR - управление спящим режимом

Разряд SE – отвечает за разрешение перехода в режим пониженного энергопотребления. Само переключение происходит по комманде SLEEP, к ней мы вернемся ниже. Разберем остальные разряды SM2, SM1, SM0 - они отвечают за выбор режима. Ниже рисунок таблицы

SM - выбор спящего режима

скажу сразу что последнего режима в ATmega 8 – нет. Для своего устройства я выбрал режим Power Down.

Настройка будет выглядеть очень просто:

MCUCR=(1<<SE)|(0<<SM2)|(1<<SM1)|(0<<SM0);

Как говорилось выше «уложить спать» контроллер можно специальной коммандой sleep. Используя Winavr мы можем использовать ассемблерную вставку:

asm (“sleep”);

Либо встроенную библиотеку <avr/sleep.h> - разобраться в ней не составит труда. В ней находятся все неастройки. Описаны все макроопределения.

Я выбрал первый вариант. Итого настройка и включение будем выглядеть следующим образом

MCUCR=(1<<SE)|(0<<SM2)|(1<<SM1)|(0<<SM0); asm(“sleep”);

Для выхода из данного режима сна будем испотльзовать прерывание по совпадению адреса по интерфейсу по TWI. Как правило не будем сильно утомлять внимание, поэтому применение режима сна и тестирование программы перенесем в следующий пост а именно пробуждение ведомого по адресу из режима Power Down, передача даных ведущему и опять погружение в сон. На этом все. Всем пока.

Просмотрено 8745 раз.

Я на Google+

Спящий (ждущий) режим AVR. Режимы, команды и библиотеки. Шаг №36: 3 комментария

  1. При выходе из спящего режима выполняется подпрограмма обработки прерывания и выполняется программа с команды, следующей после команды sleep. Если во время режима пониженного энергопотребления поступает сигнал сброса, то центральный процессор выходит из спящего режима и продолжает выполнение программы с команды, расположенной по адресу $000 в области команд.

    • Ну да при прерывании естественно выполняется следующая комманда за sleep. А вот после сброса не всегда может быть адресс 000, например уменя могут быть изменены конфигурационные ячейки BOOTRST, BOOTSZ1,0

  2. В системе Ардуино с процессором Atmega 32u4 регистр режимов сна — SMCR имеет биты того же наименования. Опыт показывает, что режим IDLE и ADC не выполняются, процессор не останавливается, остальные режимы ОК!

Добавить комментарий

Ваш e-mail не будет опубликован.

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Subscribe without commenting