Я нахожусь в странной ситуации с 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: Мне действительно нужно использовать один и тот же контакт для этой цели, другой доступной опции нет.Поэтому руководство по использованию некоторых других выводов не будет принято в качестве ответа.