Hallo, ich wollte mal fragen ob sich hier jemand mit dem Watchdog
auskennt und mir sagen kann ob dieses Konstrukt so fehlerfrei
funktioniert (Die Funktion ist gegeben, es geht nur darum eventuelle
Fehler auszuschließen) :
1 | int main(void)
|
2 | {
|
3 | sei();
|
4 | set_sleep_mode(SLEEP_MODE_PWR_DOWN);
|
5 | while(1)
|
6 | {
|
7 | sleep_mode();
|
8 |
|
9 | if (intStatus > 0)
|
10 | {
|
11 | wdt_reset();
|
12 | WDTCR |= (1<<WDIE) | ( 1 << WDP1) | ( 1 << WDP2);
|
13 | }
|
14 | else wdt_disable();
|
15 |
|
16 | if ( intStatus == 3)
|
17 | {
|
18 | wdt_disable();
|
19 | intStatus = 0;
|
20 | }
|
21 | }
|
22 | }
|
23 | ISR(PCINT2_vect)
|
24 | {
|
25 | if ( PIND & ( 1 << PD2) ) intStatus++;
|
26 | }
|
27 |
|
28 | ISR(WDT_OVERFLOW_vect)
|
29 | {
|
30 | wdt_disable();
|
31 | intStatus = 0;
|
32 | }
|
Der Code wurde aus Gründen der besseren Lesbarkeit gekürzt.
Der Watchdog soll nun nach dem Auslösen der ISR(PCINT2_vect) nach einer
Sekunde in die ISR(WDT_OVERFLOW_vect) springen. Wenn noch keine Sekunde
zwischen dem zweiten bzw. dritten Auslösen der ISR(PCINT2_vect)
vergangen ist soll der Watchdog deaktiviert werden.
Da im Forum bereits das ein oder andere Problem mit dem Watchdog
gemeldet wurde, WDTCR ( laut Datenblatt übrigens WDTCSR ?! ) manuell
beschrieben wird, wäre es nett wenn jemand zur Sicherheit drüber schaut.