Hallo Wissende,
ich habe eine (gut getestete, elektronische Probleme schließe ich aus)
Schaltung, in der ein auf 14,7456 MHz getakteter ATMega644 läuft. Nun
möchte ich den Watchdog nutzen, und zwar mit einem Timeout von 2
Sekunden. Dazu habe ich nach Studium des Datenblatts folgenden Code
vorbereitet:
1 | void initWatchdog(void) {
|
2 | uint8_t sregTmp;
|
3 |
|
4 | /* disable interrupts */
|
5 | sregTmp = SREG;
|
6 | CLI();
|
7 | WDR();
|
8 |
|
9 | MCUSR = 0x00; // Clear all reset flags previously set.
|
10 |
|
11 | //Step 1: Enable the Watchdog Enable Change Bit (WDCE)
|
12 | WDTCSR |= (1 << WDCE) | (1 << WDE);
|
13 | //Step 2: Enable Watchdog, set timeout to 2.0s
|
14 | WDTCSR |= (1 << WDE) | (1 << WDP2) | (1 << WDP1) | (1 << WDP0);
|
15 |
|
16 | SREG = sregTmp ; /* restore interrupts */
|
17 | }
|
Der Watchdog funktioniert auch wunderbar, und ich kann ihn mit
asm("wdr") zurücksetzen. Leider ignoriert er den Prescaler und resettet
den µC nach einer sehr kurzen Zeit von wenigen Millisekunden. Andere
Prescaler-Einstellungen führen zum selben Ergebnis. Was mach ich falsch?
Viele Grüße
Tim