Hallo In der Schlaufe legt sich der uC gleich schlafen. Mit INT0 wird er wieder geweckt. Nun läuft der Code in der ISR jedoch zwei mal ab. Warum?
1 | /* |
2 | IC: ATmega8 |
3 | */ |
4 | |
5 | #define F_CPU 3686400UL |
6 | #include <avr/io.h> |
7 | #include <util/delay.h> |
8 | #include <avr/sleep.h> |
9 | #include <avr/interrupt.h> |
10 | |
11 | // global variable to count the number of overflows |
12 | volatile uint8_t tot_overflow; |
13 | |
14 | void goSleep() |
15 | { |
16 | set_sleep_mode(SLEEP_MODE_PWR_DOWN); |
17 | GICR |= (1 << INT0); // enable external interrupt |
18 | sleep_enable(); |
19 | sleep_cpu(); |
20 | sleep_mode(); |
21 | sleep_disable(); |
22 | GICR &= ~(1 << INT0); // disable external interrupt here, in case the external low pulse is too long |
23 | } |
24 | |
25 | int main(void) |
26 | { |
27 | DDRB |= (1 << PB0); // Setzen Output |
28 | DDRB |= (1 << PB1); // Setzen Output |
29 | DDRB |= (1 << PB2); // Setzen Output |
30 | PORTC |= (1 << PC1); // Setzen PulUp Eingang |
31 | PORTD |= (1 << PD2); // Setzen PulUp Eingang |
32 | |
33 | MCUCR &= ~((1 << ISC01) | (1 << ISC00)); // INT0 fallende Flake |
34 | sei(); |
35 | |
36 | while(1){ |
37 | PORTB |= (1 << 1); // led ein |
38 | goSleep(); // schlafen |
39 | } |
40 | } |
41 | |
42 | ISR(INT0_vect) |
43 | { |
44 | PORTB &= ~(1 << 1); // led aus |
45 | PORTB &= ~(1 << 2); // led aus |
46 | _delay_ms(200); |
47 | PORTB |= (1 << 2); // led ein |
48 | _delay_ms(200); |
49 | PORTB &= ~(1 << 2); // led aus |
50 | _delay_ms(200); |
51 | PORTB |= (1 << 2); // led ein |
52 | _delay_ms(200); |
53 | PORTB &= ~(1 << 2); // led aus |
54 | } |
Danke