AVR Урок 54. Режимы пониженного энергопотребления. Часть 2

 

 

 

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

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

Для этого давайте сначала разберёмся с регистрами системы Power Management.

 

Первый регистр — SMCR (Sleep Mode Control Register)

 

 

Разберём побитно.

SM2:SM0 (Sleep Mode Select): биты выбора режима, который будет использоваться.

Варианты комбинаций можно посмотреть в данной таблице

SE (Sleep Enable): бит включения режима пониженного энергопотребления.

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

Следующий регистр — MCUCR (MCU Control Register) — регистр управления контроллером (MCU)

 

 

Хотя биты данного регистра не сильно связаны с режимами пониженного энергопотребления, но мы некоторые из них использовать в данном занятии всё же будем, поэтому разберём также и их.

Первые два бита относятся к системе контроля за корректной работой микроконтроллера BOD (Brown-out detection).

BODS (BOD Sleep): отключает систему BOD во время перехода микроконтроллера в режим пониженного энергопотребления при записи в него 1. Запись в бит BODS контролируется временной синхронизацией и битом разрешения BODSE. Чтобы отключить BOD в соответствующих режимах сна, оба бита BODS и BODSE должны быть сначала установлены .Затем в BODS должен быть записан 1, а BODSE должен быть сброшен в 0 в течение четырех тактов. Бит BODS активен в течение трёх тактов после его установки. Инструкция отключения должна выполняться, пока BODS активен, чтобы отключить BOD для режима ожидания. Бит BODS автоматически очищается после трех тактов.

BODSE (BOD Sleep Enable): позволяет установить бит управления BODS, как описано в описании бита BODS. Отключение системы BOD управляется временной синхронизацией.

PUD (Pull-up Disable): Отключает возможность подтяжки внутренних резисторов сразу на всех портах. По умолчанию он находится в 0, а если мы его установим в 1, то подтягивающие резисторы мы использовать не сможем.

IVSEL (Interrupt Vector Select): выбор вектора прерываний. Если установлен данный бит, то векторы прерываний перемещаются в начало загрузочного сектора флэш-памяти. В этом случае к адресу каждого вектора прерывания из таблицы прибавляется стартовый адрес загрузочного сектора флэш-памяти. Фактический адрес начала раздела Boot Flash определяется фьюзами BOOTSZ. Чтобы избежать непреднамеренных изменений таблиц векторов прерываний, необходимо выполнить специальную процедуру записи, чтобы изменить бит IVSEL

  1. Установить бит разрешения изменения вектора прерывания (IVCE).
  2. В течение четырех машинных циклов внести изменение (записать 1 или 0) в IVSEL, при этом записывая лог.0 в IVCE.

При выполнении данной последовательности прерывания будут автоматически отключены. Они отключаются во время установки IVCE и останутся отключенными до перехода к инструкции, следующей за инструкцией записи в IVSEL. Если IVSEL не записан, то прерывания будет находиться в отключенном состоянии 4 такта синхронизации. Состояние бита 1 в регистре статуса не затрагивается при автоматическом отключении прерываний.

Примечание : Если векторы прерываний помещаются в загрузочный сектор и бит защиты загрузочного сектора BLB02 запрограммирован, то прерывания будут отключены при выполнении программы в секторе выполнения программы. Если векторы прерываний размещены в секторе выполнения программы и бит защиты BLB12 запрограммирован, то прерывания становятся отключенными при выполнении программы в загрузочном секторе.

По умолчанию данный бит очищен.

IVCE (Interrupt Vector Change Enable): бит разрешения изменения вектора прерывания. Данный бит должен быть установлен, чтобы разрешить изменение бита IVSEL. IVCE очищается аппаратно через четыре цикла после его установки или при установке бита IVSEL. Установка бита IVCE отключит прерывания, как описано в описании IVSEL выше.

 

 

Следующий регистр — PRR (Power Reduction Register) — регистр снижения мощности. Хотя мы в данном занятии биты данного регистра никак не затрагиваем, но познакомиться с ним, я считаю, мы обязаны, так как он тоже входит в систему Power Management

 

 

Теперь побитно.

PRTWI0 (Power Reduction TWI0): бит отключения модуля TWI0.

1 — модуль выключен

0 — модуль включен.

PRTIM2 (Power Reduction Timer/Counter 2): бит отключения модуля таймера-счётчика 2.

1 — модуль выключен

0 — модуль включен.

PRTIM0 (Power Reduction Timer/Counter 0): бит отключения модуля таймера-счётчика 0.

1 — модуль выключен

0 — модуль включен.

PRTIM1 (Power Reduction Timer/Counter 1): бит отключения модуля таймера-счётчика 1.

1 — модуль выключен

0 — модуль включен.

PRSPI0 (Power Reduction Serial Peripheral Interface 0): бит отключения модуля SPI0.

1 — модуль выключен

0 — модуль включен.

PRUSART0 (Power Reduction USART0): бит отключения модуля USART0.

1 — модуль выключен

0 — модуль включен.

PRADC (Power Reduction ADC): бит отключения ADC.

1 — модуль выключен

0 — модуль включен.

Непосредственно переход в режим пониженного потребления происходит по ассемблерной команде «sleep«.

На этом пока, думаю, теории нам хватит, давайте потихоньку переходить к практике.

Схема урока такая

 

 

Схема простейшая. Тактирование используем внешнее с частотой 16 мегагерц с помощью кварцевого резонатора. Ещё у нас подтянут резистор от контакта RESET к питанию, для того, чтобы обеспечить там устойчивый уровень, и подключена к данной ножке кнопка для возможности перезагрузки контроллера. Ещё одна кнопка подключена к контакту INT0 для того, чтобы выводить контроллер из спящих режимов. И ещё подключены 10 светодиодов с токоограничивающими резисторами к некоторым ножкам портов, чтобы удобно было следить за работой программы.

Схему мы соберём на макетной плате. Я не стал её собирать на серьёзной плате, так как не факт, что именно такая схема нам будет требоваться всегда, поэтому выбрал именно такое решение. Также к схеме был к соответствующим ножкам подключен программатор и выведены провода для измерения тока потребления контроллером с помощью мультиметра

 

 

Когда нам не надо будет измерять ток (например во время процедуры прошивания, хотя, в принципе, можно прошивать и с милиамперметром), то можно контакты подключения милиамперметра перемкнуть

 

 

Подключим программатор к ПК, запустим среду разработки MPLAB X, пока работаем с ней, хочется потестировать (если у вас такого желания нет, можете также использовать, как и раньше Atmel Studio).

Проект мы за основу возьмём из прошлого занятия с именем WDT01 и присвоим ему новое имя LP_MODES.

Как для MPLAB X из готового проекта сделать другой, не испортив исходный с той целью, чтобы не создавать всё заново, можно посмотреть в уроке 4 по PIC.

Откроем наш проект в среде MPLAB X, сделаем его главным.

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

Для этого достаточно подключить соответствующий хедер-файл, который мы с помощью директивы include и подключим в файле main.h

 

 

В файле main.c удалим глобальную переменную счёта тиков таймера

 

unsigned char tim1_count=0;

 

Очистим тело обработчика прерываний от кнопки

 

TIMSK1 &= ~(1<<OCIE1A);

 

Обработчик прерываний от таймера ISR(TIMER1_COMPA_vect) удалим полностью вместе с телом.

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

 

 

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

 

Предыдущая часть Программирование МК AVR Следующая часть

 

 

Программатор (продавец надёжный) USBASP USBISP 2.0

 

 

Смотреть ВИДЕОУРОК (нажмите на картинку)

 

AVR Режимы пониженного энергопотребления

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*