;********************************************************************************;
;*	 							CarLights										*;
;*						Geschreven door E.E.Jansen								*;
;*																				*;
;*	- Ingangen:																	*;
;*		Van RC-ontvanger kanaal-A op ingang PORTA,0								*;
;*		Van RC-ontvanger kanaal-B op ingang PORTA,2								*;
;*		Kanalen-A&B kallibreren de middenstand en hebben een dender-beveiliging.*;
;*	- Uitgangen:																*;
;*		Koplampen 1e set op uitgang 		PORTB,0								*;
;*		Achterlichten op uitgang 			PORTB,1								*;
;*		Koplampen 2e set op uitgang 		PORTB,2								*;
;*		Remlichten op uitgang 				PORTB,3								*;
;*		Achteruitrij-lichten op uitgang 	PORTB,4								*;
;*		Linker knipperlichten op uitgang 	PORTB,5								*;
;*		Rechter knipperlichten op uitgang 	PORTB,6								*;
;*																				*;
;*		1-toestand voor knuppel-middenstand.									*;
;*		1-toestand voor knuppel-omhoog.											*;
;*		1-toestand voor knuppel-omlaag.											*;																*;
;*																				*;
;*	- Beschrijving van Switchflags:												*;
;*	Dit register bevat alle benodigde flags tbv het Switch-gedeelte.			*;
;* '00000000': Registerbits														*;
;*  ||||||||																	*;
;*  |||||||-- Geeft aan: Puls van Kanaal-A is 1500mS				(BIT0)		*;
;*  ||||||--- Geeft aan: Puls van Kanaal-A is >1500mS				(BIT1)		*;
;*  |||||---- Geeft aan: Puls van Kanaal-A is <1500mS				(BIT2)		*;
;*  ||||----- Geeft aan: Vorige Actie van Kanaal-1 was >1500mS		(BIT3)		*;
;*  |||------ Geeft aan: Puls van Kanaal-B is 1500mS				(BIT4)		*;
;*  ||------- Geeft aan: Puls van Kanaal-B is >1500mS				(BIT5)		*;
;*  |-------- Geeft aan: Puls van Kanaal-B is <1500mS				(BIT6)		*;
;*  --------- Geeft aan: Nood-Knipperlichten aan					(BIT7)		*;
;*																				*;
;*	- Beschrijving van Timingflags:												*;
;*	Dit register bevat alle benodigde flags tbv diverse timers.					*;
;* '00000000': Registerbits														*;
;*  ||||||||																	*;
;*  |||||||-- tbv aan/uit sturen(1xSec) van de Knipperlichten		(BIT0)		*;
;*  ||||||--- Geeft aan: 1sec timer is gestart						(BIT1)		*;
;*  |||||---- Geeft aan: 1sec stilstaan is voorbij					(BIT2)		*;
;*  ||||----- Geeft aan: 3sec timer is gestart						(BIT3)		*;
;*  |||------ Geeft aan: 3sec remmen zijn voorbij					(BIT4)		*;
;*  ||------- Geeft aan: 											(BIT5)		*;
;*  |-------- Geeft aan: 											(BIT6)		*;
;*  --------- Geeft aan:											(BIT7)		*;
;*	 																			*;
;*	-Er zijn 2 sets koplampen; Eén set brandt constant,							*;
;*	 Eén set brandt alleen bij rijden(gaan na ong. 2sec stilstaan uit).			*;
;*	-De achterlichten branden bij rijden(gaan na ong. 2sec stilstaan uit).		*;
;*	-Er zijn 2 Remlichten / 2 Achteruitrijlichten.								*;
;*	-Er zijn 4 Knipperlichten (2-links / 2-rechts).								*;
;*	-Van RC-ontvanger 2kanalen bemonsteren.										*;
;*		-Kanaal-A: Vooruit / Achteruit / Rem. Er zijn 2 substanden.				*;
;*		-Kanaal-B: Richting (links/rechts).										*;
;*	-Per kanaal zijn drie toestanden mogelijk.									*;
;*	-Kanaal-A:																	*;
;*	Uit Kanaal-A (Gas-Kanaal) komen 2 sooren sub-info;							*;
;*	1e- Is de gashandel vooruit of achteruit.									*;
;*	2e- Is de vorige actie vooruit of achteruit geweest.						*;
;*		Bij 1500mS(langer dan 1sec) >> Koplampen(2e set) uit.???				*;
;*		Bij >1500mS	>> Koplampen(2e set) aan.									*;
;*		Bij <1500mS(substand-A) >> Remlichten aan,Koplampen(2e set) aan.		*;
;*		Bij <1500mS(substand-B) >> Acheruitrijlichten aan,Koplampen(2e set) aan.*;
;*	-Kanaal-B:																	*;
;*		Bij 1500mS >> Geen Knipperlichten aan.									*;
;*		Bij <1500mS >> Linker Knipperlichten aan.								*;
;*		Bij >1500mS >> Rechter Knipperlichten aan.								*;
;*	-Dode zone rond de middenstand van het stuur.								*;
;*	-Bij langer dan 3sec remmen gaan de nood-knipperlichten aan/uit.			*;
;*	 																			*;
;********************************************************************************;

		list      p=PIC16F628A           ; list directive to define processor
	#include <P16F628A.inc>       ; processor specific variable definitions

	errorlevel  	-302			;onderdruk error-melding 302
	errorlevel		-224			;onderdruk warning-melding 224

	__CONFIG _BODEN_OFF & _CP_OFF & _DATA_CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_OFF & _HS_OSC

	cblock 	0x20 			;start of general purpose registers
		safe_w				;tbv interrupt-svc
		safe_s				;tbv interrupt-svc
		count1 				;tbv delay routine
		counta 				;tbv delay routine 
		countb 				;tbv delay routine
		temp1				;tbv diverse doelen
		temp2				;tbv diverse doelen
		centertimeA			;tbv gemeten middelpunt van kanaal-A
		centertimeB			;tbv gemeten middelpunt van kanaal-B
		offsetplusA			;tbv gemeten offset van kanaal-A omhoog
		offsetminA			;tbv gemeten offset van kanaal-A omlaag
		offsetplusB			;tbv gemeten offset van kanaal-B omhoog
		offsetminB			;tbv gemeten offset van kanaal-B omlaag
		pulsmeasuredA		;tbv gemeten pulstijd van kanaal-A
		pulsmeasuredB		;tbv gemeten pulstijd van kanaal-B
		switchflag			;tbv tellerbeveiliging
		timingflag			;tbv diverse timers
		timer2sec			;tbv lichten uit vertraging
		timer3sec			;tbv noodknipperlichten aan/uit zetten
		pulseokA			;tbv goedkeuring puls
		pulseokB			;tbv goedkeuring puls
		onoffcount			;tbv knippersnelheid van de knipperlichten
	endc

#define		SENSOR.A		PORTA,2		;geef PORTA,2 de naam SENSOR.A.
#define		SENSOR.B		PORTA,4		;geef PORTA,4 de naam SENSOR.B.
#define		HeadLights.1	PORTB,0		;geef PORTB,0 de naam HeadLights.1.
#define		RearLights		PORTB,1		;geef PORTB,1 de naam RearLights.
#define		HeadLights.2	PORTB,2		;geef PORTB,2 de naam HeadLights.2.
#define		BrakeLights		PORTB,3		;geef PORTB,3 de naam BrakeLights.
#define		ReverseLights	PORTB,4		;geef PORTB,4 de naam ReverseLights.
#define		BlinkLights.L	PORTB,5		;geef PORTB,5 de naam BlinkLights.L.
#define		BlinkLights.R	PORTB,6		;geef PORTB,6 de naam BlinkLights.R.


	ORG		0x00			;processor reset-vector.
	goto	main			;ga naar begin van programma.

Intsvc		 ;Interrupt Service Routine.
	ORG		0x04
	movwf	safe_w				;save w.
	swapf	STATUS,w			;swap status, w.
	movwf	safe_s				;save status(nibble swap, remember)
	clrwdt						;clear watchdog timer to ensure startup.
	btfss	INTCON,2			;check TMR0-flag.
	goto	$+2					;is de vlag aan > sla dan deze stap over.
	clrf	TMR0
	btfss	PIR1,0			;check TMR1-flag.
	goto	$+0x27			;is de vlag aan > sla dan deze stap over.
	decf	onoffcount,f	;verlaag het geheugen onoffcount met 1.
	btfss	STATUS,Z		;
	goto	$+9				;is de waarde van onoffcount geen 0 ga dan 9 stappen verder.
	btfss	timingflag,0	;check of vlag timingflag,0 aan is.
	goto	$+2				;zo nee > ga 2 stappen verder.
	goto	$+3				;zo ja > ga 3 stappen verder.
	bsf		timingflag,0	;zet de vlag timingflag,0 aan.
	goto	$+2				;ga 2 stappen verder.
	bcf		timingflag,0	;zet de vlag timingflag,0 uit.
	movlw	d'5'			;
	movwf	onoffcount		;zet 5 in geheugen onoffcount.
;hier wordt de 1sec timer verwerkt.
	btfss	timingflag,1	;check of vlag timingflag,1 aan is.
	goto	$+7				;zo nee > ga 7 stappen verder.
	decf	timer2sec,f		;verlaag het geheugen timer2sec met 1.
	btfss	STATUS,Z		;
	goto	$+4				;is de waarde van timer1sec geen 0 ga dan 4 stappen verder.
	bcf		HeadLights.2	;zet de vlag HeadLights.2 uit.
	bcf		RearLights		;zet de vlag RearLights uit.
	bcf		timingflag,1	;zet de vlag timingflag,1 uit.
;hier wordt de 3sec timer verwerkt.
	btfss	timingflag,3	;check of vlag timingflag,3 aan is.
	goto	$+0x0F			;zo nee > ga 15 stappen verder.	
	decf	timer3sec,f		;verlaag het geheugen timer3sec met 1.
	btfss	STATUS,Z		;
	goto	$+0x0C			;is de waarde van timer3sec geen 0 ga dan 12 stappen verder.
	btfss	switchflag,7	;check of vlag switchflag,7 aan is.
	goto	$+2				;zo nee > ga 2 stappen verder.
	goto	$+3				;zo ja > ga 3 stappen verder.
	bsf		switchflag,7	;zet de vlag switchflag,7 aan.
	goto	$+4				;ga 4 stappen verder.
	bcf		switchflag,7	;zet de vlag switchflag,7 uit.
	bcf		BlinkLights.L	;zet het linker knipperlicht uit.
	bcf		BlinkLights.R	;zet het rechter knipperlicht uit.
	bcf		timingflag,3	;zet de vlag timingflag,3 uit.
	bcf		timingflag,4	;zet de vlag timingflag,4 uit.
	call	Lightcontroller
	bcf		PIR1,0			;zet de vlag van TMR1	 uit.
	clrf	TMR1L
	clrf	TMR1H
;Reset Intsvc					;done working, start restoring
	swapf	safe_s,w			;fetch status, reswap nibbles
	movwf	STATUS				;restore status
	swapf	safe_w,f			;swap nibbles in preparation
	swapf	safe_w,w			;for the swap restoration of w
	bcf		INTCON,2			;clear interrupt flag before return
	retfie

;Initialization Routine - At Power-Up all interrupts are masked.
main	ORG		0x40		;$	;nog voor juiste processor omzetten.
;reset all ports and set them as Input.
	movlw	0x07
	movwf	CMCON				;turn comparators off (make it like a 16F84)
  	bsf 	STATUS,	RP0			;select bank 1
   	movlw 	b'00000000'			;set PortB all outputs
   	movwf 	TRISB				;set PortB all outputs
  	movlw 	b'11111111'			;set PortA all inputs
	movwf	TRISA				;set PortA all inputs
	bcf		STATUS,	RP0			;select bank 0
	clrf	PORTA
	clrf	PORTB
;Initialiseer Timer-0.
	bcf		INTCON,2			;clear TMR0 int flag
	bsf		INTCON,7			;enable global interrupts
	bsf		INTCON,6			;enable overige interrupts
	bsf		INTCON,5			;enable TMR0 int
	clrf	TMR0				;clear timer
;Initialiseer Timer-Interrupts.
 	bsf 	STATUS,	RP0			;Select bank 1
	bsf		PIE1,TMR1IE		
	bcf		STATUS,	RP0			;Select bank 0
;Initialiseer Timer-1.
	bsf		T1CON,0				;Start TMR1
	bsf		T1CON,4				;Stel prescaler-TMR1 in
	bsf		T1CON,5				;Stel prescaler-TMR1 in
	clrf	TMR1L
	clrf	TMR1H
	clrwdt						;why is this needed? just do it.
	movlw	b'11000101'			;b'11000101' set up timer. prescaler 1:64(bit3)bypassed 
	option						;send w to option. generate warning.
	clrf	TMR0
;einde van timer initialisatie's.

	clrf	temp1
	clrf	temp2
	clrf	offsetplusA
	clrf	offsetminA
	clrf	offsetplusB
	clrf	offsetminB
	clrf	pulsmeasuredA
	clrf	pulsmeasuredB
	clrf	switchflag
	clrf	timingflag
	clrf	timer2sec
	clrf	timer3sec
	movlw	d'5'
	movwf	onoffcount			;zet 5 in geheugen onoffcount.
	bsf		timingflag,0		;zet vlag Knipperlichten aan.
;Initialization Routine Finished.

;Opstart-routine.
	movlw		b'11111111'
	movwf		PORTB			;zet alle lampen aan tijdens opstart.
	call		delay
	call		delay			;2 keer de wachtroutine tbv. opstarttijd van RC-ontvanger.
	movlw		d'2'			;zet 2 in temp1 tbv herhalen 
	movwf		temp1

LearnCenterPoint		;LearnCenterPoint routine.
LearnCenterPointA		;Learn CenterPoint Kanaal-A.
	btfsc		SENSOR.A		;wacht tot SENSOR.A laag wordt.
	goto		$-1				; > puls gaat beginnen.
;wacht tot SENSOR.A hoog wordt.
	btfss		SENSOR.A
	goto		$-1
;SENSOR.A is hoog > puls is begonnen.
	clrf		TMR0
	btfsc		SENSOR.A		;wacht tot SENSOR.A laag wordt.
	goto		$-1				
;SENSOR.A is laag > puls is gestopt; haal de puls-lengte uit TMR0 register.
	movf		TMR0,0			;zet waarde van TMR0 in W
	addwf		temp2,1			;tel TMR0 bij temp2 op.
	decf		temp1,1			;verminder temp1 met 1, plaats uitkomst in temp1
	btfsc		temp1,C
	goto		LearnCenterPointA
	clrf		TMR0
;hier wordt het gemiddelde berekend voor de middenwaarde.
	clrf		temp1
	movlw		d'2'
	subwf		temp2,1			;trek het getal 2 van temp2 af, plaats uitkomst in temp2.
	incf		temp1,1			;verhoog waarde temp1 met 1, plaats uitkomst in temp1.
	movfw		temp2
	btfss		STATUS,Z		;is de waarde van temp2 0 ga dan verder,
	goto		$-5				;is de waarde van temp2 geen 0 heraal da de berekening.
;bepaal de eventuele offset naar onder.
	movlw		0x75			;een TMRO van 117 is precies 1,5mS(het midden).
	movwf		temp2			;zet 117 in temp2
	movfw		temp1			;haal de waarde van temp1 op.
	subwf		temp2,0			;trek deze waarde van temp2 af, plaats uitkomst in W.
	btfsc		STATUS,C		;is de uitkomst negatief? > skip de volgende instructie.
	movwf		offsetminA		;zet de uitkomst in offsetmin.
;bepaal de eventuele offset naar boven.
	movfw		temp2			;haal de waarde van temp2 op.
	subwf		temp1,0			;trek deze waarde van temp1 af, plaats uitkomst in W.
	btfsc		STATUS,C		;is de uitkomst negatief? > skip de volgende instructie.
	movwf		offsetplusA		;zet de uitkomst in offsetplus.
	movlw		d'2'			;zet 2 in temp1 tbv herhalen 
	movwf		temp1
	clrf		temp2

LearnCenterPointB			;Learn CenterPoint Kanaal-B.
	btfsc		SENSOR.B			;wacht tot SENSOR.B laag wordt.
	goto		$-1				; > puls gaat beginnen.
;wacht tot SENSOR.B hoog wordt.
	btfss		SENSOR.B
	goto		$-1
;SENSOR.B is hoog > puls is begonnen.
	clrf		TMR0
	btfsc		SENSOR.B			;wacht tot SENSOR.B laag wordt.
	goto		$-1				
;SENSOR.B is laag > puls is gestopt; haal de puls-lengte uit TMR0 register.
	movf		TMR0,0			;zet waarde van TMR0 in W
	addwf		temp2,1			;tel TMR0 bij temp2 op.
	decf		temp1,1			;verminder temp1 met 1, plaats uitkomst in temp1
	btfsc		temp1,C
	goto		LearnCenterPointB
	clrf		TMR0
;hier wordt het gemiddelde berekend voor de middenwaarde.
	clrf		temp1
	movlw		d'2'
	subwf		temp2,1			;trek het getal 2 van temp2 af, plaats uitkomst in temp2.
	incf		temp1,1			;verhoog waarde temp1 met 1, plaats uitkomst in temp1.
	movfw		temp2
	btfss		STATUS,Z		;is de waarde van temp2 0 ga dan verder,
	goto		$-5				;is de waarde van temp2 geen 0 heraal da de berekening.
;bepaal de eventuele offset naar onder.
	movlw		0x75			;een TMRO van 117 is precies 1,5mS(het midden).
	movwf		temp2			;zet 117 in temp2
	movfw		temp1			;haal de waarde van temp1 op.
	subwf		temp2,0			;trek deze waarde van temp2 af, plaats uitkomst in W.
	btfsc		STATUS,C		;is de uitkomst negatief? > skip de volgende instructie.
	movwf		offsetminB		;zet de uitkomst in offsetmin.
;bepaal de eventuele offset naar boven.
	movfw		temp2			;haal de waarde van temp2 op.
	subwf		temp1,0			;trek deze waarde van temp1 af, plaats uitkomst in W.
	btfsc		STATUS,C		;is de uitkomst negatief? > skip de volgende instructie.
	movwf		offsetplusB		;zet de uitkomst in offsetplus.
	clrf		PORTB			;zet alle lampen uit, opstart is klaar.
;LearnCenterPoint routine is klaar.
	bsf			PORTB,0			;zet de 1e-set Koplampen aan.
;Opstart-routine is klaar. Programma loopt.

WaitForSignal.A					;Begin met inlezen van Kanaal-A.
;wait for SENSOR.A to go low > puls is going to start.
	btfsc		SENSOR.A		;wacht tot SENSOR.A laag wordt.
	goto		$-1				; > puls gaat beginnen.
;wacht tot SENSOR.A hoog wordt.
	btfss		SENSOR.A
	goto		$-1
;SENSOR.A is hoog > puls is begonnen.
	clrf		TMR0
	btfsc		SENSOR.A		;Wait for SENSOR.A to go low
	goto		$-1
;SENSOR.A is laag > puls is gestopt; haal de puls-lengte uit TMR0 register.
	movf		TMR0,0			;Load TMR0 value into W
	movwf		temp1			;zet W in temp1.
	movfw		offsetminA		;zet offsetmin in W.
	addwf		temp1,1			;tel W bij temp1 op, plaats de uitkomst in temp1.
	movfw		offsetplusA		;zet offsetplus in W.
	subwf		temp1,0			;trek W van temp1 af, plaats de uitkomst in W.
	movwf		pulsmeasuredA	;zet W in pulsmeasured.
	clrf		TMR0
;Verwerk de ingelezen puls.
;Is de puls te lang?? > is de pulse-lengte langer dan 2.1mS.
	addlw		0x5C			;check of de puls langer dan 2.1mS is.
	btfss		STATUS,C		;check of de carry is ge-set.
	goto		$+3
	clrf		switchflag
	goto		WaitForSignal.A	;Lees de puls opnieuw.

;check pulse-lengte >1500mS
	movfw		pulsmeasuredA	;check of de puls >1500mS lang is.
	addlw		0x84			;tel 132 bij pulsmeasuredA op.
	btfsc		STATUS,C		;check of de carry is ge-set.
	goto		$+2				;ga 2 stappen verder.
	goto		$+0x0C			;ga 12 stappen verder.
	bcf			timingflag,1	;zet de vlag timingflag,1 uit.
	btfss		switchflag,1	;check of vlag switchflag,1 aan is.
	goto		$+2				;zo nee > ga 2 stappen verder.
	goto		$+4				;zo ja > ga 4 stappen verder.
	movlw		d'3'
	movwf		pulseokA		;zet 3 in het geheugen pulseokA.
	bsf			switchflag,1	;zet de vlag switchflag,1 aan.
	decf		pulseokA,f		;tel hoevaak de puls is geweest.
	btfss		STATUS,Z		;is pulseokA 0?
	goto		WaitForSignal.A	;zo nee > ga terug naar routine WaitForSignal.A.
	goto 		PulsAlang		;zo ja > ga naar routine PulsAlang.
;check pulse-lengte op 1.5mS
	movfw		pulsmeasuredA	;check of de puls 1.5mS lang is.
	addlw		0x8B			;tel 139 bij pulsmeasuredA op.
	btfsc		STATUS,C		;check of de carry is ge-set.
	goto		$+2				;ga 2 stappen verder.
	goto		$+0x0C			;ga 12 stappen verder.
	bcf			timingflag,3	;zet de vlag timingflag,3 uit.
	btfss		switchflag,0	;check of vlag switchflag,0 aan is.
	goto		$+2				;zo nee > ga 2 stappen verder.
	goto		$+4				;zo ja > ga 4 stappen verder.
	movlw		d'3'
	movwf		pulseokA		;zet 3 in het geheugen pulseokA.
	bsf			switchflag,0	;zet de vlag switchflag,0 aan.
	decf		pulseokA,f		;tel hoevaak de puls is geweest.
	btfss		STATUS,Z		;is pulseokA 0?
	goto		WaitForSignal.A	;zo nee > ga terug naar routine WaitForSignal.A.
	goto 		PulsAmidden		;zo ja > ga naar routine PulsAmidden.
;check pulse-lengte <1500mS
	movfw		pulsmeasuredA	;check of de puls <1.5mS lang is.
	addlw		0xB2			;tel 178 bij pulsmeasuredA op.
	btfsc		STATUS,C		;check of de carry is ge-set.
	goto		$+2				;ga 2 stappen verder.
	goto		$+0x0C			;ga 12 stappen verder.
	bcf			timingflag,1	;zet de vlag timingflag,1 uit.
	btfss		switchflag,2	;check of vlag switchflag,2 aan is.
	goto		$+2				;zo nee > ga 2 stappen verder.
	goto		$+4				;zo ja > ga 4 stappen verder.
	movlw		d'3'
	movwf		pulseokA		;zet 3 in het geheugen pulseokA.
	bsf			switchflag,2	;zet de vlag switchflag,2 aan.
	decf		pulseokA,f		;tel hoevaak de puls is geweest.
	btfss		STATUS,Z		;is pulseokA 0?
	goto		WaitForSignal.A	;zo nee > ga terug naar routine WaitForSignal.A.
	goto 		PulsAkort		;zo ja > ga naar routine PulsAkort.
;Is de puls te kort?? > is de pulse-lengte korter dan 0.9mS.
	movfw		pulsmeasuredA	;check of de puls 0.9mS lang is.
	addlw		0xBA			;tel 186 bij pulsmeasuredA op.
	btfsc		STATUS,C		;check of de carry is ge-set.
	goto 		WaitForSignal.A	;zo ja > ga naar routine WaitForSignal.A.

WaitForSignal.B					;Begin met inlezen van Kanaal-B.
;wait for SENSOR.B to go low > puls is going to start.
	btfsc		SENSOR.B			;wacht tot SENSOR.B laag wordt.
	goto		$-1				; > puls gaat beginnen.
;wacht tot SENSOR.B hoog wordt.
	btfss		SENSOR.B
	goto		$-1
;SENSOR.B is hoog > puls is begonnen.
	clrf		TMR0
	btfsc		SENSOR.B		;Wait for SENSOR.B to go low
	goto		$-1
;SENSOR.B is laag > puls is gestopt; haal de puls-lengte uit TMR0 register.
	movf		TMR0,0			;Load TMR0 value into W
	movwf		temp1			;zet W in temp1.
	movfw		offsetminB		;zet offsetmin in W.
	addwf		temp1,1			;tel W bij temp1 op, plaats de uitkomst in temp1.
	movfw		offsetplusB		;zet offsetplus in W.
	subwf		temp1,0			;trek W van temp1 af, plaats de uitkomst in W.
	movwf		pulsmeasuredB	;zet W in pulsmeasured.
	clrf		TMR0
;Verwerk de ingelezen puls.
;Is de puls te lang?? > is de pulse-lengte langer dan 2.1mS.
	addlw		0x5C			;check of de puls langer dan 2.1mS is.
	btfss		STATUS,C		;check of de carry is ge-set.
	goto		$+3
	clrf		switchflag
	goto		WaitForSignal.B	;Lees de puls opnieuw.

;check pulse-lengte >1500mS
	movfw		pulsmeasuredB	;check of de puls >1500mS lang is.
	addlw		0x84			;tel 132 bij pulsmeasuredB op.
	btfsc		STATUS,C		;check of de carry is ge-set.
	goto		$+2				;zo ja > ga 2 stappen verder.
	goto		$+0x0B			;zo nee > ga 11 stappen verder.
	btfss		switchflag,5	;check of vlag switchflag,5 aan is.
	goto		$+2				;zo nee > ga 2 stappen verder.
	goto		$+4				;zo ja > ga 4 stappen verder.
	movlw		d'3'
	movwf		pulseokB		;zet 3 in het geheugen pulseokB.
	bsf			switchflag,5	;zet de vlag switchflag,5 aan.
	decf		pulseokB,f		;tel hoevaak de puls is geweest.
	btfss		STATUS,Z		;is pulseokB 0?
	goto		WaitForSignal.B	;zo nee > ga terug naar routine WaitForSignal.B.
	goto 		PulsBlang		;zo ja > ga naar routine PulsBlang.
;check pulse-lengte op 1.5mS / Deze routine is dubbel voor een dood gebied rond het midden. middengebied(dode zone) vergroten??
	movfw		pulsmeasuredB	;check of de puls ong.1.5mS lang is.
	addlw		0x90			;tel 144 bij pulsmeasuredB op.
	btfsc		STATUS,C		;check of de carry is ge-set.
	goto		$+2				;zo ja > ga 2 stappen verder.
	goto		$+0x0B			;zo nee > ga 11 stappen verder.
	btfss		switchflag,4	;check of vlag switchflag,4 aan is.
	goto		$+2				;zo nee > ga 2 stappen verder.
	goto		$+4				;zo ja > ga 4 stappen verder.
	movlw		d'3'
	movwf		pulseokB		;zet 3 in het geheugen pulseokB.
	bsf			switchflag,4	;zet de vlag switchflag,4 aan.
	decf		pulseokB,f		;tel hoevaak de puls is geweest.
	btfss		STATUS,Z		;is pulseokB 0?
	goto		WaitForSignal.B	;zo nee > ga terug naar routine WaitForSignal.B.
	goto 		PulsBmidden		;zo ja > ga naar routine PulsBmidden.
;middengebied van dode zone
	movfw		pulsmeasuredB	;check of de puls ong.1.5mS lang is.
	addlw		0x86			;tel 134 bij pulsmeasuredB op.
	btfsc		STATUS,C		;check of de carry is ge-set.
	goto		$+2				;zo ja > ga 2 stappen verder.
	goto		$+0x0B			;zo nee > ga 11 stappen verder.
	btfss		switchflag,4	;check of vlag switchflag,4 aan is.
	goto		$+2				;zo nee > ga 2 stappen verder.
	goto		$+4				;zo ja > ga 4 stappen verder.
	movlw		d'3'
	movwf		pulseokB		;zet 3 in het geheugen pulseokB.
	bsf			switchflag,4	;zet de vlag switchflag,4 aan.
	decf		pulseokB,f		;tel hoevaak de puls is geweest.
	btfss		STATUS,Z		;is pulseokB 0?
	goto		WaitForSignal.B	;zo nee > ga terug naar routine WaitForSignal.B.
	goto 		PulsBmidden		;zo ja > ga naar routine PulsBmidden.
;check pulse-lengte <1500mS
	movfw		pulsmeasuredB	;check of de puls <.1.5mS lang is.
	addlw		0xB2			;tel 178 bij pulsmeasuredB op.
	btfsc		STATUS,C		;check of de carry is ge-set.
	goto		$+2				;zo ja > ga 2 stappen verder.
	goto		$+0x0B			;zo nee > ga 11 stappen verder.
	btfss		switchflag,6	;check of vlag switchflag,6 aan is.
	goto		$+2				;zo nee > ga 2 stappen verder.
	goto		$+4				;zo ja > ga 4 stappen verder.
	movlw		d'3'
	movwf		pulseokB		;zet 3 in het geheugen pulseokB.
	bsf			switchflag,6	;zet de vlag switchflag,6 aan.
	decf		pulseokB,f		;tel hoevaak de puls is geweest.
	btfss		STATUS,Z		;is pulseokB 0?
	goto		WaitForSignal.B	;zo nee > ga terug naar routine WaitForSignal.B.
	goto 		PulsBkort		;zo ja > ga naar routine PulsBkort.
;Is de puls te kort?? > is de pulse-lengte korter dan 0.9mS.
	movfw		pulsmeasuredB	;check of de puls 0.9mS lang is.
	addlw		0xBA			;tel 186 bij pulsmeasuredB op.
	btfsc		STATUS,C		;check of de carry is ge-set.
	goto 		WaitForSignal.B	;zo ja > ga naar routine WaitForSignal.B.
	goto 		WaitForSignal.A	;zo nee > ga naar routine WaitForSignal.A.

PulsAlang			;hier worden de bits van kanaal-A >1500mS ingesteld.
	bsf			switchflag,1		;Zet vlag Kanaal-A >1500mS aan.
	bsf			switchflag,3		;Zet vlag switchflag,3 aan.
	call		Lightcontroller
	goto		WaitForSignal.B

PulsAmidden			;hier worden de bits van kanaal-A =1500mS ingesteld.
	bsf			switchflag,0		;Zet vlag Kanaal-A =1500mS aan.
	btfsc		timingflag,1		;check of vlag timingflag,1 aan is.
	goto		$+5					;zo ja > ga 5 stappen verder.
	movlw		d'20'
	movwf		timer2sec			;zet 10 in het geheugen timer1sec.
	bsf			timingflag,1		;zet de vlag timingflag,1 aan.
	bsf			timingflag,4		;zet de vlag timingflag,4 aan.
	call		Lightcontroller
	goto		WaitForSignal.B

PulsAkort			;hier worden de bits van kanaal-A <1500mS ingesteld.
	bsf			switchflag,2		;Zet vlag Kanaal-A <1500mS aan.
	btfss		switchflag,3		;check of vlag switchflag,3 is
	goto		$+8					;zo ja > ga 8 stappen verder.
	btfss		timingflag,4
	goto		$+6					;zo ja > ga 6 stappen verder.
	btfsc		timingflag,3		;check of vlag timingflag,3 aan is.
	goto		$+4					;zo ja > ga 4 stappen verder.
	movlw		d'30'
	movwf		timer3sec			;zet 30 in het geheugen timer3sec.
	bsf			timingflag,3		;zet de vlag timingflag,3 aan.
	call		Lightcontroller
	goto		WaitForSignal.B	

PulsBlang			;hier worden de bits van kanaal-B >1500mS ingesteld.
	bsf			switchflag,5	;activeer de linker knipperlichten.
	call		Lightcontroller
	goto		WaitForSignal.A
PulsBmidden			;hier worden de bits van kanaal-B =1500mS ingesteld.
	bsf			switchflag,4	;de-activeer de knipperlichten.
	call		Lightcontroller
	goto		WaitForSignal.A
PulsBkort			;hier worden de bits van kanaal-B <1500mS ingesteld.
	bsf			switchflag,6	;activeer de rechter knipperlichten.
	call		Lightcontroller
	goto		WaitForSignal.A

Lightcontroller		;hier worden de lampen aan of uit geschakeld.
;hier de achteruit of remlichten uit zetten.
	btfss		switchflag,0	;check puls-A =1500mS
	goto		$+5				;zo nee > ga 5 stappen verder.
	btfsc		BrakeLights		;check of de BrakeLights aan zijn.
	bcf			switchflag,3	;zet de vlag switchflag,3 uit.
	bcf			BrakeLights		;zet de BrakeLights uit.
	bcf			ReverseLights	;zet de ReverseLights uit.
;hier de koplampen & achterlichten aan zetten.
	btfss		switchflag,1	;check puls-A >1500mS
	goto		$+3				;zo nee > ga 3 stappen verder.
	bsf			HeadLights.2	;doe de koplampen aan(2e set).
	bsf			RearLights		;doe de achterlichten aan.
;hier de achteruit of remlichten aan zetten.
	btfss		switchflag,2	;check puls-A <1500mS
	goto		$+8				;zo nee > ga 8 stappen verder.
	btfss		switchflag,3	;check of vlag switchflag,3 aan is.
	goto		$+3				;zo nee > ga 3 stappen verder.
	bsf			BrakeLights		;doe de remlichten aan.
	goto		$+2
	bsf			ReverseLights	;doe de achteruitrij-lichten aan.
	bsf			HeadLights.2	;doe de koplampen aan(2e set).
	bsf			RearLights		;doe de achterlichten aan.
;hier de knipperlichten uit zetten.
	btfss		switchflag,4	;check puls-B =1500mS
	goto		$+3				;zo nee > ga 3 stappen verder.
	bcf			BlinkLights.L	;zet de linker-knipperlichten aan.
	bcf			BlinkLights.R	;zet de rechter-knipperlichten aan.
;hier de linker-knipperlichten aan/uit zetten.
	btfss		switchflag,5	;check puls-B >1500mS
	goto		$+6				;zo nee > ga 6 stappen verder.
	btfss		timingflag,0	;check of vlag timingflag,0 aan is.
	goto		$+3				;zo nee > ga 3 stappen verder.
	bsf			BlinkLights.L	;zet de linker knipperlichten aan.
	goto		$+2				;ga 2 stappen verder.
	bcf			BlinkLights.L	;zet de linker knipperlichten uit.
;hier de rechter-knipperlichten aan/uit zetten.
	btfss		switchflag,6	;check puls-B <1500mS
	goto		$+6				;zo nee > ga 6 stappen verder.
	btfss		timingflag,0	;check of vlag timingflag,0 aan is.
	goto		$+3				;zo nee > ga 3 stappen verder.
	bsf			BlinkLights.R	;zet de rechter knipperlichten aan.
	goto		$+2				;ga 2 stappen verder.
	bcf			BlinkLights.R	;zet de rechter knipperlichten uit.
;hier de nood-knipperlichten aan/uit zetten.
	btfss		switchflag,7	;check of de nood-knipperlichten actief zijn.
	goto		$+8				;zo nee > ga 8 stappen verder.
	btfss		timingflag,0	;check of vlag timingflag,0 aan is.
	goto		$+4				;zo nee > ga 4 stappen verder.
	bsf			BlinkLights.L	;zet de linker knipperlichten aan.
	bsf			BlinkLights.R	;zet de rechter knipperlichten aan.
	goto		$+3				;ga 3 stappen verder.
	bcf			BlinkLights.L	;zet de linker knipperlichten uit.
	bcf			BlinkLights.R	;zet de rechter knipperlichten uit.
;hier alles resetten.
	bcf			switchflag,0
	bcf			switchflag,1
	bcf			switchflag,2
	bcf			switchflag,4
	bcf			switchflag,5
	bcf			switchflag,6
	return

delay				;vertragings-routine gebruikt bij opstart.
	movlw	d'15'			;moet 15 worden;delay 15x50.2mS(20 MHz clock)
	movwf	count1			;zet getal-8 in count1

d50						;delay 50.2mS
	movlw	0xFF			;zet getal-249 in W
	movwf	counta			;zet getal-249 in counta
	movlw	0xC4			;zet getal-196 in W
	movwf	countb			;zet getal-196 in countb

Delay_0
	decfsz	counta, f		;verlaag counta met 1, is uitkomst 0 ga dan verder met volgende opdracht
	goto	$+2				;ga 2 programmaregels verder
	decfsz	countb, f		;verlaag counta met 1, is uitkomst 0 ga dan verder met volgende opdracht
	goto	Delay_0			;

	decfsz	count1	,f		;verlaag count1 met 1, is uitkomst 0 ga dan verder met volgende opdracht
	goto	d50				;ga terug naar d1
	retlw	0x00			;return met waarde 0 in W-geheugen

	end



