Forum: Mikrocontroller und Digitale Elektronik AtMega128 Prozessüberwachung


von Jörg (Gast)


Lesenswert?

Hallo Forum,
ich habe erst vor kurzem angefangen mich mit der Welt der AtMega 
Controller hobbymäsig zu beschäftigen. Dabei ist ein Programm 
entstanden, welches den seriellen Datenstrom einer GPS Maus ausließt, 
verarbeitet und auch auf MMC speichert. Soweit sogut.
Jetzt möchte ich, dass der Controller sich selbst überwacht. Er soll 
nicht ewig in seiner Empfangsroutine hängen bleiben, wenn das GPS nichts 
sendet, sondern sagen wir mal einen Zeitansatz bekommen. Ist diese Zeit 
vorbei, soll er selbst erkennen, woran er gescheitert ist und eine 
Fehlermeldung hinterlegen.
Beim anschauen der Interrupts im Datenblatt, ist mir der Watchdogtimer 
ins Auge gefallen. Der sorgt aber ja nur dafür, dass sich der Controller 
reseted. Also, wonach soll ich als Nächstes gucken? Gibt es da eine 
andere Methode die mir noch nicht eingefallen ist, oder gar 
Codebeispiele in GCC?
Danke & Gruß
Jörg

von Hauke R. (lafkaschar) Benutzerseite


Lesenswert?

Der Watchdog bringt dir hier nicht viel, da du dann ja nicht erkennen 
kannst, woran es lag (ok du kannst sehen, dass es ein watchdog reset 
war, mehr aber auch nicht, zumindest nicht ohne sinnlosen aufwand)

Ich würde einfach einen der Hardware timer (mit passendem vorteiler) 
hernehmen, im überlaufinterrupt eine Variable hochzählen. Dann legst du 
noch ne variable an, die dann als timeout fungiert, wenn der wert der 
timer variable größer ist als der timeout, dann aufgeben und 
entsprechende fehlermeldung ausgeben.
Natürlich musst du bei jedem neustart der empfangsroutine z.b. die 
Zählervariable zurücksetzen.

von Jens P. (jmoney)


Lesenswert?

..oder wenn du viel Zeit hast (bzw. der Controller nix zeitkritisches zu 
tun hat), kannst du auch jede Routine zuerst mal eine Flashzelle 
beschreiben lassen. Dann den Watchdog einschalten und fertig. Flash 
schreiben dauert halt ein paar Takte. Sind bei AVR aber IIRC gar nicht 
mal so viele.
Flash und nicht SRAM, weil das SRAM nach nem Watchdog-Reset gelöscht 
wäre.
Flash und nicht EEPROM, weil das Flash mindestens um den Faktor 10 
länger hält und du hast ja wahrscheinlich vor, deine Routinen öfter 
auszuführen. Das Problem der Haltbarkeit kann man in den Griff kriegen, 
wenn man nicht immer die selbe Flash-Zelle beschreibt, sondern nach 
jedem Schreiben inkrementiert. Da ein Pointer auf die jeweils aktielle 
Zelle wieder eine einzelne Zelle belasten würde, musst du auch noch 
einen Zähler dazu packen. Dann kann man beim Starten rekonstruieren, 
welche Routine zuletzt wohin geschrieben hat, dass sie gestartet wurde.

Der Preis für den Komfort des Watchdogs, der sich um alles kümmert, ist 
also ein ziemliches Gefrickel. Haukes Vorschlag ist da schöner, wenn gut 
implementiert..

von Jörg (Gast)


Lesenswert?

Danke erstmal!
Ich denke, ich werde mal versuchen Haukes Vorschlag zu implementieren. 
Wenn ich den Watchdog mit dem Flash schreiben benutzen würde um fest zu 
stellen, woran der Controller gescheitert ist, würde ich zwar wissen, 
was nicht geklappt hat aber auch die letzten Positionsdaten verlieren.
Falls noch jemand andere Vorschläge oder gar Codebeispiele hat, immer 
her damit.
Gruß
Jörg

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.