Ich habe am PD2 (INT0) des ATmega32 (16MHz ext. Quarz) ein IR Empfänger.
Das empfangen funktioniert auch alles problemlos. Wenn ich aber in den
Sleep gehe und irgend etwas höheres als IDLE eingestellt habe (wollte
eigentlich POWER DOWN), dann wacht mein µC nicht mehr auf. Woran kann
das liegen?
1 | ...
|
2 | TCCR0 = 1<<CS02; // Teiler 256
|
3 | TIMSK = 1<<TOIE0; // Timer Interrupt freigeben
|
4 | GIMSK = (1 << INT0); // externen Interrupt freigeben, bei anderen µC "GICR"
|
5 | //MCUCR = (1 << ISC00)|(1 << ISC01); // steigende Flanke löst ext. Interrupt aus
|
6 | MCUCR = (1 << ISC01); // fallende Flanke löst ext. Interrupt aus
|
7 | ...
|
8 | ...
|
9 | sei(); // ISR aktivieren
|
10 | set_sleep_mode(SLEEP_MODE_PWR_DOWN);
|
11 | sleep_mode(); // in den Schlafmodus wechseln
|
12 | // hier wieder aufwachen bei ext. Interrupt
|
13 | GIMSK &= ~(1 << INT0); // externen Interrupt sperren, durch Timer werden jetzt alle 14 Bits eingelesen
|
14 | while(1)
|
15 | {
|
16 | ...
|
17 | ...
|
18 | GIMSK = (1 << INT0); // externen Interrupt freigeben, damit wieder aufgewacht werden kann
|
19 | set_sleep_mode(SLEEP_MODE_PWR_DOWN);
|
20 | sleep_mode();
|
21 | // hier wieder aufwachen bei ext. Interrupt
|
22 | GIMSK &= ~(1 << INT0); // externen Interrupt sperren, durch Timer werden jetzt alle 14 Bits eingelesen
|
23 | }
|
24 | ...
|
25 | ...
|
26 | ISR(INT0_vect) {
|
27 | // 3 Takte warten, dass Oszillator einschwingen kann
|
28 | //__asm volatile ("nop");
|
29 | //__asm volatile ("nop");
|
30 | //__asm volatile ("nop");
|
31 | DDRD|=(1<<PD6);
|
32 | PORTD^=(1<<PD6);
|
33 | }
|