Forum: Compiler & IDEs ATmega88: Wie WatchDog deaktivieren?


von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Hi, ich hab grad Huddel mit einem ATmega88 dem dauernd der Watchdog ins 
Bein beisst...

Zu Beginn von main() steht ein
1
    wdt_disable();

und der Code der da erzeugt wird sieht gut aus. Ich hab sogar R1 
ausdrucken lassen um sicher zu sein, daß wirklich die 0 drinne ist.

Nach dem Disable steht in WDTCSR eine 0x08, d.h. WDE=1 (Sheet 10.9.2 pp. 
54).

WDE lässt sich also nicht zurücksetzen.

Fuses sind die Werkseinstellungen, also

LFUSE = 0x62
HFUSE = 0xdf (d.h. HFUSE.4=WDTON=1 also "unprogrammed": Sheet 27.2, pp. 
297)

Damit müsste sich laut der Beschreibung auf Seite 55 der WDT doch 
deaktivieren/stoppen lassen?

WDTON=1, WDE=0, WDIE=0 --> Mode=Stopped, Action on Tomeout=None

Aber das Schreiben der 0 nach WDE in der timed sequence wird 
irgnoriert...

Hat jemand nen Tipp? Die Errata sagen nix dazu, oder wo steh ich da aufm 
Schlauch?

Danke,

Johann

von Frank (Gast)


Lesenswert?

Hallo

beim Mega644 gehts so. Vielleicht ist das beim Mega88 auch der Trick.

  MCUSR=0;
  wdt_disable();

Wenn einen die Reset-Quelle interessiert, dann das MCUSR in eine 
Variable schreiben.

Gruß,

Frank

von SF (Gast)


Lesenswert?

Aus der Erklärung zum WDE bit im Datenblatt:
1
WDE is overridden by WDRF in MCUSR. This means that WDE is always set when
2
WDRF is set. To clear WDE, WDRF must be cleared first. This feature ensures
3
multiple resets during conditions causing failure, and a safe start-up after
4
the failure

Es ist also wichtig immer, (also auch wenn man den Watchdog gar nicht 
benötigt!), das WDRF Bit in MCUSR zu löschen. Das steht so auch irgendwo 
im Datenblatt.

Das Löschen des Bits kann man auch in eine .init Section packen. Das hat 
den Vorteil, das es früher aufgerufen wird als main(). Im 
avr-libc-usermanual gibt es dafür ein Beispiel.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

SF wrote:
> Aus der Erklärung zum WDE bit im Datenblatt:
>
1
> WDE is overridden by WDRF in MCUSR. This means that WDE is always set
2
> when
3
> WDRF is set. To clear WDE, WDRF must be cleared first. This feature
4
> ensures
5
> multiple resets during conditions causing failure, and a safe start-up
6
> after
7
> the failure
8
>

Jo, aber wer setzt denn das WDRF?
Wenn noch kein WDR auftrat, ist doch WDRF nach dem Reset gleich 0. ZB 
nach PowerOn-Reset (was ich auch versucht hatte).

Jedenfalls geht's jetzt, war wohl ein WDRF-Flag irgendwo hängen 
geblieben nach dem Proggen, dabei wird ja MCUSR nicht gelöscht.

Danke :-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.