1 | #define F_CPU 8000000
|
2 | #include <avr/io.h>
|
3 | #include <avr/sleep.h>
|
4 | #include <avr/interrupt.h>
|
5 | #include <util/delay.h>
|
6 |
|
7 | // lange, variable Wartezeit, Einheit in Millisekunden
|
8 |
|
9 | void long_delay(uint16_t ms) {
|
10 | for (; ms>0; ms--) _delay_ms(1);
|
11 | }
|
12 |
|
13 |
|
14 |
|
15 | int main (void) {
|
16 |
|
17 | // IO konfigurieren
|
18 |
|
19 | DDRA = 0xFF;
|
20 | DDRB = 0xBF; // PB6 = INT0 = Eingang
|
21 |
|
22 |
|
23 | // Analogcomparator ausschalten
|
24 |
|
25 | ACSRA = 0x80;
|
26 |
|
27 | // Interrupt konfigurieren
|
28 |
|
29 | MCUCR &= ~0x3; // levelgesteuerter Interrupt an INT0
|
30 |
|
31 | // Interrupts freigeben
|
32 |
|
33 | sei();
|
34 |
|
35 | // Endlose Hauptschleife
|
36 |
|
37 | while(1) {
|
38 |
|
39 | GIMSK |= (1 << INT0); // externen Interrupt freigeben
|
40 |
|
41 | set_sleep_mode(SLEEP_MODE_PWR_DOWN);
|
42 | sleep_mode(); // in den Schlafmodus wechseln
|
43 |
|
44 | // hier wachen wir wieder auf
|
45 | GIMSK &= ~(1 << INT0); // externen Interrupt sperren
|
46 | // WICHTIG! falls der externe LOW Puls an INT0
|
47 | // sehr lange dauert
|
48 |
|
49 |
|
50 | PORTA |= (1 << PA5); // LED für eine Sekunde anschalten
|
51 | long_delay(1000);
|
52 | PORTA &= ~(1 << PA5);
|
53 |
|
54 | }
|
55 | }
|
56 |
|
57 | // externer Interrupt INT0
|
58 |
|
59 | // Die Interruptroutine kann leer sein, ABER sie muss existieren!
|
60 | // Sonst springt der AVR nach dem Aufwachen zum Reset, weil kein sinnvoller
|
61 | // Interruptvektor eingetragen ist!
|
62 |
|
63 | ISR(INT0_vect) {
|
64 | }
|