Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ATMEGA просыпание от поворота энкодера
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
freddd
Всем привет.
Возникла необходимость пробудить из спячки Atmega48 путем поворота энкодера.
Проблема в том, что в режиме SLEEP_MODE_PWR_DOWN внешние прерывания INT0 и INT1 срабатывают только в режиме низкого уровня. Мой энкодер с кнопкой. Каждый щелчек выводы энкодера A и B либо замыкаются с C либо разомкнуты. В принципе есть 3 варианта.
1. Сделать прерывание по низкому уровню => Запустить таймер и отключить прерывания => Затем считать энкодер по таймеру, заснуть включив внешнее прерывание. Но проблема в том что энкодер после вращения может остатся в положении, когда на INT0 будет в низком уровне(A B и С замкнуты) и прерывание будет продолжать срабатывать. Это не подойдет.
2. Засыпать в режиме SLEEP_MODE_IDLE, что позволяет прерывания на "Any logical change on INT0". Но при этом потребление в этом режиме увеличивается в сотни раз- 250-300 мкА. (делаю устройство с батарейным питанием). Этот вариант тоже не подходит.
3. Третий вариант нажимать на кнопку энкодера, пробуждая тем самым атмегу, а потом уже вращать энкодер. Но это как то не логично для пользователя нажимать а потом крутить..

Вот я теперь даже и не знаю какой есть путь решения данной проблемы wacko.gif
Или может у меня не стандартный энкодер?
kovigor
Цитата(freddd @ May 2 2012, 15:59) *
Вот я теперь даже и не знаю какой есть путь решения данной проблемы wacko.gif


Не знаю, что у вас за даташит, но в моем даташите на Мега48/88/168 написано, что она пробуждается из Power_Down в том числе и путем "pin change interrupt". Перечитайте даташит внимательнее ...
alag57
Цитата(freddd @ May 2 2012, 17:59) *
Всем привет.
в режиме SLEEP_MODE_PWR_DOWN внешние прерывания INT0 и INT1 срабатывают только в режиме низкого уровня

10.5 Power-down Mode
....Only an External Reset, a Watchdog System Reset, a Watchdog Interrupt, a Brown-out Reset, a 2-wire
Serial Interface address match, an external level interrupt on INT0 or INT1, or a pin change
interrupt
can wake up the MCU.

PD2 = PCINT18/INT0.
PD3 = PCINT19/OC2B/INT1.

Что мешает использовать PCINT?
freddd
Цитата(alag57 @ May 2 2012, 17:45) *
10.5 Power-down Mode
....Only an External Reset, a Watchdog System Reset, a Watchdog Interrupt, a Brown-out Reset, a 2-wire

Все верно, но ниже на 2 строки написано
"Note that if a level triggered interrupt is used for wake-up from power-down mode, the changed
level must be held for some time to wake up the MCU."
По логике ему не хватает времени проснуться. Пробовал выставить фьюзы
CKSEL=0010
SUT=00
Все равно не работает. sad.gif
Может есть какое-о внешнее решение.

UPD
Цитата(alag57 @ May 2 2012, 17:45) *
Что мешает использовать PCINT?

Спасибо, точно, с PCINT работает, а с INT0 нет.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.