Hallo, wollte den Power Down modus nutzen. Habe den code aus dem Tutorial übernommen, für einen ATmega32. Setze das DDRD Register auf 226 (PD2=0) Eingang. PORTD 255. Nun falle ich in den Schlafmodus und komm nicht mehr raus. Habe am INT0 immer ein HIGH Pegel, bis ich diesen auf Masse lege. Der Code ohne die "sleep_mode();" Funktion wird einwandfrei ausgeführt, auch die INT0 Interrups. Woran könnte es liegen?
1 | MCUCR = (1<<ISC00);//any (falling) edge -> interrupt |
2 | PORTD=255; |
3 | DDRD=226;//INT0==0, input |
4 | ACSR = 0x80; // Analogcomparator ausschalten |
5 | |
6 | while(1) |
7 | {
|
8 | |
9 | GICR |= (1 << INT0); // externen Interrupt freigeben |
10 | |
11 | set_sleep_mode(SLEEP_MODE_PWR_DOWN); |
12 | sleep_mode(); // in den Schlafmodus wechseln |
13 | |
14 | // hier wachen wir wieder auf
|
15 | GICR &= ~(1 << INT0); // externen Interrupt sperren |
16 | // WICHTIG! falls der externe LOW Puls an INT0
|
17 | // sehr lange dauert
|
18 | _delay_ms(100); |
19 | sprintf(txbuf,"T%sSYNC",source_ID); |
20 | rf12_txmode(); |
21 | |
22 | tx_cnt=strlen(txbuf); // |
23 | uart_puts(txbuf); |
24 | uart_puts("\r\n"); |
25 | tx_status=0; // zu sendender Status |
26 | tx_packet(0); |
27 | } //while (1) |
28 | |
29 | ISR(INT0_vect) |
30 | {
|
31 | |
32 | external_int0=5;//send ID five times |
33 | |
34 | uart_puts("\t\t\tint0\r\n"); |
35 | }
|