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