Обсуждаем контроллеры компании Atmel.
Ответить

CVAVR, режим SLEEP, прошу помощи.

Ср апр 11, 2018 16:32:01

Приветствую! Не могу решить казалось бы простую задачу.
Имеем:
- Контроллер ATMega 644PA (так же проверялось на 644А)
- Часовой кварц на тактирование таймера 2
- Контроллер тактируется кварцем 8МГц, выставлен фьюз CKDIV8, т.е. тактовая 1МГц.
- Режим энергосбережения: Power-save
- Компилятор CodeVisionAVR 2.05.3 и 3.12
Необходимо:
- Максимальное энергосбережение (длительное батарейное питание).
- Получать 3 прерывания OCR2A, OCR2B, T2OVF с частотой 32Гц. Контроллер проснулся по OCR2A, дернул одной ногой, уснул. Проснулся по OCR2B, дернул другой ногой, уснул. Проснулся по T2OVF, изменил счетчик, уснул.
Реализация:
- Т2 работает постоянно, прерывание OVF включено постоянно. Делитель частоты кварца PCK/2. Получаем прерывания 128 раз в секунду. Ставим счетчик на переменной от 0 до 3. На каждое 3е значение счетчика разрешаем прерывания OCR2A и OCR2B. В остальные значения счетчика прерывания по совпадению запрещены.
Проблема:
- Не срабатывают прерывания OCR2A и OCR2B, или следуют сразу после T2OVF, т.е. не в свое время. Если закомментировать #asm("sleep"), то всё работает как нужно.
Попытки исправить:
- Менял фьюзы, не уверен что выставлено правильно ибо понимаю не до конца. Стоит кварц на 8Мгц, но так же фьюз делителя на 8, т.е. тактовая 1 МГц. Соответственно какой фьюз выставить, на 1 или 8Мгц? Пробовал CKSEL3..0 111, 110,101. Разницы не заметил. Далее CKSEL0 и SUT1..0. Пробовал разные варианты. По даташиту CKSEL нужно ставить в 1, т.к. у меня crystal oscillator, а не ceramic resonator. При выборе ceramic потребление ниже, зато с применением SLEEP прерывания OCR2A и OCR2B “колбасятся” влево-вправо. Видимо таймер останавливается или сбивается. Не понимаю как такое может происходить. При изменении на crystal стабильность на порядок лучше, но теряются или некорректно отрабатываются прерывания OCR2A и OCR2B.
- Пытался сбрасывать флаги прерываний OCR2A и OCR2B. В результате они могли просто не появляться или же опять срабатывать не постоянно, а через раз.
- Менял режим энергосбережения. В IDLE таких проблем нет. Если закомментировать SLEEP то всё так же работает как надо.

Работаю в железе. Протеус не использую. Результат смотрю осцилографом.
Читал даташит. Каких-то явных ограничений не увидел. Контроллер должен просыпаться от любого из прерываний Т2. Сильно прошу не пинать, программирование не моя сфера, но есть желание разобраться. И прежде чем написать сюда много раз читал документацию и форумы. Явного решения не увидел. Да и мало кто с энергосбережением заморачивался.
Отвечать смогу только по вечерам, так как на работе интернета нет и все коммуникации запрещены…

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

Исходный код:


Осциллограммы:

Re: CVAVR, режим SLEEP, прошу помощи.

Ср апр 11, 2018 18:13:58

Так как вы используете
Код:
#include <sleep.h>
то с начало выполняется команда
Код:
sleep_enable();
далее тот режим который вам нужен, к примеру
Код:
powersave();
, в файле sleep.h список доступных режимов, все мк заснул, после выхода из спячки начнется прерывание, после выхода из прерывания мк будет находится за командой
Код:
powersave();
, после этой команды следует указать строки
Код:
          //Запись пустого значения в регистр управления:
         TCCR2A=0x00;
         TCCR2B=0x01;
         //Ожидание завершения обновления TC2:
          while (ASSR & ((1 << TCN2UB)|(1 << OCR2AUB)|(1 << TCR2AUB)));                       
Без этой записи TCCR2A и TCCR2B будет иметь непредсказуемые значения.
Полный код

Re: CVAVR, режим SLEEP, прошу помощи.

Ср апр 11, 2018 18:58:08


Благодарю! Поэкспериментирую.
Но разве Таймер 2 не является асинхронным, чтобы какраз не зависеть от тактирования ядра? Я к тому, что каким образом изменяется настройка TCCR2A и TCCR2В до/после выхода в режим энергосбережения?

Re: CVAVR, режим SLEEP, прошу помощи.

Ср апр 11, 2018 22:59:43

1. В асинхронном режиме настройки регистров обновляются после сброса флажков UB. Вне зависимоси от режимов энергосбережения. Процесс синхронизации асинхронных регистров для корректного доступа(например чтение) после обновления требует несколько тактов таймера Т2.
2. Внимательно изучите раздел Asynchronous Operation of Timer/Counter2 и следуйте описанным там алгоритмам работы с асинхронными регистами. Это позволит избежать полного зависания контроллера в режимах сна. В частности, необходимо выдерживать определённый интервал времени перед повторным уходом в глубокий сон.
3. В режиме сна кварцевый генератор отключается. При пробуждении генератор включается. На запуск требуется некоторое время, которое зависит от добротности резонатора, фузов и прочих факторов. Я бы ориентировался на интервал 10-100 миллисекунд для вч кварца. Вы выбрали частоту прерываний 32-128 раз в секунду. Таким образом, контроллер может просто не упевать отработать все произошедшие события.
4. Для максимального энергосбережения по причине п.3 лучше применять внутренний RC генератор.

Re: CVAVR, режим SLEEP, прошу помощи.

Чт апр 12, 2018 07:34:54

Вот мои замеры потребления тока
С тактированием от кварца 32768Гц
При желании можно получить потребляемый ток МК 18-56 мкА в активном режиме(не забудьте про регистр PRR, можно отрубить практически все модули кушающие питание).

Re: CVAVR, режим SLEEP, прошу помощи.

Чт апр 12, 2018 11:33:51

В тексте не видно отключение аналогового компаратора. Уточню, регистр PRR0 отключает/включает тактирование периферийных модулей.
Потребление в POWER DOWN ATmega644PA стоящего на столе макета < 2мка, включая потребление стабилизатора MC78LC30HT1.

Re: CVAVR, режим SLEEP, прошу помощи.

Чт апр 12, 2018 20:47:16

Dimon456 писал(а):Полный код

Это помогло, но не до конца.
Столь низкое потребление это конечно хорошо. Но приведенная задача является лишь основой алгоритма. На самом деле всё гораздо обширнее и понижение тактовой частоты ниже 1 МГц не допустимо. Хотя раньше так же пробовал эти режимы и делал замеры :) Спасибо Вам за Ваши замеры.

Внимательно изучите раздел Asynchronous Operation of Timer/Counter2

Да, почему-то я этот раздел обошел стороной, но переход на RC частично решил проблему.

akl писал(а):В тексте не видно отключение аналогового компаратора.

Да, он отключен. Текст приведен в "порезанном" виде. Так все нулевые инициализации от кодвизарда в оригинале конечно сохранены.

Про регистр PR посмотрю, спасибо за наводки.
Режим POWER DOWN к сожалению не могу использовать, так как он не пробуждается от таймера, а мне конкретно в этой поделке нада :)

На сегодняшний вечер благодаря Вашим советам итог таковой: Результат достигнут предложенными методами. На текущем этапе прошивка работает корректно. Не исключаю, что по мере её нарастания могут всплыть проблемы с энергосбережением.
Благодарю за помощь всех откликнувшихся!
Ответить