- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 3 von 3

Thema: Problem mit Servosignalmessung mit PIC 16F630

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied Avatar von pointhi
    Registriert seit
    18.03.2009
    Alter
    29
    Beiträge
    139

    Problem mit Servosignalmessung mit PIC 16F630

    Anzeige

    Praxistest und DIY Projekte
    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.



    Code:
    ;******************************************************************************
    ; 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

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    20.07.2009
    Beiträge
    40
    >>>PAUSE01ms
    hi, das einzige, das ich auf Anhieb sehe, ist, dass Du in "PAUSE01ms"
    D'19', im Kommentar aber 199 angibst...

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied Avatar von pointhi
    Registriert seit
    18.03.2009
    Alter
    29
    Beiträge
    139
    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%

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad