Hallo zusammen, Aufgabe :Watchdog Handling Problematik: Überwachung von drei Signale. Wenn eine der Signale nach eine bestimmte Zeit nicht dektiert wird, springt dann WDT und schaltet das Board aus (Reset). Dieses Vorgehen ist nicht Optimal. Es wäre besser, wenn eine Fehlermeldung geworfen wird (Wie z.B Signal 1 könnte nicht detektiert werden). Das ist zu Theorie Meine Fragen an euch: Ist dieses Vorgehen überhaupt möglich? Kann ich den WDT ausserhalb der main() Funktion auch steuern Sorry für die Fragen aber der Micokontroller Welt ist nue für mich und bin für jede Hilfe dankbar.
:
Verschoben durch User
Der Watchdog des PIC18F4550 kann den Controller nur reseten, ein Aufrufen einer ISR ist hier nicht möglich. Ich sehe spontan zwei Ansätze, die du verfolgen kannst: 1. Nach dem Start deines Programms ermittelst du die Ursache des Starts mithilfe von RCON. Ist RCONbits.TO == 0, dann war wohl ein Watchdog reset die Ursache. 2. Ersetze den Watchdog Timer gegen einen normalen Timer, der einen Interrupt auslöst. Dein Programm muss dann entsprechend auf den neuen Timer angepasst werden.
Little Basdart schrieb: > 2. > Ersetze den Watchdog Timer gegen einen normalen Timer, der einen > Interrupt auslöst. Dein Programm muss dann entsprechend auf den neuen > Timer angepasst werden. Danke erste mal für die Antwort. Die zweite Lösung ist besser. Ich kann dann einen Timer benutzen und dazu einen Count als hilfsvariable benutzen damit es eine Meldung rausgeworfen wird bevor einen Interrupt eintritt. Habe ich einen Denkfehler? danke
Ralph schrieb: > Habe ich einen Denkfehler? Ich denke, ja. xD Der Interrupt ist dein Freund, im Gegensatz zum Reset. Du willst ihn nicht vermeiden, sondern im Gegenteil, du willst ihn erzeugen! Ich stelle mir das in etwa so vor: Zurücksetzen des Timers voher:
1 | // reset des Watchdog Timers
|
2 | asm("CLRWDT"); |
nachher:
1 | // reset des "Watchdog" Timers
|
2 | TMR0H = 0; |
3 | TMR0L = 0; |
Zusätzlich eine Interrupt Service Routine:
1 | interrupt void Timer0Interrupt () { |
2 | // setze hier deine meldung ab
|
3 | // und führe eine Fehlerbehandlung durch
|
4 | }
|
Wie die ISR genau implementiert wird, musst du dein Compiler-Handbuch fragen. Natürlich muss der Interrupt auch eingeschaltet und konfiguriert werden! Genauso wie der genutzte Timer!
Ralph schrieb: > Hallo zusammen, > > > Aufgabe :Watchdog Handling > > Problematik: > > Überwachung von drei Signale. > Wenn eine der Signale nach eine bestimmte Zeit nicht dektiert wird, > springt dann WDT und schaltet das Board aus (Reset). > > Dieses Vorgehen ist nicht Optimal. Viel mehr ist der Code nicht optimal. Ein häufiger Anfängerfehler ist es, in einer Endlosschleife auf das Eintreten von Ereignissen zu warten, statt einen Zustandsautomaten zu implementieren, der Ereignisse und deren Behandlung entkoppelt. > Es wäre besser, wenn eine Fehlermeldung geworfen wird (Wie z.B Signal 1 > könnte nicht detektiert werden). Ich nehme mal an, dass du mit "Signal" einen Pegel (0 bzw. 1) oder eine Flanke(0->1 bzw. 1->0) meinst?! > Das ist zu Theorie > Meine Fragen an euch: > Ist dieses Vorgehen überhaupt möglich? Nein. Man prüft zyklisch, ob dieses Ereignis inzwischen eingetreten ist, ggf. unter Zuhilfenahme einer ISR, welche einfach ein Bit in einem bestimmten Register als Merker setzt. Braucht man eine Überwachung der Zeit, muss man zusätzlich prüfen, wie lange man schon auf das Ereignis wartet. Sinnvollerweise macht man das mit einem Timerinterrupt und einem Zähler, der in der ISR hoch oder runter gezählt wird. Der Zähler wird immer beim Eintreten des Ereignisses zurückgesetzt, und während des Wartens auf das Ereignis wird der Zählerstand überwacht. Das Ablaufen des Zählers ist ein weiteres Ereignis, was geprüft wird, und dessen Behandlung wäre dann die Ausgabe einer Fehlermeldung. > Kann ich den WDT ausserhalb der main() Funktion auch steuern Natürlich kann man das, und man muss es in längeren Unterprogrammen auch unbedingt tun. Sonst können diese nie bis zum Ende durchlaufen, weil der Watchdog-Reset dies verhindert. > Sorry für die Fragen aber der Micokontroller Welt ist nue für mich und > bin für jede Hilfe dankbar. Für Fragen muss man sich nicht entschuldigen, wenn man sich bemüht, sie ordentlich zu stellen. ;-)
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.