Пробуждение AVR для внешнего прерывания и немедленное чтение USART - PullRequest
0 голосов
/ 07 июля 2019

Я нахожусь в странной ситуации с ATMega2560 .

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

На USART1 у меня есть внешний контроллер, который отправляет сообщения в AVR.Но когда используется USART1, я не могу использовать INT2 и INT3 для внешнего прерывания (= ЦП не активируется).

Поэтому у меня была идея отключить USART1 прямо перед этим.переход в режим PowerDown и включение INT2 в качестве внешнего прерывания.

Псевдокод для этого:

UCSR1B &= ~(1<<RXEN1); //Disable RXEN1: let AVR releasing it
DDRD &= ~(1<<PD2); //Make sure PortD2 is an input - we need it for waking up
EIMSK &= ~(1<<INT2); //Disable INT2 - this needs to be done before changing ISC20 and ISC221
EICRA |= (1<<ISC20)|(1<<ISC21); //Rising edge on PortD2 will generate an interrupt and wake up the AVR from PowerDown
EIMSK |= (1<<INT2); //Now enable INT2

//Sleep routine
cli();
sleep_enable();
sei();
sleep_cpu();
sleep_disable();

В ISR для INT2 я изменяю все обратно на USART1.

Псевдо:

ISR(INT2_vect) {
  EIMSK &= ~(1<<INT2); //Disable INT2 to be able to use it as USART1 again
  UCSR1B=(1<<RXEN1)|(1<<TXEN1)|(1<<RXCIE1);
}

Однако, похоже, потребуется много времени, чтобы USART1 снова заработал правильно.В начале слишком много неисправных битов (после пробуждения из PowerDown).

Насколько это хак?Есть ли какой-нибудь разумный способ ускорить изменение?

Основная идея состояла в том, чтобы установить для порта 'RX' прерывание, которое может разбудить процессор, а затем немедленно изменить его обратно на USART и обработать его как можно скорее.

PS: Мне действительно нужно использовать один и тот же контакт для этой цели, другой доступной опции нет.Поэтому руководство по использованию некоторых других выводов не будет принято в качестве ответа.

1 Ответ

1 голос
/ 08 июля 2019

Режим выключения питания отключает генератор, поэтому вы должны ждать стабильного генератора после пробуждения.Пожалуйста, ознакомьтесь с таблицей данных на странице 51:
When waking up from Power-down mode, there is a delay from the wake-up condition occurs until the wake-upbecomes effective. This allows the clock to restart and become stable after having been stopped. The wake-upperiod is defined by the same CKSEL Fuses that define the Reset Time-out period, as described in “ClockSources” on page 40.
Вам нужно подождать до 258 тактовых циклов, если вы используете высокоскоростной керамический генератор (см. Таблицу 10-4 на странице 42).

Вы можете использовать режим ожидания.Если вы используете внешний генератор, процессор переходит в режим ожидания, который идентичен режиму выключения, но генератор не останавливается.Кроме того, вы можете установить Power Reduction Register для дополнительных опций энергосбережения.Другой вариант - использовать расширенный режим ожидания, который идентичен режиму энергосбережения.Этот режим отключает генератор, но генератор включается в течение шести тактов.

...