PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit Servosignalmessung mit PIC 16F630



pointhi
01.09.2009, 07:36
Gleich mal, die Signalmessung von signalen mit einer Länge von 1ms - 2ms funktioniert problemlos mit den PIC16F630. Wenn ich das Proramm aber mit einen anderen verbinde, gibt es plötzlich probleme. Bei diesem Programm geht es um eine neues unterprogramm, dass die Signalzeit auf dem Port RA,5 auslesen soll, und je nachdem, ob ein signal vorhanden ist, und ob dieses High or Low bedeuten soll, in die Variable PWM Schreiben soll. Die messung, ob ein signal vorhanden sei, passiert, indem man in 0,1ms takt eine Variable von der Zahl 24 um 1 kürzt, und wenn dann noch immer kein Signal vorhanden ist, dass auch ausgibt. Ansonsten wartet man, bis dass Signal wieder verschwindet, und Startet , nachdem dass Signal wieder aufgetreten ist, eine 1,5ms lange Zeitschleife. WEnn dann dass Signal noch immer da sit, wird High ausgegeben, sonst Low. dann waret dass Programm nur noch, bis dass Signal Low ist, schreibt das entsprechende in das Register PWM, und die Haupschleife wertet dann dass Signal aus. Und irgendwo ist ein Fehler versteckt.




;************************************************* *****************************
; Dateiname: Standartprogramm
; Autor: Thomas Pointhuber
; Datum: 23.01.2009
; Version: 1.01
;
; Letzte Änderung: keine
;
;************************************************* *****************************
; Funktionsbeschreibung des Programms: Das Programm ist zur Steuerung der SignalLEDs zuständig.
; dabei werden die PINs RC2 und RC3 an RC0 und an RC1 Gespiegelt
;
; Programmablauf: 1 ON: RC, 0;1;2;3;4
; OFF:
; 2 ON: RC, 4
; OFF: RC, 0;1;2;3
; 3 ON: RC, 0;1;2;3
; OFF: RC, 4
; 4 ON:
; OFF: RC, 0;1;2;3;4
;
;************************************************* *****************************
list p=16F630 ; "list" Anweisung zur Definition des Prozessors
#include <p16f630.inc> ; Einbinden von speziellen zum Controller gehörenden Variablen über die Datei *.inc

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF & _CPD_OFF
;
; '__CONFIG' Diese Anweisung wird benutzt, um das Configurations-Word innerhalb des *.asm Datei einzubinden.
; Weitere Informationen zum Configurations-Word können auch dem Datenblatt entnommen werden.
; Die mit einem Sternchen * markierten Optionen sind ausgewählt worden.
;
; CP: Code Protection bit
; * OFF = Program Memory code protection is disabled
; ON = Program Memory code protection is enabled
; WDT: Watchdog Timer Enable bit
; ON = WDT enabled
; * OFF = WDT disabled
; BODEN: Brown-out Detect Enable bit
; * ON = BOD enabled
; OFF = BOD disabled
; PWRTE: Power-up Timer Enable bit
; OFF = PWRT disabled
; * ON = PWRT enabled
; MCLRE: GP3/MCLR pin function select
; ON = GP3/MCLR pin function is MCLR
; * OFF = GP3/MCLR pin function is digital I/O
; CPD: Data Code Protection bit
; * OFF = Data memory code protection is disabled
; ON = Data memory code protection is enabled
; Oscillator Variationen:
; LP_OSC = Low power crystal on GPIO4 and GPIO5
; XT_OSC = Crystal/resonator on GPIO4 and GPIO5
; HS_OSC = High speed crystal/resonator on GPIO4 and GPIO5
; EC_OSC = I/O function on GPIO4 pin, CLKIN on GPIO5
; * INTRC_OSC_NOCLKOUT = I/O function on GPIO4 pin, I/O function on GPIO5
; INTRC_OSC_CLKOUT = CLKOUT function on GPIO4 pin, I/O function on GPIO5
; EXTRC_OSC_NOCLKOUT = I/O function on GPIO4 pin, RC on GPIO5
; EXTRC_OSC_CLKOUT = CLKOUT function on GPIO4 pin, RC on GPIO5
;
;
ERRORLEVEL -302 ; Unterdrücken BANK SELECTION MESSAGES, dazu das ; Semikolon links entfernen
; ; Dies unterdrückt im Compiler die Nachricht "Register in operand not in bank 0. Ensure that bank bits are correct"
;
;************************************************* ****************************
; Deklaration der Variablen und Konstanten
;************************************************* *****************************
;
schleife EQU H'0020' ; Anzahl der "schleifen"
help EQU H'0021' ; Hilfsvariable für verschiedene Aufgaben. Achtung der Inhalt wird nie gerettet!
sekunde EQU H'0022' ; Variable für die Einerstelle der Zahl
leuchten1 EQU H'0023' ; Variable für die Tabelle LED_PORTA
leuchten2 EQU H'0024' ; Variable für die Tabelle LED_PORTC
help2 EQU H'0025' ; Hilfsvariable
help3 EQU H'0026' ; Hilfsvariable
PWM EQU H'0027' ; Gibt an ob dass PWM Signal auf 1 oder 0 ist, und ob ein Signal besteht
;************************************************* *****************************

org 0x000 ; Startadresse des PICs
goto EINSTELLUNGEN
;************************************************* *****************************
; INTERRUPT
org 0X004 ; Startadresse der ISR
retfie ; Beenden der ISR, zurück zum Programm

;************************************************* *****************************
; PIC***** Einstellungen
EINSTELLUNGEN
bsf STATUS,RP0 ; Auswahl Bank 1
movwf OSCCAL ; Neuladen der Kalibrirungswerte für den internen Takt

movlw B'00111000' ; 1=Eingang, 0=Ausgang
movwf TRISA

movlw B'00000000' ; 1=Eingang, 0=Ausgang
movwf TRISC

bcf STATUS,RP0 ; Zurück zu Bank 0

clrf PORTA ; Löschen aller Ausgänge
clrf PORTC ; Löschen aller Ausgänge
clrf INTCON ; Dekavieren eines Interuptes


;************************************************* ************************
; HAUPTPROGRAMM
START
movlw B'11111111'
movwf PORTC

movlw B'00000010' ; Schaltet den Gelben LED 1 Sekunde ein
movwf PORTA
call PAUSE1s
clrf PORTA
clrf PORTC
ANFANG

call PAUSE1s
movlw B'00000001' ; Schaltet Nacheinander mit 1 Sekunde verspätung die Drei LEDs ein
movwf PORTA
call PAUSE1s
movlw B'00000101'
movwf PORTA
call PAUSE1s
movlw B'00000111'
movwf PORTA
call PAUSE1s
clrf PORTA

PWMTEST
clrf PORTA
call PWM_TEST

btfss PWM,1
goto TEST2

movlw B'00000111'
movwf PORTA
goto PWMTEST
TEST2
btfss PWM,0
goto TEST3

movlw B'00000110'
movwf PORTA
goto PWMTEST
TEST3
btfss PWM,2

movlw B'00000011'
movwf PORTA
goto PWMTEST
;************************************************* ************************
; Tabellen

LED_PORTC_MODIEA
addwf PCL,1
retlw D'0' ;+0
retlw B'00000011' ;+1
retlw B'00000010' ;+2
retlw B'00000001' ;+3
retlw B'00000000' ;+4


LED_PORTC_MODIEB
addwf PCL,1
retlw D'0' ;+0
retlw B'00000011' ;+1
retlw B'00000010' ;+2
retlw B'00000000' ;+3
retlw B'00000000' ;+4

;************************************************* ************************
; UNTERPROGRAMM
PAUSE01ms ; Label, wo die Standardwarteschleife beginnt
movlw D'19' ; Dezimalwert für die Zeitkonstante damit PAUSE = 1ms ist
movwf schleife ; Schieben des Wertes 199 in die Variable "schleife"
; Ende der Start-Einstellungen für "PAUSE1ms"

PAUSEEE ; Einsprungstelle für Pausenschleifen
nop
nop ; Taste nicht gedrückt, springe zur Marke "HAUPT" DECFSZ schleife,1
decfsz schleife,1 ; Dekrementiere die Variable "schleife" um 1 und schreibe das Ergebnis zurück in "schleife"
goto PAUSEEE ; Ist die Zeit verstrichen? Nein, dann springe zurück zu "PAUSEE"
; Neuer Durchlauf bis "schleife" = 0
return

PAUSE1ms ; Label, wo die Standardwarteschleife beginnt
movlw D'199' ; Dezimalwert für die Zeitkonstante damit PAUSE = 1ms ist
movwf schleife ; Schieben des Wertes 199 in die Variable "schleife"
; Ende der Start-Einstellungen für "PAUSE1ms"

PAUSEE ; Einsprungstelle für Pausenschleifen
nop
nop ; Taste nicht gedrückt, springe zur Marke "HAUPT" DECFSZ schleife,1
decfsz schleife,1 ; Dekrementiere die Variable "schleife" um 1 und schreibe das Ergebnis zurück in "schleife"
goto PAUSEE ; Ist die Zeit verstrichen? Nein, dann springe zurück zu "PAUSEE"
; Neuer Durchlauf bis "schleife" = 0
return

; Mögliche Standardwarteschleife für Zeiten zwischen ~ 2 und 256 ms
;
PAUSE250ms
movlw D'200'
movwf help
PAUSE250
call PAUSE1ms
decfsz help,1 ; Dekrementiere die Variable "help" um 1 und schreibe das Ergebnis zurück in "schleife"
goto PAUSE250 ; Ist die Zeit verstrichen? Nein, dann springe zurück zu "PAUSE250ms"
; Neuer Durchlauf bis "schleife" = 0
return
; Mögliche Standardwarteschleife für Zeiten zwischen ~ 250ms und 20 s
;
PAUSE1s
movlw D'4'
movwf sekunde
PAUSE1
call PAUSE250ms
decfsz sekunde,1 ; Dekrementiere die Variable "help" um 1 und schreibe das Ergebnis zurück in "schleife"
goto PAUSE1 ; Ist die Zeit verstrichen? Nein, dann springe zurück zu "PAUSE250ms"
; Neuer Durchlauf bis "schleife" = 0
return

; testet das PWM Siganl an PORTA,5 und kann volgende Zustände ausgeben: ON, OFF, Nicht angeschlossen

PWM_TEST
movlw D'25'
movwf help3
PWM_TEST1
btfss PORTA,5 ; Fragt RA,5 ab
goto PWM_TEST2
goto PWM_TEST1

PWM_TEST2
btfss PORTA,5 ; Fragt RA,5 ab
goto PWM_TEST3
goto PWM_1

PWM_TEST3
call PAUSE01ms
decfsz help3,1
goto PWM_TEST2

movlw B'00000010' ; Es ist kein Signal vorhanden
movwf PWM

return ; Beendet dass Unterprogramm

PWM_1
call PAUSE1ms ; Wartet 15 ms, wenn RA,5 auf Hig ist
call PAUSE01ms
call PAUSE01ms
call PAUSE01ms
call PAUSE01ms
call PAUSE01ms

btfss PORTA,5 ; Fragt RA,5 ab
goto PWM_NEIN

PWM_SCHLEIFE

btfsc PORTA,5
goto PWM_SCHLEIFE

PWM_JA

movlw B'00000001' ; Es ist ein Signal vorhanden, und dieses ist auf Hig
movwf PWM

return ; Beendet dass Unterprogramm

PWM_NEIN

movlw B'00000100' ; Es ist ein Signal vorhanden, und dieses ist auf LOW
movwf PWM

return ; Beendet dass Unterprogramm

end ; Ende des Programmes

hm_heli
01.09.2009, 21:34
>>>PAUSE01ms
hi, das einzige, das ich auf Anhieb sehe, ist, dass Du in "PAUSE01ms"
D'19', im Kommentar aber 199 angibst...

pointhi
04.09.2009, 16:28
Da hab ich wohl nicht ganz genau aufgepasst, wie ich die PAUSE1ms kopiert habe. Dass kann man aber ignorrieren. Ich hab da vorgefertigte schleifen aus einem Buch benutzt. Diese Funktionieren aber 100%