Hallo Forum,
ich versuche jetzt schon seit Stunden bei einem mega2561 im Bootloader
den Watchdog zu deaktivieren, bekomme es aber irgendwie einfach nicht
hin. Ich hoffe hier kann mir jemand helfen. Ich benutze den ICCAVR.
Mein main Funktion beginnt folgendermaßen:
1 | void main(void)
|
2 | {
|
3 | CLI();
|
4 | wdt_off();
|
5 | ...
|
und die aufgerufene Funktion, die ich mittlerweile in Assembler
geschrieben habe, sieht so aus (vielleicht liegt hier irgendwo der
Fehler, da ich absoluter Assembler-Neuling bin):
1 | MCUSR = 0x54
|
2 | WDTCSR = 0x60
|
3 |
|
4 | ;-----------------------------------------
|
5 |
|
6 | _wdt_off::
|
7 | WDR
|
8 | LDS r16, MCUSR // clear WDRF in MCUSR
|
9 | ANDI r16, 0xf7 // r16 = MCUSR & ~(1<<WDRF)
|
10 | LDS r17, WDTCSR // set WDE and WDCE to 1
|
11 | ORI r17, 0x18 // r17 = WDTCSR | (1<<WDCE) | (1<<WDE)
|
12 | LDI r18, 0x00 // r18 = 0
|
13 | STS MCUSR, r16 // clear WDRF in MCUSR
|
14 | STS WDTCSR, r17 // 2 cycles set WDE and WDCE to 1
|
15 | STS WDTCSR, r18 // 2 cycles clear WDE and rest of WDTCSR
|
16 | RET
|
STS benötigt 2 Cycles (laut Datenblatt), so dass ich die geforderten 4
cycles zwischen dem Setzen von WDTCSR |= (1<<WDCE) | (1<<WDE) und dem
Löschen von WDE in WDTCSR meiner Meinung nach einhalte. Bei dem Code
habe ich mich an dem Beispiel im Datenblatt orientiert, und habe dieses,
nachdem es nicht funktioniert hat, noch gekürzt. Leider ohne Erfolg.
Ach so, mein WDTON-Fuse ist nicht gesetzt (im AVR-Studio ist kein Haken)
und ich bin mir ziemlich sicher, dass das ein Watchdog Problem ist. Wenn
ich nämlich eine Endlosschleife mit
einbaue, findet kein Reset mehr statt.
Viele Grüße,
Johannes