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
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