Hallo,
Auf meinem µC (Tiny261) möchte ich den Watchdog benutzen.
in der Library Referenz
(http://www.nongnu.org/avr-libc/user-manual/group__avr__watchdog.html)
finde ich den Hinweis, dass bei jedem AVR, der Interrupts erzeugen kann,
der Watchdog beim Programmstart ausgeschaltet werden muss. Wieso ist
dies nötig?
Danke! Reto
Bisher habe ich in Programmen, die den Watchdog nicht benutzen, ihn auch
nie explizit ausgeschaltet.
Im Datenblatt steht für WDE allerdings ein X als initial Value.
Genaue Informationen, wann und ob überhaupt eine Resetquelle das WDE
löscht, konnte ich nirgends bei Atmel finden.
Schreib dochmal an Atmel, die sollen das endlich mal sagen.
Was ich gemerkt habe, das WDE-Bit wird nicht bei einem Watchdogreset
oder externen Reset gelöscht.
Peter
Peter Dannegger wrote:
> Schreib dochmal an Atmel, die sollen das endlich mal sagen.
Lies doch mal das Datenblatt genau, sie haben das gesagt.
Die Doku der avr-libc spiegelt das nur wider, was im Datenblatt schon
steht.
OK, ich gebe zu, dass ich es beim Umstieg von ATmega128 auf ATmega1281
seinerzeit auch auf die harte Tour lernen musste... Wer liest sich
schon Datenblätter so genau durch?
Jörg Wunsch wrote:
> Lies doch mal das Datenblatt genau, sie haben das gesagt.
Dann sag mir doch bitte, welches Datenblatt, welche Version, welche
Seite, welche Zeile oder Abbildung.
Ich kann nichts finden außer diesem blöden "Initial Value = X".
Und das ist ja wohl unter aller Sau.
Daraus könnte man höchstens indirekt schlußfolgern, das Bit ist immer
rein zufällig.
Ich vermute mal, das Verhalten ist bei ATtiny13 ... ATmega2561
identisch.
Dann gehörts aber auch in jedes dieser Datenblätter eindeutig
beschrieben und nicht durch die Blume.
Atmel:
"WDE is overridden by WDRF in MCUSR. This means that WDE is always set
when
WDRF is set. To clear WDE, WDRF must be cleared first. This feature
ensures multiple
resets during conditions causing failure, and a safe start-up after the
failure."
Das sagt nur aus, daß es nach einem Watchdogreset gesetzt ist, aber mehr
nicht.
Daß es auch nach einem externen Reset gesetzt bleibt, habe ich nur durch
Probieren gemerkt (beim ATmega168).
Ich hab die Watchdog-Fuse ein- und ausgeschaltet, aber trotzdem blieb
der Watchdog an. Erst nach Saft weg, war er aus.
Ist aber blöd, wenn man erst alles selber ausprobieren muß, weil es
nicht im Datenblatt steht.
Brownout habe ich noch nicht probiert.
Probieren heißt außerdem nicht, daß das Verhalten immer so ist.
Peter
Peter Dannegger wrote:
> Dann sag mir doch bitte, welches Datenblatt, welche Version, welche> Seite, welche Zeile oder Abbildung.
Das hängt natürlich vom konkreten Controller ab.
> Das sagt nur aus, daß es nach einem Watchdogreset gesetzt ist, aber mehr> nicht.
Mehr ist auch nicht.
> Daß es auch nach einem externen Reset gesetzt bleibt, habe ich nur durch> Probieren gemerkt (beim ATmega168).
Nur, wenn es zuvor durch einen Watchdog-Reset bereits gesetzt war.
> Ich hab die Watchdog-Fuse ein- und ausgeschaltet, aber trotzdem blieb> der Watchdog an. Erst nach Saft weg, war er aus.
Richtig. Ist, wenn man genau drüber nachdenkt, ein security feature.
> Ist aber blöd, wenn man erst alles selber ausprobieren muß, weil es> nicht im Datenblatt steht.
Doch, wie du eben zitiert hast. Es bleibt gesetzt, bis es explizit
(manuell!) gelöscht wird.
> Probieren heißt außerdem nicht, daß das Verhalten immer so ist.
Es ist immer so, das ist offensichtlich so gewollt. Alle *RF-Bits
akkumulieren in MCUSR, bis man sie manuell löscht.
PORF ist logischerweise eine Ausnahme: wenn man die Betriebsspannung
soeben erst zugeschaltet hat, und nicht in dem Moment bereits eine
andere Reset-Quelle aktiv war, dann ist PORF das einzige Bit, was
gesetzt ist.
>> Ich hab die Watchdog-Fuse ein- und ausgeschaltet, aber trotzdem blieb>> der Watchdog an. Erst nach Saft weg, war er aus.>Richtig. Ist, wenn man genau drüber nachdenkt, ein security feature.>> Ist aber blöd, wenn man erst alles selber ausprobieren muß, weil es>> nicht im Datenblatt steht.>Doch, wie du eben zitiert hast. Es bleibt gesetzt, bis es explizit>(manuell!) gelöscht wird.
Nein ist nicht richtig. Man kann es dann nicht manuell löschen.
Also:
- AVR unter Strom setzen
- WDTON Fuse setzen, nun kann man WDE nicht mehr löschen, ist auch so
beabsichtigt
- WDTON Fuse löschen, nun kann man WDE erst dann manuell löschen/setzen
wenn der AVR einmal ohne Saft war. Ein RESET, ISP, DebugWire-Reset alles
hilft nicht. Nach dem Löschen der WDTON Fuse muß der AVR erstmal ohne
Strom sein damit man das WDE auch wieder manuell löschen/setzen kann
unabhängig vom aktuellen Wert der WDTON Fuse.
Das steht so in keinem der Datenblätter der neueren AVRs, ich habe sie
fast alle danach durchsucht. HW war ATtiny461 und ATtiny45.
Ansich ist für mich ja eine Logik und Grund dahinter ersichtlich, aber
es sollte auch explizit in den Datenblättern kommuniziert werden.
Ich dachte nämlich das ich meinen AVR teilweise totgeflasht habe und es
dauerte 6 Stunden bis ich durch Zufall bemerkt habe das nach dem
Abschalten der Stromzufuhr alles wieder so funktionierte wie angenommen.
Man sitzt vor'm AVR Studio, ändert die WDTON Fuse wie ein Blödman,
verzweifelt, stutzt seinen Sourcecode bis nur noch der WatchDog-Code
drinnen ist, probiert jede Art der unteschiedlichen Reihenfolgen um das
fu.k WDE Bit endlich auf 0 zu bekommen, und das Mistvieh verhält sich
denoch weiterhin so als wäre die WDTON Fuse gesetzt. Wer kommt schon auf
die Idee die Stromzufuhr zu unterbrechen ?
Gruß Hagen