Forum: Mikrocontroller und Digitale Elektronik PIC18F4550 WDT Handling


von Ralph (Gast)


Lesenswert?

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
von Little B. (lil-b)


Lesenswert?

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.

von Ralph (Gast)


Lesenswert?

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

von Little B. (lil-b)


Lesenswert?

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!

von Michael L. (michaelx)


Lesenswert?

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