PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Watchdog auf best. Adresse?



Che Guevara
10.07.2011, 18:51
Hallo,

für meinen Tricopter möchte ich den Watchdog im ATMEGA328P benutzen. Allerdings stellt sich mir die Frage, ob (bzw. wie) man bei einem Neustart herausfinden kann, ob der WD den Reset ausgelöst hat?! Das wäre insofern wichtig, da der µC erst ca. 5sek nach Stromzufuhr startet, weil er in den 5sek versch. Initialisierungen macht! Wenn ich jetzt draußen Fliege und plötzlich startet der µC neu, dann muss ich diese Initialisierung überspringen, da der Tri sonst 5sek. im freien Fall Richtung Boden trudelt. Gibt es eine Möglichkeit, das abzufragen und evtl. noch VOR dem Reset in eine ISR zu springen? (Muss ich überhaupt Variablen sichern oder kann ich davon ausgehen, dass diese beim WD-Reset nachwievor die gleichen Werte haben?) Habe schon Google bemüht, aber nur heraus gefunden, dass es wohl bei den Tinys so eine Möglichkeit gibt, aber zu dem Megas habe ich nichts gefunden... Evtl. weiß da ja einer mehr, wäre toll :D

Gruß
Chris

021aet04
10.07.2011, 19:14
Musst du unbedingt den Controller resetten, wenn der WD anspricht? Könnte es reichen, wenn du einen Int auslöst und darauf reagierst. Laut DB des 328 gibt es 3 Modes des WD: System Reset, Interrupt und System Reset + Interrupt. Eventuell funktioniert es mit Mode 3 (System Rst und Int).

MfG Hannes

for_ro
10.07.2011, 19:55
Allerdings stellt sich mir die Frage, ob (bzw. wie) man bei einem Neustart herausfinden kann, ob der WD den Reset ausgelöst hat?!
Im Register MCUSR ist nach einem WD Reset das Flag WDRF gesetzt. Schau mal im Datenblatt.


Wenn ich jetzt draußen Fliege und plötzlich startet der µC neu, dann muss ich diese Initialisierung überspringen, da der Tri sonst 5sek. im freien Fall Richtung Boden trudelt.
Der WD löst ja normalerweise nicht aus, nur, wenn etwas Unvorhergesehenes passiert. Dann weißt du allerdings auch in der Regel nicht, in welchem Zustand sich der µC gerade befindet und von wo aus er in den Reset gegangen ist. Daher wäre die normale Reaktion, erst einmal die Initialisierungen durchzuführen. Wenn dies zu lange dauert, würde ich so eine Art Notbetrieb vorsehen, falls er sich gerade im Flug befindet. Und möglichst schnell wieder die Funksignale deiner Steuerung empfangen.


Gibt es eine Möglichkeit, das abzufragen und evtl. noch VOR dem Reset in eine ISR zu springen? Hat Hannes ja schon beschrieben.


(Muss ich überhaupt Variablen sichern oder kann ich davon ausgehen, dass diese beim WD-Reset nachwievor die gleichen Werte haben?)
Dies ist allerdings etwas gefährlich, da du nicht weißt, wo der "normale Betrieb" unterbrochen wurde.
Wie gesagt, ich würde versuchen möglichst schnell in einen definierten Zustand zu kommen. Kannst du feststellen, wie die Orientierung des Tricopters ist und in welche Richtung er sich bewegt?

uwegw
10.07.2011, 20:02
Den Reset-Grund kannst du in MCUSR herausfinden.

Was mit den Variablen passiert, hängt vom Compiler ab. Der AVR selbst behält beim Reset die Werte der Register und im SRAM (nur die IO-Register nicht), allerdings würden in einem C-Programm alle Variablen vom Compiler neu initialisiert.

Che Guevara
11.07.2011, 19:07
Hallo,

ok, ich seh mir mal genauer das DB an und entscheide mich dann für eine Möglichkeit.
Am besten wird es wohl sein, wenn ich im Falle, dass der WD bellt, in eine ISR springe, dort dann die wichtigsten Parameter (Offsets der Gyros, usw..) ins EEProm schreibe und dann einen Reset auslöse. Nach dem Start frage ich dann ab, ob der Reset vom WD kam und falls ja überspringe ich das Offset Berechnen und die Wartezeiten! Ich denke, das sollte so funktionieren.
Programmiert wird in Bascom, aber du hast Recht, sicher ist das nicht, sich darauf zu verlassen, dass die Variablen noch da sind nach einem Reset! Da doch dann die EEPromm Lösung...

Werds mir mal im DB ansehen und dann mal ein Testprogramm schreiben!

Gruß
Chris