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
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.
..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..
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.