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