Aufwachen nach Sleep-Mode

Gast #5226161
Lesenswert?

Hallo!
Bin gerade dabei, mit einem ATmega168 einen Wecker zu implementieren. 
Der uC ist die meiste Zeit im Power-Safe-Modus und wird 60 mal pro 
Sekunde durch einen Timer2-Overflow-Interrupt aufgeweckt, der die 
verstrichene Zeit erfasst und ggf. den Weckeralarm auslöst.
Zusätzlich kann der uC mit einem Taster-Interrupt (PCINT0) aufgeweckt 
werden.

Ich verstehe nun nicht so ganz, wie das Aufwachen genau abläuft. Also 
was passiert, wenn der uC schlafen gegangen ist, ich irgendwann den 
Taster drücke und die ISR durchgelaufen ist.
Springt der uC danach dorthin, wo er vorher schlafen gegangen ist (dh. 
an Label1 in Z.8), oder geht er nach der ISR direkt wieder schlafen? 
Oder läuft die main()-Schleife von vorne durch?

Hier der relevante Teil des Codes:
1
int main(void) {
2
  sei(); //Interrupts einschalten
3
  while(1) {
4
    _delay_ms(1000);
5
    set_sleep_mode(SLEEP_MODE_PWR_SAVE);
6
    sleep_enable();
7
    sleep_mode();
8
    //Label1
9
    getNewEntry();
10
  }
11
}
12
ISR (PCINT0_vect) {
13
  set_led(1);
14
  _delay_ms(1000);
15
  set_led(0);
16
}
Schöne Grüße, Johnny W
#5226189
Lesenswert?

Er bleibt wach.

Statt sleep_mode(); sollte man besser sleep_cpu(); benutzen, da 
sleep_mode(); eine race condition bewirken kann.

Und set_sleep_mode(SLEEP_MODE_PWR_SAVE); sleep_enable(); reicht einmal 
nach dem Reset, die Bits setzen sich nicht von alleine zurück.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren