Нужно усыплять Atmega128 и пробуждать по таймеру timer0 25 раз. Делаю так:
Код
sleepmode:
//start timer0
TCNT0 = 0;
TCCR0 |= 0x07; //Set 1024 prescaler for timer0 and normal mode
TIMSK |= 0x01; //Enable interrupt from timer0 overflow
//set Sleep Enable bit
MCUCR |= 0x20;
asm("sleep");
//clear Sleep Enable bit
MCUCR &=~ 0x20;
//stop timer0
TCCR0 &=~ 0x07; //Switch off timer0
TIMSK &=~ 0x01; //Disable interrupt from timer0 overflow
timer_++;
if (timer_ < 25)
goto sleepmode;
Проблема: один раз мега нормально засыпает, просыпается по прерыванию, в обработчике бит Global_Interrupts сбрасывается и во второй раз процессор проснуться не может.
Вопрос: где поставить сакраментальное SEI (разрешить глобальные прерывания)? где бы я ни ставил (в пределах этого кода) это всегда приводит к тому что мега не спит! то есть после команды sleep она благополучно продолжает пахать! почему??
Сообщение отредактировал elusive - Feb 19 2013, 06:08