;**************************************************************************
;* PROGRAMMA OM 16 SERVO'S AAN TE STUREN MET SCHAKELAAR EN POTMETER       *
;*                                                                        *
;* Geschreven door Geert Giebens voor PIC 16F887 microcontroller          *
;*                                                                        *
;* Datum: 27 december 2012         Versie PIC16F887_SERVO_SCHAKKELAAR_1.1 *
;*                                                                        *
;* Filenaam: 16_servo_met_schakelaar_v1p1.asm                             *
;*								          *
;* Aanpassingen versie 1.1:					          * 
;*    Bij INIT alle uitgangen naar 0                   	 		  *
;*                        					          *
;*                         _____________________		          *
;*      schakelaar servo 1| 1  RE3 *  *  RB7 40 | puls servo 2            *
;*      schakelaar servo 2| 2  RA0  **   RB6 39 | puls servo 3            *
;*      schakelaar servo 3| 3  RA1       RB5 38 | puls servo 4            *
;*      schakelaar servo 4| 4  RA2       RB4 37 | puls servo 5            *
;*      schakelaar servo 5| 5  RA3   I   RB3 36 | puls servo 6            *
;*      schakelaar servo 6| 6  RA4   C   RB2 35 | puls servo 7            *
;*      schakelaar servo 7| 7  RA5       RB1 34 | puls servo 8            *
;*      schakelaar servo 8| 8  RE0   P   RB0 33 | DCC of MM in   v2p1.asm *
;*           puls servo 1 | 9  RE1   I       32 | +5V		 	  *
;*        ingang potmeter | 10 RE2   C       31 | Massa	 	          *
;*	    	      +5V | 11           RD7 30 | ingang keuze rechts     *
;*	    	    Massa | 12       1   RD6 29 | ingang keuze links      *
;*      schakelaar servo 9| 13 RA7   6   RD5 28 | puls servo 9            *
;*     schakelaar servo 10| 14 RA6   F   RD4 27 | puls servo 10           *
;*     schakelaar servo 11| 15 RC0   8   RC7 26 | Puls Servo 11           *
;*     schakelaar servo 12| 16 RC1   8   RC6 25 | Puls Servo 12           *
;*     schakelaar servo 13| 17 RC2   7   RC5 24 | Puls Servo 13           *
;*     schakelaar servo 14| 18 RC3       RC4 23 | Puls Servo 14           *
;*     schakelaar servo 15| 19 RD0       RD3 22 | Puls Servo 15           *
;*     schakelaar servo 16| 20 RD1       RD2 21 | Puls Servo 16           *
;*                         _____________________			  *
;*								          *
;*								          *								    
;**************************************************************************



;********************************************************************
;************ µCONTROLLER AFHANKELIJKE INSTELLINGEN *****************
;********************************************************************

	list		p=16f887	; list directive to define processor
	#include	<p16f887.inc>	; processor specific variable definitions

	__CONFIG    _CONFIG1, _LVP_OFF & _FCMEN_ON & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
	__CONFIG    _CONFIG2, _WRT_OFF & _BOR21V

	errorlevel -302, -306


;********************************************************************
;************ CONSTANTEN ********************************************
;********************************************************************

				;Inhoud FLAG register:

FLAG20ms		EQU 0	;=1 na 20ms
FLAGT2			EQU 1	;=1 dan timer 2 INT: 0-2,56ms (servopuls voorbij) 
FLAGPSZO		EQU 3	;geeft aan dat Persoonlijke Servo vertraging een Zero Overgang heeft gehad
FLANK			EQU 4   ;FLANK ingang van 0 --> 1
INGANG			EQU 5	;toestand ingang
MINPULS			EQU .50	;minimale waarde servopuls 50/100 = 0,5ms
MAXPULS			EQU .250 ;maximale waarde servopuls 250/100 = 2,5ms

	#define MIN_KEUZE PORTD,7
	#define MAX_KEUZE PORTD,6

	#define SCHAKELAAR1 PORTE,3
	#define SCHAKELAAR2 PORTA,0
	#define SCHAKELAAR3 PORTA,1
	#define SCHAKELAAR4 PORTA,2
	#define SCHAKELAAR5 PORTA,3
	#define SCHAKELAAR6 PORTA,4
	#define SCHAKELAAR7 PORTA,5
	#define SCHAKELAAR8 PORTE,0
	#define SCHAKELAAR9 PORTA,7
	#define SCHAKELAAR10 PORTA,6
	#define SCHAKELAAR11 PORTC,0
	#define SCHAKELAAR12 PORTC,1
	#define SCHAKELAAR13 PORTC,2
	#define SCHAKELAAR14 PORTC,3
	#define SCHAKELAAR15 PORTD,0
	#define SCHAKELAAR16 PORTD,1

	#define SERVO1 PORTE,1
	#define SERVO2 PORTB,7
	#define SERVO3 PORTB,6
	#define SERVO4 PORTB,5
	#define SERVO5 PORTB,4
	#define SERVO6 PORTB,3
	#define SERVO7 PORTB,2
	#define SERVO8 PORTB,1
	#define SERVO9 PORTD,5
	#define SERVO10 PORTD,4
	#define SERVO11 PORTC,7
	#define SERVO12 PORTC,6
	#define SERVO13 PORTC,5
	#define SERVO14 PORTC,4
	#define SERVO15 PORTD,3
	#define SERVO16 PORTD,2

	

;*******************************************************************
;************ VARIABELEN ********************************************
;********************************************************************



;de volgende MINSERVO MAXSERVO en TIMSERVO variabelen moeten in deze volgorde en eerst staan in ASM-program i.v.m. opslag en opvragen EEPROM !!!

	cblock 0x20
MINSERVO		;Array[16] ingestelde Min waarde servo zoals opgeslagen in EEPROM
	endc
	cblock 0x30
MAXSERVO		;Array[16] ingestelde Max waarde servo zoals opgeslagen in EEPROM
	endc
	CBLOCK 0X40
TIMSERVO		;Array[16] looptijd servo (vertraging) zoals opgeslagen in EEPROM
	ENDC
	CBLOCK 0x50
PULS			;Array[16] huidige waarde pulsduur servo
	endc
	cblock 0x60
TELVERTR		;Array[16] hulpteller vertraging servo
	endc
	cblock 0x70
HULPREG				;kan voor diverse doeleinden gebruikt worden
FLAG				;bits van FLAG register geven diverse toestanden weer (zie bij constanten)
SCHFF1				;vorige toestand schakelaar ingang 1-8
SCHFF2				;vorige toestand schakelaar ingang 9-16
VERTRAGING			;Berekende vertraging uit ADC register
SERVOTIJD			;Berekende tijd servo uit ADC register	
		
STATUS_TEMP			;tijdelijke opslag tijdens Interruptroutine
W_TEMP
PCLATH_TEMP			; save PCLATH
	
	endc


;********************************************************************
;*******  MACRO SERVO ***********************************************
;********************************************************************

SERVO MACRO  M_MINSERVO, M_MAXSERVO, M_TIMSERVO, M_PULS,M_TELVERT,M_SCHFF,M_FFBIT,M_PORTIN,M_BITIN,M_PORTOUT,M_BITOUT

					
	LOCAL  M_END,M_SPR10,M_SPR20, M_SPR25,M_SPR27,M_SPR30,M_SPR31,M_SPR40,M_SPR35,M_SPR23,M_SPR50,M_SPR55,M_SPR00, M_SPR42

					;EERST TOESTAND SCHAKELAAR ACHTERHALEN o.a. voor positieve FLANK detectie

	BCF FLAG,INGANG			;clear eerst de flag's
	BCF FLAG,FLANK
	BTFSS M_PORTIN,M_BITIN		;is schakelaar '1'
	GOTO M_SPR50
	BSF FLAG,INGANG			;  JA: set flag INGANG
	BTFSC M_SCHFF,M_FFBIT		;      is vorige toestand schakelaar '0'
	GOTO M_SPR00			;        NEE: ga naar INSTELLING VERTRAGING
	BSF FLAG,FLANK			;        JA: SET flag FLANK 
	BSF M_SCHFF,M_FFBIT		;            SET vorige toestand schakelaar
	GOTO M_SPR00
	
	
M_SPR50 BCF M_SCHFF,M_FFBIT		;  NEE: clear vorige toestand schakelaar
	
					;INSTELLEN VERTRAGING? 

M_SPR00	BTFSC MAX_KEUZE		;is ingang keuze max '0'
	GOTO M_SPR10			;  NEE: ga naar TEST SERVO MIN INSTELLING
	BTFSC MIN_KEUZE			;  JA: is ingang keuze min '0'
	GOTO M_SPR20			;        NEE: ga naar INSTELLEN SERVOPULS MAX
	BTFSS FLAG,FLANK		;        JA: is er een positieve flank
	GOTO M_END			;                 NEE: ga naar einde macro
	MOVF VERTRAGING,w		;             JA: Laad vertraging in array TIMSERVO	
	MOVWF M_TIMSERVO	  
	MOVLW LOW M_TIMSERVO		;             en opslaan in EEPROM en einde MACRO	
	banksel EEADR		
	MOVWF EEADR 		
	banksel M_TIMSERVO
	MOVF M_TIMSERVO,w
	banksel EEDAT
	MOVWF EEDAT
	GOTO M_SPR23

					;INSTELLEN SERVOPULS MIN?
	
M_SPR10 BTFSC MIN_KEUZE			;is ingang keuze min '0'
	GOTO M_SPR30			;  NEE: ga naar TEST SERVOPULS <> SERVOPULS MAX of SERVOPULS MIN
	BTFSS FLAG,INGANG		;  JA: is schakelaar '1'
	GOTO M_SPR25			;        NEE: GA NAAR SERVO UITGANG AANSTUREN
	BTFSS FLAG,FLANK		;        JA: is vorige toestand schakelaar '0' (flank)
	GOTO M_END			;              NEE: ga naar einde macro
	MOVF SERVOTIJD,w		;      	       JA: laad servotijd in array MINSERVO
	MOVWF M_MINSERVO
	MOVLW LOW M_MINSERVO		;                  en opslaan in EEPROM en einde MACRO	
	banksel EEADR		
	MOVWF EEADR 		
	banksel M_MINSERVO
	MOVF M_MINSERVO,w
	banksel EEDAT
	MOVWF EEDAT
	GOTO M_SPR23

					;INSTELLEN SERVOPULS MAX?

M_SPR20 BTFSC MAX_KEUZE			;is ingang keuze max '0'
	GOTO M_SPR30			;  NEE: ga naar TEST SERVOPULS <> SERVOPULS MAX of SERVOPULS MIN
	BTFSS FLAG,INGANG		;  JA: is schakelaar '1'
	GOTO M_SPR25			;        NEE: GA NAAR SERVO UITGANG AANSTUREN
	BTFSS FLAG,FLANK		;        JA: is vorige toestand schakelaar '0' (flank)
	GOTO M_END			;              NEE: ga naar einde macro
	MOVF SERVOTIJD,w		;      	       JA: laad servotijd in array MAXSERVO
	MOVWF M_MAXSERVO

	MOVLW LOW M_MAXSERVO		;                   en opslaan in EEPROM en einde MACRO	
	banksel EEADR		
	MOVWF EEADR 		
	banksel M_MAXSERVO
	MOVF M_MAXSERVO,w
	banksel EEDAT
	MOVWF EEDAT
M_SPR23	
	banksel EECON1			;gemeenschapelijk deel verder verloop opslag EEPROM, uitleg zie µC manual
	BCF EECON1, EEPGD 	
	BSF EECON1, WREN 	
	BCF INTCON, GIE 	
	BTFSC INTCON, GIE 	
	GOTO $-2
	MOVLW 0x55 
	MOVWF EECON2 		
	MOVLW 0xAA 
	MOVWF EECON2 		
	BSF EECON1, WR 		
	BSF INTCON, GIE 	
	BCF EECON1, WREN	
	banksel STATUS
	GOTO M_END
					;SERVO UITGANG AANSTUREN BIJ INSTELLING SERVO MIN of MAX

M_SPR25	MOVF SERVOTIJD,w		;Waarde SERVOTIJD  in Timer 2
	banksel PR2			;RAM Bankselectie 
	MOVWF PR2
	banksel TMR2
	CLRF TMR2
	BSF T2CON,TMR2ON		;Start T2
	banksel 0
	BSF M_PORTOUT,M_BITOUT		;Uitgang servo-->1
	BCF FLAG,FLAGT2			;FLAGT2-->0
M_SPR27	BTFSS FLAG,FLAGT2		;is servopuls voorbij
	GOTO M_SPR27			;  NEE: verder wachten
	BCF M_PORTOUT,M_BITOUT		;  JA: uitgang servo-->0 en einde macro
	GOTO M_END

					;SERVOPULS <> SERVOPULS MAX of SERVOPULS MIN

M_SPR30 BCF FLAG, FLAGPSZO
	DECFSZ M_TELVERT,f		;eerst persoonlijke servo vertraging aanpassen
	GOTO M_SPR31
	MOVF M_TIMSERVO,w
	MOVWF M_TELVERT

	BSF FLAG,FLAGPSZO		;is er een overgang geweest geeft dit dan aan via een flag

M_SPR31 BTFSS FLAG,INGANG		;is schakelaar '1'
	GOTO M_SPR42			;  

					;  JA: VERWERKING INDIEN SCHAKELAAR '1'
	MOVF M_PULS,w
	SUBWF M_MINSERVO,w	
	BTFSC STATUS,C			;      is servoPULS groter dan MINPULS
	GOTO M_END			;        NEE: einde macro
	MOVF M_PULS,w		;	 	 JA: Waarde servoPULS  in Timer 2
	banksel PR2			;             RAM Bankselectie 
	MOVWF PR2
	banksel TMR2
	CLRF TMR2
	BSF T2CON,TMR2ON		;             Start T2
	banksel 0
	BSF M_PORTOUT,M_BITOUT		;             Uitgang servo-->1
	BCF FLAG,FLAGT2			;             FLAGT2-->0
M_SPR35	BTFSS FLAG,FLAGT2		;             is servopuls voorbij
	GOTO M_SPR35			;               NEE: verder wachten
	BCF M_PORTOUT,M_BITOUT		;               JA: uitgang servo-->0
	BTFSS FLAG,FLAGPSZO		;		    is er een persoonlijke vertraging overgang geweest
	GOTO M_END			;		      NEE: einde macro
	DECF M_PULS,f			;		      JA: verlaag puls en einde macro
	GOTO M_END

M_SPR42					;  NEE: VERWERKING INDIEN SCHAKELAAR '0'
	MOVF M_MAXSERVO,w
	SUBWF M_PULS,w	
	BTFSC STATUS,C			;      is servoPULS kleiner dan MAXPULS
	GOTO M_END			;        NEE: einde macro
	MOVF M_PULS,w		;	 	 JA: Waarde servoPULS  in Timer 2
	banksel PR2			;             RAM Bankselectie 
	MOVWF PR2
	banksel TMR2
	CLRF TMR2
	BSF T2CON,TMR2ON
	banksel 0			;             Start T2
	BCF FLAG,FLAGT2			;             FLAGT2-->0
	BSF M_PORTOUT,M_BITOUT		;             Uitgang servo-->1
M_SPR40	BTFSS FLAG,FLAGT2		;             is servopuls voorbij
	GOTO M_SPR40			;               NEE: verder wachten
	BCF M_PORTOUT,M_BITOUT		;               JA: uitgang servo-->0
	BTFSS FLAG,FLAGPSZO		;		    is er een persoonlijke vertraging overgang geweest
	GOTO M_END			;		      NEE: einde macro
	INCF M_PULS,f			;		      JA: verhoog puls en einde macro

M_END
	ENDM


;********************************************************************
;*******  MACRO INITPULS ********************************************
;********************************************************************

INITPULS MACRO M2_PORTIN, M2_PORTBIT, M2_PULS, M2_MINSERVO, M2_MAXSERVO, M2_TIMSERVO, M2_TELVERTR, M2_OUT, M2_OUTBIT

	LOCAL M2_END, M2_SPR1

	MOVF M2_MAXSERVO,w		;afhankelijk stand schakelaar var PULS servo instellen
	MOVWF M2_PULS
	BTFSS M2_PORTIN,M2_PORTBIT
	goto M2_SPR1
	MOVF M2_MINSERVO,w
	MOVWF M2_PULS
M2_SPR1 MOVF M2_TIMSERVO,w
	MOVWF M2_TELVERTR

	BCF M2_OUT,M2_OUTBIT		;clear SERVO uitgang
M2_END

	ENDM


;********************************************************************
;*******  START ASSEMBLER CODE **************************************
;********************************************************************

		ORG     0x0000    	; processor reset vector is altijd adres 0000

		clrf PCLATH
		pagesel MAIN	
  		GOTO    MAIN        	; ga naar begin van program


;********************************************************************
;******************* INTERRUPT SERVICE ROUTINE  *********************
;********************************************************************

	     	ORG    0x0004		;startadres interrupt code is altijd adres 0004
       
ISR     	
		MOVWF W_TEMP 		;Copy W to TEMP register
		SWAPF STATUS,W 		;Swap status to be saved into W
		CLRF STATUS 		;bank 0, regardless of current bank, Clears IRP,RP1,RP0
		MOVWF STATUS_TEMP 	;Save status to bank zero STATUS_TEMP register
		MOVF PCLATH,W 		;Only required if using pages 1, 2 and/or 3
		MOVWF PCLATH_TEMP 	;Save PCLATH into W
		CLRF PCLATH 		;Page zero, regardless of current page


		BTFSS	PIR1,TMR2IF	;TIMER 2 INTERRUPT?
		GOTO ISR_SPR1
		BCF T2CON,TMR2ON	;stop timer2
		BSF FLAG,FLAGT2		;geef aan via FLAGT2=1 dat servopuls voorbij is
		BCF PIR1,TMR2IF		;wis interruptflag

END_ISR		MOVF PCLATH_TEMP, W 	;Restore PCLATH
		MOVWF PCLATH		;Move W into PCLATH
		SWAPF STATUS_TEMP,W 	;Swap STATUS_TEMP register into W
		MOVWF STATUS 		;Move W into STATUS register
		SWAPF W_TEMP,F 		;Swap W_TEMP
		SWAPF W_TEMP,W 		;Swap W_TEMP into W
       		RETFIE


ISR_SPR1 	BTFSS INTCON,T0IF	;TIMER 0 INTERRUPT?
		GOTO END_ISR
		BCF INTCON,T0IF
		BSF FLAG,FLAG20ms
		GOTO END_ISR



;********************************************************************
;********  INITIATIE  SUBROUTINE  ***********************************
;********************************************************************
	
INIT	

		;****************************************************
		;*******  INIT REGISTERS ****************************
		;****************************************************

		BCF STATUS,IRP		;voor indirect adresseren in bank 00

		BSF STATUS,RP0		;Bankselect OSCCON register
		BSF OSCCON,4		; van 4 naar 8MHz interne Oscilator
		BSF OSCCON,SCS
		BCF STATUS,RP0

		movlw b'00000001'
		movwf FLAG		;bits in FLAG register initieren  ??????
		

		;****************************************************
		;*******  INIT I/O POORTEN  *************************
		;****************************************************

		banksel ANSEL
		movlw b'10000000'
		movwf ANSEL		;ANS7 enable als analoog in (PORTE,2)
		CLRF ANSELH		;Geen analoge ingangen hoog
		
		banksel	TRISA		;0 is uitgang, 1 is ingang
		movlw b'11111111'
		movwf TRISA
		
		movlw b'00000001'		
		movwf TRISB		

		movlw b'00001111'		
		movwf TRISC	

		movlw b'11000011'		
		movwf TRISD	

		movlw b'11111101'
		movwf TRISE		

		;****************************************************
		;*******  INIT TIMER 0 ******************************
		;****************************************************

		banksel OPTION_REG
		movf OPTION_REG,w		;voor opwekking 20ms (50Hz)
		andlw b'11000000'	
		iorlw b'00000111'	
		       ;--0-----                 TOCS =0 (timer0 in timer mode)
		       ;----0---                 PSA=0 (prescaler voor timer0)
		       ;-----111                 prescaler=256
		movwf OPTION_REG 


		;****************************************************
		;*******  INIT TIMER 2 ******************************
		;****************************************************
	
		banksel T2CON
		movlw b'00100001'	;gebruikt voor opwekking servopulsen
		       ;------01         prescaler=4   =2µs	
		       ;-0100---         postscaler=1/5 =2x5=10µs per stap 10*256 stappen=2,56ms max pulsduur
		movwf T2CON


		;****************************************************
		;*******  INIT A/D CONVERTOR ************************
		;****************************************************

		banksel ADCON0
		movlw b'10011101'
		       ;10------	Fosc/32
		       ;--0111--	AN7 (portE,2)
		       ;-------1	ADC enalble
		movwf ADCON1

		;****************************************************
		;*******  INIT INTERRUPT ****************************
		;****************************************************
		
		banksel INTCON
		movlw b'11100000'
		movwf INTCON
		banksel PIE1
		movlw b'00000010'
		       ;------1-   	enable Timer 2 interrupt
		movwf PIE1

		

		;****************************************************
		;* Opvragen MIN, MAX, en VERTRAGING SERVO uit EEPROM*
		;****************************************************

		movlw 0x30		;startpositie HULPREG (aantal in te lezen data uit EEPROM)
		movwf HULPREG
		movlw 0x20		;startpositie  FSR indirect register (adres in RAM van var MINSERVO en in EEPROM)
		movwf FSR
		
I_LOOP
		banksel EEADR		;BANKSEL EEADR
		MOVF FSR,w  
		MOVWF EEADR 		;Data Memory
		
		banksel EECON1		;BANKSEL EECON1 ;
		BCF EECON1, EEPGD 	;Point to DATA memory
		BSF EECON1, RD 		;EE Read
		banksel EEDAT		;BANKSEL EEDAT ;
		MOVF EEDAT, W 		;EEdata naar POSserv,x
		movwf INDF		;
			
		incf FSR,1 		;verhoog adres 
		decf HULPREG,f		;verlaag HULPREG
		btfss STATUS,Z 		;als Carry bit <> 1 dan voer subr terug uit 
		goto I_LOOP
		banksel 0	


		;****************************************************
		;*******  INIT VARIABELEN ***************************
		;****************************************************
		
		INITPULS SCHAKELAAR1,PULS+0,MINSERVO+0,MAXSERVO+0,TIMSERVO+0,TELVERTR+0, SERVO1
		INITPULS SCHAKELAAR2,PULS+1,MINSERVO+1,MAXSERVO+1,TIMSERVO+1,TELVERTR+1, SERVO2
		INITPULS SCHAKELAAR3,PULS+2,MINSERVO+2,MAXSERVO+2,TIMSERVO+2,TELVERTR+2, SERVO3
		INITPULS SCHAKELAAR4,PULS+3,MINSERVO+3,MAXSERVO+3,TIMSERVO+3,TELVERTR+3, SERVO4
		INITPULS SCHAKELAAR5,PULS+4,MINSERVO+4,MAXSERVO+4,TIMSERVO+4,TELVERTR+4, SERVO5
		INITPULS SCHAKELAAR6,PULS+5,MINSERVO+5,MAXSERVO+5,TIMSERVO+5,TELVERTR+5, SERVO6
		INITPULS SCHAKELAAR7,PULS+6,MINSERVO+6,MAXSERVO+6,TIMSERVO+6,TELVERTR+6, SERVO7
		INITPULS SCHAKELAAR8,PULS+7,MINSERVO+7,MAXSERVO+7,TIMSERVO+7,TELVERTR+7, SERVO8
		INITPULS SCHAKELAAR9,PULS+8,MINSERVO+8,MAXSERVO+8,TIMSERVO+8,TELVERTR+8, SERVO9
		INITPULS SCHAKELAAR10,PULS+9,MINSERVO+9,MAXSERVO+9,TIMSERVO+9,TELVERTR+9, SERVO10
		INITPULS SCHAKELAAR11,PULS+.10,MINSERVO+.10,MAXSERVO+.10,TIMSERVO+.10,TELVERTR+.10, SERVO11
		INITPULS SCHAKELAAR12,PULS+.11,MINSERVO+.11,MAXSERVO+.11,TIMSERVO+.11,TELVERTR+.11, SERVO12
		INITPULS SCHAKELAAR13,PULS+.12,MINSERVO+.12,MAXSERVO+.12,TIMSERVO+.12,TELVERTR+.12, SERVO13
		INITPULS SCHAKELAAR14,PULS+.13,MINSERVO+.13,MAXSERVO+.13,TIMSERVO+.13,TELVERTR+.13, SERVO14
		INITPULS SCHAKELAAR15,PULS+.14,MINSERVO+.14,MAXSERVO+.14,TIMSERVO+.14,TELVERTR+.14, SERVO15
		INITPULS SCHAKELAAR16,PULS+.15,MINSERVO+.15,MAXSERVO+.15,TIMSERVO+.15,TELVERTR+.15, SERVO16
			
		RETURN 				;EINDE INITIATIE


;********************************************************************
;********  ADC VERWERKING  ******************************************
;********************************************************************

ADC_VERWERKING
		MOVF ADRESH,w		;ADC register ADRESH/8+1 --> VERTRAGING
		MOVWF VERTRAGING
		RRF VERTRAGING,F
		RRF VERTRAGING,F
		RRF VERTRAGING,W
		ANDLW b'00011111'
		MOVWF VERTRAGING
		INCF VERTRAGING,f

		MOVF ADRESH,w		;ADC register --> SERVOTIJD gelimiteerd tussen MINPULS en MAXPULS
		MOVWF SERVOTIJD
		SUBLW MINPULS
		BTFSS STATUS,C
		GOTO ADC_SPR1
		MOVLW MINPULS
		MOVWF SERVOTIJD
		GOTO ADC_END
ADC_SPR1	MOVF ADRESH,w
		SUBLW MAXPULS
		BTFSC STATUS,C
		GOTO ADC_END
		MOVLW MAXPULS
		MOVWF SERVOTIJD

ADC_END		BSF ADCON0,1		;herstart ADC conversie
		RETURN


;********************************************************************
;********  MAIN PROGRAM  ********************************************
;********************************************************************

		ORG 0x0800

MAIN
		pagesel INIT
		CALL INIT
		pagesel $			

LUS		
		pagesel ADC_VERWERKING
		CALL ADC_VERWERKING
		pagesel $
	
		SERVO MINSERVO+0, MAXSERVO+0, TIMSERVO+0, PULS+0, TELVERTR+0, SCHFF1,0,SCHAKELAAR1, SERVO1
		SERVO MINSERVO+1, MAXSERVO+1, TIMSERVO+1, PULS+1, TELVERTR+1, SCHFF1,1,SCHAKELAAR2, SERVO2
		SERVO MINSERVO+2, MAXSERVO+2, TIMSERVO+2, PULS+2, TELVERTR+2, SCHFF1,2,SCHAKELAAR3, SERVO3
		SERVO MINSERVO+3, MAXSERVO+3, TIMSERVO+3, PULS+3, TELVERTR+3, SCHFF1,3,SCHAKELAAR4, SERVO4
		SERVO MINSERVO+4, MAXSERVO+4, TIMSERVO+4, PULS+4, TELVERTR+4, SCHFF1,4,SCHAKELAAR5, SERVO5
		SERVO MINSERVO+5, MAXSERVO+5, TIMSERVO+5, PULS+5, TELVERTR+5, SCHFF1,5,SCHAKELAAR6, SERVO6
		SERVO MINSERVO+6, MAXSERVO+6, TIMSERVO+6, PULS+6, TELVERTR+6, SCHFF1,6,SCHAKELAAR7, SERVO7
		SERVO MINSERVO+7, MAXSERVO+7, TIMSERVO+7, PULS+7, TELVERTR+7, SCHFF1,7,SCHAKELAAR8, SERVO8

		pagesel VERVOLG	
		GOTO VERVOLG

		ORG 0x1000
VERVOLG	
		SERVO MINSERVO+8, MAXSERVO+8, TIMSERVO+8, PULS+8, TELVERTR+8, SCHFF2,0,SCHAKELAAR9, SERVO9
		SERVO MINSERVO+9, MAXSERVO+9, TIMSERVO+9, PULS+9, TELVERTR+9, SCHFF2,1,SCHAKELAAR10,SERVO10
		SERVO MINSERVO+.10,MAXSERVO+.10,TIMSERVO+.10,PULS+.10,TELVERTR+.10,SCHFF2,2,SCHAKELAAR11,SERVO11
		SERVO MINSERVO+.11,MAXSERVO+.11,TIMSERVO+.11,PULS+.11,TELVERTR+.11,SCHFF2,3,SCHAKELAAR12,SERVO12
		SERVO MINSERVO+.12,MAXSERVO+.12,TIMSERVO+.12,PULS+.12,TELVERTR+.12,SCHFF2,4,SCHAKELAAR13,SERVO13
		SERVO MINSERVO+.13,MAXSERVO+.13,TIMSERVO+.13,PULS+.13,TELVERTR+.13,SCHFF2,5,SCHAKELAAR14,SERVO14
		SERVO MINSERVO+.14,MAXSERVO+.14,TIMSERVO+.14,PULS+.14,TELVERTR+.14,SCHFF2,6,SCHAKELAAR15,SERVO15
		SERVO MINSERVO+.15,MAXSERVO+.15,TIMSERVO+.15,PULS+.15,TELVERTR+.15,SCHFF2,7,SCHAKELAAR16,SERVO16

WACHTLUS	btfss FLAG,FLAG20ms; wacht tot 20ms voorbij zijn
		goto WACHTLUS
		bcf FLAG,FLAG20ms
		MOVLW .98		;nieuwe waarde teller 0 (telt van 98-->256 = 20ms)
		MOVWF TMR0
		pagesel LUS
		goto LUS
  

;********************************************************************
;********  EEPROM WAARDES  ******************************************
;********************************************************************

		ORG 	0x2120		;start DATA EEPROM adres
					
		;bij eerste gebruik µC staan de volgende waardes in EEPROM: (waarde MAXSERVO komt overeen met 
		;middenstand nl. 1,5ms van eden servo. Altijd handig bij eerste gebruik µC met servo voor het
		;aanbrengen van de servoarm)

		DE 0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70 ;MINSERCO
		DE 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80 ;MAXSERVO
		DE 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02 ;TIMSERVO

		DE "Program om 16 servo's aan te sturen door middel van schakelaars, geschreven door Geert Giebens"


		END
;********************************************************************