Forum: Mikrocontroller und Digitale Elektronik Aufwachen nach Sleep-Mode


von Johnny W. (Gast)


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

von S. Landolt (Gast)


Lesenswert?

aus dem Datenblatt:

"... and resumes execution from the instruction following SLEEP"

von Peter D. (peda)


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.

von Johnny W. (Gast)


Lesenswert?

Danke!
Wie sähe die Sache aus, wenn ich direkt in der jeweiligen ISR den uC 
wieder schlafen schicken würde? Läuft die ISR dann nach dem erneuten 
Aufwachen quasi noch zuende?

von Peter D. (peda)


Lesenswert?

Johnny W. schrieb:
> Wie sähe die Sache aus, wenn ich direkt in der jeweiligen ISR den uC
> wieder schlafen schicken würde?

Schlecht.
Aufwachen geht nur mit Interrupts enabled.

von S. Landolt (Gast)


Lesenswert?

Das ginge zwar, indem man vor das sleep ein sei schreibt, aber nicht 
lange, recht bald läuft der Stack über.

von S. Landolt (Gast)


Lesenswert?

> Läuft die ISR dann nach dem erneuten Aufwachen quasi noch zuende?
Nein, woher sollte sie die nötige Information haben?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.