PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit Watchdog



mabuhay
28.01.2006, 19:05
Ich hab nun nach diesem Thema (https://www.roboternetz.de/phpBB2/viewtopic.php?t=16501) ein neues gestartet.

Ich hab nun mit dem Watchdog einen Periodischen Reset. Ich hab auch von http://www.interq.or.jp/japan/se-inoue/e_pic2_1.htm herausbekommen, dass im Statusregister das TO-Bit auf 0 gesetzt wird, wenn der Watchdog ausgelöst wird.

Hier ein Ausschnitt aus meinem Quellcode:


Init


btfss STATUS_TO ; Ist das TO-Bit im Statusregister nicht gesetzt, wurde der
goto reset ; Watchdog ausgelöst und die Initialisierung der Ports und
; des Timers wird übersprungen.

; 250 Hz-Timer-Interrupt einstellen
bsf STATUS, RP0 ; auf Bank 1 umschalten
movlw B'10001110' ; internen Takt zählen, Vorteiler für WDT verwenden
movwf OPTION_REG
bcf STATUS, RP0 ; auf Bank 0 zurückschalten
;bcf INTCON, T0IE ; Timer0 interrupt noch nicht erlauben


; Ports einstellen
BSF STATUS, RP0 ; auf Bank 1 umschalten

BCF T_ROT_OUT ; Port RA0 auf Ausgang schalten
BSF T_ROT_IN ; Port RA1 auf Eingang schalten
BSF T_WEISS_IN ; Port RA2 auf Eingang schalten
BCF T_WEISS_OUT ; Port RA3 auf Ausgang schalten
BCF T_STATUS_LED ; Port RA4 auf Ausgang

BCF TRISB, 0 ; Ausgang
BCF TRISB, 1 ; Ausgang
BSF TRISB, 2 ; Eingang IR-Empfänger
BCF TRISB, 3 ; Ausgang
BSF TRISB, 4 ; Eingang
BSF TRISB, 5 ; Eingang Schalter 1
BCF TRISB, 6 ; Ausgang
BCF TRISB, 7 ; Ausgang

BCF STATUS, RP0 ; auf Bank 0 zurückschalten



bcf STATUS_LED ; Anzeige Power-on-Reset OK
call Wait
bsf STATUS_LED
call Wait
bcf STATUS_LED
call Wait
bsf STATUS_LED
call Wait

goto reset


Hab ich dese Init-Routine, wird der Watchdog nur einmal ausgeführt, und zwar dann wenn ich den PIC an die Versorgungsspannung anschliesse. Also wenn ich die Sumulation mit MPLAB durchführe, funktionierts, lass ichs aber auf dem PIC laufen, funktionierts nicht (Das ausführen des resets zeige ich mit LED's an). Kommentiere ich aber die zwei Zeilen



btfss STATUS_TO ; Ist das TO-Bit im Statusregister nicht gesetzt, wurde der
goto reset ; Watchdog ausgelöst und die Initialisierung der Ports und
; des Timers wird übersprungen.

aus, wird der Watchdog wie gewünscht ausgelöst. Das Problem ist dann nur, dass (warscheindlich) beim Initialisieren der Ports irgendwelche Spannungsschwankungen, welche als Signal Interpretiert werden können, an den Ausgängen anliegen.
Ich hab auch schon versucht, den "; 250 Hz-Timer-Interrupt einstellen"-Teil in der reset-Subroutine zu platzieren, damit der Watchdog nach jedem auslösen wieder eingestellt wird, aber das hat auch nichts gebracht...

Noch eine Frage:
Wird beim Auslösen des Watchdog überhaupt etwas zurückgesetzt, oder wird das Programm einfach neu gestartet? Also, muss ich nach dem Watchdog-Interrupt die I/O's und Timer neu Initialisieren? [edit] wenn ich das Programm in MPLAB simuliere, sieht es so aus wie wenn die I/O's zurückgesetzt werden...

Hat mir vielleicht jemand eine Lösung für das Problem? hab schon den halbem Tag damit vertrödelt...

Vielen Dank

BigWumpus
25.02.2006, 19:40
Watchdogtimer...

Ich habe hier meine Erfahrungen mit den 16F876 gesammelt:

Der Watchdogtimer ist nach einem Reset mit einem Teiler (/256, wird auch bei Timer0 verwendet) versehen, der ihn ca. nach 2,5 Sekunden zuschlagen läßt.
Der PIC startet dann an der gleichen Stelle, wo er nach jedem anderen Reset auch anfängt, "ganz vorne".

Dort kann man anhand von Bits ablesen, woher der Grund für den Reset kam, POR (Power-On) oder TO (Watchdog).
Ja nach Art setzt der PIC bestimmte Bits oder nicht. Ein Watchdog-Reset ist eher ein Warmstart, der nicht alle Baugruppen zurücksetzt. Da gibt es aber ausführliche Dokumentationen für jedes Bit. Je nach Art kann man dann seine Register neu besetzen oder nicht, die Ausgabetreiber werden von einem WDT-Reset nicht umgeschaltet.

In der Routine, die er zu überwachen gibt, sollte man immer wieder der Watchdogtimer zurücksetzen, dafür gibt es den Befehl ClrWDT. Der löscht dann auch die TO-Bits im Statusregister.

Eigentlich ist dein Vorhaben trivial. Man muß sich nur damit beschäftigen!

Den eigenen Timer würde ich ganz wegwerfen, notfalls kannst Du den Teiler für den WDT kleiner setzen.

mabuhay
26.02.2006, 12:24
Mein Projekt liegt im moment gerade ein wenig auf der seite. Hab grade nicht mehr so lust zum basteln. Vielleicht kommt noch was in den nächsten zwei wochen (ferien ;) ).
Das einzige problem das ich mit dem Watchdog hatte, dass ich die Ein-/Ausgänge neu Initialisieren musste (soviel ich noch weiss) und es dann eben Spannungsschwankungen gab, welche dann vom einen Gerät als signal registriert wurden...
Das mit den Statusbits hab ich dann auch mal nach langem suchen rausgefunden... ^^

mfg