-
        

Ergebnis 1 bis 3 von 3

Thema: Problem mit Watchdog

  1. #1

    Problem mit Watchdog

    Anzeige

    Ich hab nun nach diesem Thema (http://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:
    Code:
    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
    Code:
    		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

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    09.07.2005
    Ort
    Hangover
    Alter
    51
    Beiträge
    45
    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.

  3. #3
    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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •