@ Marcel H. (Gast)
>ich nicht die Sache mit dem Dauersignal zu verarbeiten...ich bin einfach
>zu blöd
Wo ist denn das große Problem?
Lad mal das Beispiel aus dem Artikel auf deinen AVR und probiers aus.
Wie bereits gesagt muss man sich darauf einigen, dass das Aufwecken mit
LOW passiert, geht nun mal nicht anders. Wenn der AVR wieder wach ist,
nudelt der solange in der Hauptschleife, bis INT0 wieder auf High geht.
Knackpunkt ist lediglich, dass man halt beim Aufwachen den INTo erstmal
ausschalten muss, sonst gibt es Dauerinterrupts. Ist auch schon im
Beispiel drin! Etwa so.
1 | // Endlose Hauptschleife
|
2 |
|
3 | while(1) {
|
4 |
|
5 | if (PIND & (1<<PD2)) { // INT0 ist wieder HIGH
|
6 | GICR |= (1 << INT0); // externen Interrupt freigeben
|
7 |
|
8 | set_sleep_mode(SLEEP_MODE_PWR_DOWN);
|
9 | sleep_mode(); // in den Schlafmodus wechseln
|
10 |
|
11 | // hier wachen wir wieder auf
|
12 | GICR &= ~(1 << INT0); // externen Interrupt sperren
|
13 | // WICHTIG! falls der externe LOW Puls an INT0
|
14 | long_delay(20); // Entprellung
|
15 | }
|
16 |
|
17 | // irgendeinen Unsinn machen
|
18 |
|
19 | PORTD |= (1 << PD5); // LED für eine Sekunde anschalten
|
20 | long_delay(1000);
|
21 | PORTD &= ~(1 << PD5);
|
22 | long_delay(1000);
|
23 | }
|
24 | }
|
Das Entprellen passiert hier quasi durch das Aufwachen, denn das wird
wie ein Power-On Reset verzögert. Siehe Abschnitt Morgenmuffel. Hier
sollte man per AVR Fuses einen hohen Wert einstellen, 28ms sind
nicht falsch. Wenn man mit dem interen RC-Oszillator arbeitet, bei dem
solche langen Wartezeiten nicht einstellbar sind, muss man halt im
Programm warten.
MfG
Falk