TinyWD

Dies ist ein Watchdog für MCUs, die mit negativen Reset und 5V arbeiten. Beispielsweise die AVR oder Arduinos. Aber auch andere MCUs sind vorstellbar. Aufgebaut mit einem ATTiny84. Ziel ist es, eine vorhanden Controllerplatine nachträglich mit einem Watchdog auszustatten. Denn manchmal reicht der in den Chips eingebaute Watchdog nicht aus, bzw. ist nicht zuverlässig genug. So ist es mir bei meinem Tonnenpumpen Projekt ergangen. Der im ATTiny84 eingebaute Watchdog konnte den Controller nicht zuverlässig vor einem Einfrieren schützen. Immer wieder musste ich den Controller per Hand Resetten. Natürlich gibt es auch fertige Watchdogs, meist in Transistor oder DIP-8 Form. Doch die Beschaffung war schwierig und außerdem macht es doch Spass, sowas selber zu designen. Deswegen habe ich auf Basis des ATTiny85 diesen Hardware Watchdog gebaut, der auf einen normalen 6-Pol Programmierstecker aufgesteckt werden kann. Zunächst aber habe ich eine Variante für den Digispark entworfen, um die prinzipielle Funktionsweise zu testen.

Github Projekt: https://github.com/willie68/TinyWD

Digispark Version

Als erste Variante hab ich den Digispark ale Entwicklungsplatform benutzt.

Hier ist ein ATTiny85 verbaut mit einem Micronucleus Bootlaoder. Dieser simuliert über 2 Pins (3,4) ein USB Schnittstelle. Diese wird dann vom Host (PC) erkannt und man kann dann das Programm in den ATTiny hochladen.

Der Bootloader hat ich 2048 Bytes vom Flash reserviert. D.h. die Anwenderprogramm dürfen nicht mahr als 6KB haben.

Daneben gibt es noch weitere Einschränkungen. Für den Watchdog fand ich folgende Pin Zuordnung eigentlich optimal, da sie mit dem ISP korrosdondiert. Einzig der Reset Pin musste so auf einen anderen Pin gelegt werden. So ist auch die eigene Hardware gebaut. PB4 ist dabei für die visuelle Rückmeldung (LED) zuständig. Beim Digispark sind aber leider verschiedene Änderungen nötig. PB1 ist für die Onboard LED da. PB3 ist ein USB Data Pin und kann leider somit nicht als Reset Output funktionieren. Das Problem ist, bei einem Neustart setzt der Micronucleus Bootloader diesen Pin auf 0. Somit wird dann gesteuerte Controller ion den Resetmodus versetzt. Auch Pin 4 wird Ausgang benutzt. Bei der o.g. Beschaltung hängt sich dann aber der Bootlaoder auf, normalerweise startet der Bootloader nach 6 Sekunden das Anwenderprogramm (in unserem Fall den Watchdog) mit der äußeren Beschaltung tat er das aber nicht. Somit waren sowohl der Digispark wie auch der angeschlossene Controller geblockt. Deswegen gilt für den Digispark eine andere Pinbelegung.

PB0 ist ein WD Pin PB1 ist die LED PB2 ist der WDReset Pin PB3, PB4, PB5 werden nicht verwendet.

PCB Variante

Der Digispark ist zwar nett, aber eine eigenes PCB könnte man deutlich kleiner machen. Sowohl mit als auch ohne SMD Bausteine. Hier mal die fertige Platine: Verwendet wird ein ATTiny85 entweder als DIP oder auch als SO-8 Version. Der Watchdog ist so gebaut, daß er direkt auf den ISP gesteckt werden kann.

Steckerbelegung ISP:

ISPNameATTiny
1MISOPB1
2VCC+5V
3SCKPB2
4MOSIPB0
5ResetPB3
6GNDGND

Hier mal die fertige Platine:

Links ist die klassische Variante mit normalen Bauteilen, rechts die deutlich kleinere SMD Variante. (Der Chip wird auf der Unterseite montiert.)

Bestückt sieht die SMD Version so aus:

Und auf die Tonnenpumpeplatine aufgesteckt:

Hier der Schaltplan: Oben die normale Variante, unten die SMD.

Software

Die Software ist sehr einfach.

In void setup() setzte ich die Ein/Ausgänge entsprechend. Eingänge jeweils mit Pullup Widerstand. Zur Startsignalisierung blinkt einmal kurz die LED. Im nächsten Schritt werden für die Eingänge sog. PinChange Interrupts konfiguriert. D.h. ändert einer der Eingänge seinen Status, wird automatisch ein Interrupt ausgeführt. Dieseer steht in der Methode ISR (PCINT0_vect).

Als letztes erzeuge ich mir einen Timer, der automatisch alle 10 Sekunden feuert. Diese Routine setzt dann ein Flag, welcher in der void main() dann getestet wird. In der main wird auch ein Heartbeat Signal an die LED gesendet.

Funktionsweise

In der ISR wird einfach ein Variable namens changed auf true gesetzt. In der Hauptloop wird genau auf changed == true geprüft und dann der TImer resettet. Changed wird dann wieder auf false gesetzt und eine visuelle Rückmeldung gegeben. Fehlt länger als 10 Sekunden der Interrupt, weil sich kein Pin geändert hat, löst der Timer die Reset Methode aus. Diese legt den Resetpin für 1 Sekunde auf GND. Danach hat der angeschlossene Controller wieder 10 Sekunden Zeit, einen der Eingänge zu toggeln.

arduino/ohter/tinywd.txt · Zuletzt geändert: 2024/09/11 13:26 von admin
CC Attribution-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0