Go Down

Topic: Interner Watchdog auch ohne Programmer (Read 834 times) previous topic - next topic

herbert-f

Hallo,

leider habe ich bisher nur Tipps gefunden, wie man den internen Watchdog mittels Programmer aktiviert.

Ich übertrage allerdings den CODE nur über die serielle Schnittstelle (USB). Kann ich auch hiermit den WATCHDOG nutzen?

Wenn ja, wie ...?  ;-)))))

DANKE

Herbert

jurs


leider habe ich bisher nur Tipps gefunden, wie man den internen Watchdog mittels Programmer aktiviert.

Ich übertrage allerdings den CODE nur über die serielle Schnittstelle (USB). Kann ich auch hiermit den WATCHDOG nutzen?

Wenn ja, wie ...?  ;-)))))


Das funktioniert genau so, wie es dokumentiert ist.
Und Du kannst einen Watchdog-Timeout auch in einem Sketch aktivieren, den Du per Bootloader hochgeladen hast.

ABER:  Wenn Du per Bootloader uploaden möchtest, dann mußt Du SEHR VORSICHTIG sein, dass Du nur die längeren Watchdog-Timeouts aktivierst und keine sehr kurzen.

Grund: Watchdog-Timeouts überstehen einen Reset des Programms, das den Watchdog-Timer eingerichtet hat, der Watchdog-Timer läuft weiter, auch wenn danach der Bootloader startet. Und da der Watchdog-Timer nicht weiter bedient wird, kann es sein, dass schon im Bootloader der nächste Watchdog-Timeout zum nächsten Reset des Controllers führt, ohne dass der Bootloader mit dem Uploaden eines neuen Sketches fertig ist, der dann sobald er gestartet ist, den Watchdog-Timer außer Kraft setzen könnte.

Mit einem zu gering gesetzten Watchdog-Timeout kannst Du Dich von Deinem Arduino so aussperren, dass Du hinterher nur noch mit einem Programmer, aber nicht mehr mit einem Bootloader ein anderes Programm draufgeladen bekommst und der Arduino ist in einer Boot-Endlosschleife, in der immer während der Bootloader läuft der nächste Watchdog-Reset den Controller neu starten läßt.

Also höchste Vorsicht beim Experimentieren mit Watchdog-Timeouts, wenn Du keinen Programmer hast!

Besser: Erst einen Programmer besorgen, dann mit Watchdog-Timeouts experimentieren.

herbert-f



leider habe ich bisher nur Tipps gefunden, wie man den internen Watchdog mittels Programmer aktiviert.

Ich übertrage allerdings den CODE nur über die serielle Schnittstelle (USB). Kann ich auch hiermit den WATCHDOG nutzen?

Wenn ja, wie ...?  ;-)))))


Das funktioniert genau so, wie es dokumentiert ist.
Und Du kannst einen Watchdog-Timeout auch in einem Sketch aktivieren, den Du per Bootloader hochgeladen hast.

ABER:  Wenn Du per Bootloader uploaden möchtest, dann mußt Du SEHR VORSICHTIG sein, dass Du nur die längeren Watchdog-Timeouts aktivierst und keine sehr kurzen.

Besser: Erst einen Programmer besorgen, dann mit Watchdog-Timeouts experimentieren.


Vielen Dank, ich werde mir einen Programmer "sicherheitshalber" besorgen. Kann mir bitte jemand einen Tipp geben wo ich die oben erwähnte Dokumentation für Watchdog-Timeout per Bootloader für den MEGA2560 finden kann?

Danke

jurs


Vielen Dank, ich werde mir einen Programmer "sicherheitshalber" besorgen. Kann mir bitte jemand einen Tipp geben wo ich die oben erwähnte Dokumentation für Watchdog-Timeout per Bootloader für den MEGA2560 finden kann?


Oh, ich sehe gerade, dass das sehr gute Tutorial auf http://tushev.org/articles/electronics/48-arduino-and-watchdog-timer aus dem Internet verschwunden ist. So ein Pech! Mußt Du halt andere Infos im Internet suchen.

Die AVR libc hat drei Funktionen und einige Konstanten sind, die man benötigt, um Watchdog-Timer möglichst komfortabel einzurichten:
http://www.nongnu.org/avr-libc/user-manual/group__avr__watchdog.html

Soweit ich das in der Library-Beschreibung sehe, reicht es aber nicht, das Watchdog-Timeout auf den längsten Wert 8s zu setzen, damit man hinterher noch genügend Zeit hat, dass ein Bootloader läuft und man dann in seinem Sketch einen Bootloader auch wieder deaktivieren kann. Grund: Zwar wird der Watchdog durch ein Reset nicht deaktiviert, aber sein Prescaler wird auf den kleinsten Wert von 15ms resettet. So dass aus einem 8s Watchdog-Timeout beim Reset ein 15ms Watchdog-Timeout wird.

Man kann dann den Watchdog nur innerhalb von 15ms nach einem Reset wieder deaktivieren.

Und das geht nur, wenn man entweder per Programmer einen Sketch hochladen kann, in dem man beim Programmstart ein wdt_disable() aufrufen kann. Oder man hat einen Bootloader drauf, der einen Code verwendet, um beim Start des Bootloaders eventuell vorhandene Watchdogs löscht.

Und da beißt sich die Katze in den Schwanz: Auch einen geänderten Bootloader, der einen vorhandenen Watchdog-Timer beim Start des Bootloaders löscht, kannst Du nur mit Programmer aufspielen. Genauso wie einen Sketch, der einen vorher eingerichteten Watchdog löscht. Also kommst Du ohne Programmer wohl nicht weiter, wenn Du nicht die Unbenutzbarkeit Deines Arduinos nach dem Watchdog-Experiment riskieren möchtest.

Die modernen 0,5 kB kleinen Arduino-Bootloader haben meines Erachtens keinen Code mehr drin, um einen Watchdog zu löschen. Alles für die kleine Bootloadergröße wegoptimiert.

Udo Klein

Wenn der Arduino von der Stromversorgung getrennt wird, dann werden danach wieder die Watchdogeinstellungen der Fuses gezogen. Also "höchste Vorsicht halte ich dann doch für etwas übertrieben. Im schlimmsten Fall muß er das Teil vom USB Bus abstecken und 10 Sekunden warten. Danach hat sich das wieder.
Check out my experiments http://blog.blinkenlight.net

Go Up