AtMega128 Prozessüberwachung

Gast #451019
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
Persönliche Seite #451022
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.
#451045
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..
Gast #451268
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.