Gast
#491639
Hallo Forum, Ich habe ein problem mit dem ATmega8 im power down modus. nachdem der controller in den power down geschickt wurde, kann man den controller nicht mit dem pegelgetriggerten INT1 aufwecken. Sonderbar ist, daß der Controller aber mit der nächsten steigenden Flanke am INT1 wieder aufwacht. Ich habe ein kleines Program angeängt, das im prinzip mit einer LED winkt und danach in den sleep mode geht. Eine weitere LED zeigt an, sobald der IRQ ausgelöst wird. Habe ich irgend etwas übsersehen oder hat hat der Controller bei levelgetrigerten IRQ ein Problem? void go_idle(void); void go_power_down(void); /* ------------------------------------------------------------------------ - */ int main(void) { unsigned char timer0old=0,toggle; { hardwareInit(); odDebugInit(); DBG1(0x00, 0, 0); sei(); SET_LED2; timer0=0;//reset the timer which resets the LED's } for(;;) if (timer0 != timer0old) { timer0old=timer0; testloop++; if (testloop>4) { go_power_down(); testloop=0; // this command will be executed after power down and restart the cycle } } return 0; } /* ------------------------------------------------------------------------ - */ #define cbi(sfr, bit) ( sfr &= ~ _BV(bit)) #define sbi(sfr, bit) ( sfr |= _BV(bit)) void go_power_down(void) { //sbi (GIFR,INTF1); sbi (GICR,INT1); cbi (MCUCR,ISC11); cbi (MCUCR,ISC10); //Interrupt on low level triggered cbi (MCUCR,SM0); sbi (MCUCR,SM1); cbi (MCUCR,SM2); // configure the sleep mode to power down SM0,SM1,SM2=0,1,0 sbi (MCUCR,SE); //and start the sleep mode CLR_LED1; CLR_LED2; asm ("sleep"); cbi (MCUCR,SE); } INTERRUPT (SIG_INTERRUPT1) { char reg; timer0=0; //cli(); SET_LED1; SET_LED2; } INTERRUPT (SIG_OVERFLOW0) { static char t; if (t>=25) {timer0++; t=0; SET_LED2;} // delay to view the LED toggling else {t++; CLR_LED2;} }