реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> ATMEGA просыпание от поворота энкодера
freddd
сообщение May 2 2012, 12:59
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 13-07-11
Пользователь №: 66 213



Всем привет.
Возникла необходимость пробудить из спячки 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
Или может у меня не стандартный энкодер?
Go to the top of the page
 
+Quote Post
kovigor
сообщение May 2 2012, 13:41
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



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


Не знаю, что у вас за даташит, но в моем даташите на Мега48/88/168 написано, что она пробуждается из Power_Down в том числе и путем "pin change interrupt". Перечитайте даташит внимательнее ...
Go to the top of the page
 
+Quote Post
alag57
сообщение May 2 2012, 13:45
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 130
Регистрация: 26-06-06
Из: Березовский
Пользователь №: 18 355



Цитата(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?
Go to the top of the page
 
+Quote Post
freddd
сообщение May 2 2012, 21:03
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 13-07-11
Пользователь №: 66 213



Цитата(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 нет.

Сообщение отредактировал freddd - May 2 2012, 21:03
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th June 2025 - 14:51
Рейтинг@Mail.ru


Страница сгенерированна за 0.01383 секунд с 7
ELECTRONIX ©2004-2016