;**********************************************************
;rob1-3.asm pour concours juin 08		près pour concours 2008
;avec correction stop figure
;
;avec essai correction offset moteur, ici tire à droite, plus vite moteur droit
;avec stop figure
;utilisation de l'entrée directe du capteur central CC sur RB1 nommé EDCC
;utilisation du bit de détection de marque droite cablée sur RC6 nommé BDMD, BDMD=0 si détection
;
;pour concours juin 05 avec carte de gestion des infos des capteurs
;controle suivi de piste à partir de 3 capteurs CG1,CC,CD1
;avec un mot de contrôle MCMOT et prise de raccourci si inter DIL de gauche
;
;une led orange sur RE1	allumée si aucun capteur activé
;une led verte sur RE0	allumée si robot alligné sur capteur central CC
;
;si aucun capteur activé, le robot ne s'arrête pas il continue
;avec les dernières vitesses validées
;
;avec arret si le capteur avant sur RD4 est activé, ceci avec mémorisation
;arret freiné a contre source, effet fort
;allumage LED rouge sur RE2 et arret traitement dans boucle sans fin
;
;mémorisation des 3 capteurs centraux et arrangement dans le mot POSI
;
;l'inter DIl de droite sur le CI cablé sur RD3 nommé INTD active la vitesse rapide
;l'inter DIl de gauche sur le CI cablé sur RC4 nommé INTG active la prise de raccourci
;
;INTD=0 vitesse normale, INTD=1 toutes les vitesses de suivi de piste sont augmentées de la valeur augv
;
;prise de raccourci si INTG=1 avec virage pendant une tempo et ensuite reprise traitement normal
;
;suivi de piste plus précis avec rayon large et rayon très large
;
;utilisation du registre DUR pour durée de tempo différentes
;
;mémorisation des vitesses dans les mots VLD, VINLR, VEXLR, VINTLR, VEXTLR
;et changement suivant l'état de l'inter DIL de droite INTD
;
;Jack de départ cablé sur RB4, inséré RB4 = 1, sorti RB4 = 0
;allumage led verte à l'arrière RD6 pendant la boucle du jack inséré en attente de départ
;
;réduction de vitesse si signal SRV de la carte de gestion est activé
;en cas de priorité à droite à laisser, valeur reduc, SRV est cablé sur RB5
;
;le signal DMG de détection de marque gauche de raccourci est cablé sur RC5,
;DMG = 0 pas de détection, 1 marque gauche détectée
;l'entrée RC5 porte simplement le nom DMRA
;
;**************************************************************************************************

	list p=16f877

	include "p16f877.inc"
;
POSI	equ	20h	;mot de lecture des 7 capteurs de position
MCMOT	equ	21h	;mot de contrôle des moteurs
VITG	equ	22h	;mot de vitesse du moteur gauche
VITD	equ	23h	;mot de vitesse du moteur droit
MBIT	equ	24h	;mot interne pour bit interne, MBIT,0 bit de memorisation pour capteur avant
DUR	equ	25h	;mot qui contient la durée de tempo, à charger avant la tempo
;
MVLD	equ	30h	;mot de mémorisation de vitesse en ligne droite
MVINLR	equ	31h	;mot de mémorisation de vitesse intérieure en virage large rayon
MVEXLR	equ	32h	;mot de mémorisation de vitesse extérieure en virage large rayon
MVINTLR	equ	33h	;mot de mémorisation de vitesse intérieure en virage très large rayon
MVEXTLR	equ	34h	;mot de mémorisation de vitesse extérieure en virage très large rayon
;
;
#define	CC	POSI,1	;capteur de position central,			aprés inversion par la carte de gestion
#define	CD1	POSI,0	;capteur de position un rang à droite		capteur sur la piste	=> sortie CNY70 = OV
#define	CG1	POSI,2	;capteur de position un rang à gauche					=> sortie carte gestion = 5V
;												=> pg PIC bit CXX = 1
#define	LEDV	PORTE,0	;led verte sur RE0
#define	LEDO	PORTE,1	;led orange sur RE1
#define	LEDR	PORTE,2	;led rouge sur RE2
#define	LEDVA	PORTD,6	;led verte à l'arrière sur RD6
#define BUZ	PORTD,2	;sortie RD2 sur buzzer
;
#define	CAPAV	PORTD,4	;capteur 2 inter avant,	relaché RD4=CAPAV=1, 1 appuyé RD4=CAPAV=0 => arrêt
#define	MCPAV	MBIT,0	;bit de mémorisation du capteur avant
;
#define	JACK	PORTB,4	;entrée Jack,	RB4=JACK=1 inséré => arrêt,	RB4=JACK=0 sorti => marche
#define	BPAD	PORTC,7	;bouton poussoir à l'arrière droite sur RC7
#define	BPAG	PORTD,5	;bouton poussoir à l'arrière gauche sur RD5 pour test 3 ou 7 capteurs
#define	INTD	PORTD,3	;inter DIL de droite pour valider la vitesse rapide
#define	DMCR	MBIT,1	;bit de détection de marque droite de croissement
#define	INTG	PORTC,4	;inter DIL de gauche pour valider la prise de raccourci
;
#define	DMRA	PORTC,5	;signal de détection de marque gauche de raccourci venant de la carte de gestion des capteurs
#define	SRV	PORTB,5	;signal de commande de réduction de vitesse venant de la carte de gestion des capteurs
;
#define	EDCC	PORTB,1	;entrée directe capteur central CC
#define	BDMD	PORTC,6	;entrée bit de détection de marque droite pour stop figure
;
;
;assignation des valeurs de vitesse
;
vld		equ	080h	;valeur de la vitesse en ligne droite, 098h avant
vinlr	equ	002h	;valeur de la vitesse interieure en virage large rayon
vexlr	equ	0A0h	;valeur de la vitesse extérieure en virage large rayon
;
vintlr	equ	078h	;valeur de la vitesse intérieure en virage très large rayon
vextlr	equ	088h	;valeur de la vitesse extérieure en virage très large rayon
;
vdhl	equ	080h	;vitesse de démarrage hors ligne
durf	equ	0FFh	;durée de la tempo de freinage, ici 0,065s
durvra	equ	0FFh	;durée de la tempo de virage de raccourci, ici 0,065s
dursf1	equ	070h	;durée de la tempo 1 de détection de stop figure, ici 125d = 07Dh => 125*256*1µs = 0,032s
dursf2	equ	050h	;durée de la tempo 2 de détection de stop figure, ici 97d = 061h => 97*256*1µs = 0,025s
durstf	equ	0FFh	;durée de la tempo pour atteinte stop figure
durstpf	equ	0FFh	;durée de la tempo de rotation stop figure 3/4 tour
;durtour	equ	020h	;duree du tour
vfr		equ	090h	;vitesse de freinage
;
vldra	equ	0A0h	;vitesse de ligne droite d'atteinte du raccourci
vinra	equ	030h	;vitesse intérieure en virage d'atteinte de raccourci
vexra	equ	0C0h	;vitesse extérieure en virage d'atteinte de raccourci, avant 0BDh
;
augv	equ	05h		;valeur d'augmentation des vitesses si inter DIL de droite INTD = 1
reduc	equ	080h	;valeur de réduction des vitesses si priorité à droite à laisser
;
vffs	equ	040h	;vitesse de freinage avant figure de stop
vafs	equ	080h	;vitesse de figure de stop en marche arrière
;
ofsmd	equ	06h		;offset plus vite moteur droit
;
vstpf	equ	070h	;vitesse moteurs rotation stop figure
;*******************************************************************************
;
	;début vecteur de reset adresse 0

	org	0
	nop
debut
;initialisation des bits de sortie de commande des moteurs et buzzer
	banksel	PORTC
	bcf	PORTC,0		;arrêt moteur gauche
	bcf	PORTC,3		;arrêt moteur droit
	bcf	BUZ		;arrêt buzzer
;
	banksel	TRISC
	bcf	TRISC,0		;sortie RC0 inhibition moteur gauche
	bcf	TRISC,3		;sortie RC3 inhibition moteur droit
;
	bcf	TRISD,0		;sortie sens de marche moteur gauche
	bcf	TRISD,1		;sortie sens de marche moteur droit
	bcf	TRISD,2		;sortie buzzer
	bcf	TRISD,6		;sortie LED verte à l'arrière
;
	banksel	MCMOT
	clrf	MCMOT		;arrêt des moteurs par sécurité
	clrf	VITD
	clrf	VITG		;vitesses nulles
;
;commande PWM sur RC2 pour moteur droit
	banksel PR2
	movlw	0C0h		;0C0h = 192d
	movwf	PR2		;(1) écriture de la période dans PR2  (192 + 1)*1µs*4=0,772 ms => f=1295Hz
;
	banksel	CCPR1L
	movlw	00h
	movwf	CCPR1L		;(2) écriture de la durée th = 0 dans CCPR1L par sécurité
	bcf	CCP1CON,4
	bcf	CCP1CON,5	;2 bits de poids faible de th	
;
	banksel TRISC
	bcf	TRISC,2		;(3) RC2 en sortie
;
	banksel	T2CON
	bsf	T2CON,0
	bcf	T2CON,1		;(4) prediviseur par 4 pour TIMER2
	bsf	T2CON,2		;activation TIMER2
;
	banksel CCP1CON
	bsf	CCP1CON,2
	bsf	CCP1CON,3	;(5) configuration en mode PWM
;
;commande PWM sur RC1 pour moteur gauche
;
	banksel	CCPR2L
	movlw	00h
	movwf	CCPR2L		;(2) écriture de la durée th = 0 dans CCPR1L par sécurité
	bcf	CCP2CON,4
	bcf	CCP2CON,5	;2 bits de poids faible de th	
;
	banksel TRISC
	bcf	TRISC,1		;(3) RC1 en sortie
;
	banksel CCP2CON
	bsf	CCP2CON,2
	bsf	CCP2CON,3	;(5) configuration en mode PWM
;
;configuration de la tempo
	banksel	OPTION_REG
	bcf	OPTION_REG,T0CS	;timer0 avec horloge interne
	bcf	OPTION_REG,PSA	
	bsf	OPTION_REG,PS2
	bsf	OPTION_REG,PS1
	bsf	OPTION_REG,PS0	;prédiviseur par 256, avec DUR=FFh	durée de tempo=256*256*1µs=0,06553s
;
;configuration du port B
	banksel	TRISB
	movlw	b'11111111'
	movwf	TRISB		;PORTB en entrée pour lecture des capteurs CG1,CC,CD1 sur RB2,1,0 et jack sur RB4
;
;configuration du port E
	banksel TRISE
	movlw	00h
	movwf	TRISE		;port E en sortie pour les LED
	banksel ADCON1
	bsf	ADCON1,1
	bsf	ADCON1,2
	bcf	ADCON1,3	;port E en digital et port A en digital, A non utilisé
;
;extinction des LED pour état initial
	banksel	PORTE
	bcf	LEDV
	bcf	LEDO
	bcf	LEDR
;
;*******************************************************************************************************
bouclpp
	clrwdt
	banksel	PORTB
;
;lecture et sauvegarde des capteurs pour traitement synchrone
	movf	PORTB,W		
	andlw	007h		;masquage pour garder que les trois bits de droite CG1,CC,CD1
	movwf	POSI
;
;************  affichage 3 capteurs de position
;
;********   LED verte sur RE0 allumée si capteur central CC activé
	btfsc	CC		;test capteur central
	bsf	LEDV		;capteur central = 1  => allumage led verte
	btfss	CC
	bcf	LEDV		;capteur central = 0  => extinction led verte
;
;********   LED orange sur RE1 allumée si aucun capteur activé
	movf	POSI,W
	andlw	b'00000111'	;masquage pour avoir ici que CG1,CC,CD1
	btfss	STATUS,Z
	goto	adldr1
	bsf	LEDO		;ici aucun capteur activé => allumage LED orange
	goto	adldrfin
adldr1	bcf	LEDO		;ici un capteur activé => extinction LED orange
;
adldrfin
;
;***********************************************************************************
;
;test du jack pour autorisation de marche
	btfsc	JACK
	goto	arret		;ici le jack est inséré => RB4=1  => arrêt
	goto	suitj		;ici le jack est retiré => départ marche en avant
arret	bcf	MCMOT,0		;arret moteur gauche
	bcf	MCMOT,1		;arret moteur droit
	movlw	vdhl
	movwf	VITG
	movwf	VITD		;chargement des vitesses de démarrage hors ligne	
	call	commot		;ici entrée jack = 0  => arrêt moteur et gestion commande moteur
	bsf	MCPAV		;mise à un du bit de mémorisation pour capteur avant
	bsf	LEDVA		;allumage led verte à l'arrière pour contrôle départ
	goto	bouclpp		;recommencer au début de boucle principale
;
suitj	bcf	LEDVA		;extinction led verte à l'arrière
;
;**************************************************************************************************
;
;********	mémorisation des vitesses suivant l'inter INTD lente ou rapide
;
	movlw	vld
	movwf	MVLD
	movlw	vexlr
	movwf	MVEXLR
	movlw	vinlr
	movwf	MVINLR
	movlw	vextlr
	movwf	MVEXTLR
	movlw	vintlr
	movwf	MVINTLR
;
	btfss	INTD		;test inter DIL de droite INTD pour lente ou rapide
	goto	suita		;ici INTD = 0 => pas d'augmentation des vitesses
;
;	ici INTD=1 => augmentation des vitesses de marche normale
	movlw	augv
	addwf	MVLD,f		;augmentation vitesse en ligne droite
	movlw	augv
	addwf	MVEXLR,f	;augmentation vitesse extérieure en virage large rayon
	movlw	augv
	addwf	MVINLR,f	;augmentation vitesse intérieure en virage large rayon
	movlw	augv
	addwf	MVEXTLR,f	;augmentation vitesse extérieure en virage très large rayon
	movlw	augv
	addwf	MVINTLR,f	;augmentation vitesse intérieure en virage très large rayon
;
suita
;
;*******	réduction des vitesses si SRV activé en cas de priorité à droite à laisser
;
	btfss	SRV
	goto	suitb		;ici SRV = 0  marche normale
;				;ici SRV = 1	priorité à laisser => réduction des vitesses
	btfss	CC			;test capteur central CC pour réduire les vitesse que si CC=1
	goto	suitb		;ici CC=0 => pas de réduction
;
	clrf	MVLD		;vitesse en ligne droite = 0 pour arret total
;
	clrf	MVEXTLR		; 0 pour arret total en très large rayon
;
	clrf	MVINTLR		; 0 pour arret total en très large rayon
;
	movlw	reduc
	subwf	MVEXLR,f	;reduction vitesse extérieure en virage large rayon MVEXLR - reduc -> MVEXLR
	btfss	STATUS,C	;test si dépassement en négatif
	clrf	MVEXLR		;ici résultat négatif => forcé à 0
;
	movlw	reduc
	subwf	MVINLR,f	;reduction vitesse intérieure en virage large rayon
	btfss	STATUS,C
	clrf	MVINLR		;ici résultat négatif => forcé à 0
;
suitb
;********	calcul des vitesses moteurs suivant états des capteurs
;
	btfss	CD1
	goto	st1
	btfss	CG1
	goto	st1 
	movf	MVLD,W		;ici les capteurs CD1 et CG1 = 1  => tout droit
	movwf	VITD
	movwf	VITG
	goto	fintest
;
st1	btfss	CD1		;test du capteur de position un rang à droite 
	goto	st2
	btfss	CC
	goto	st11
	movf	MVEXTLR,W	;ici le capteur CD1 = 1 et CC = 1 => virage de très large rayon à droite
	movwf	VITG		;vitesse extérieure très large rayon => vitesse gauche
	movf	MVINTLR,W
	movwf	VITD		;vitesse intérieure très large rayon => vitesse droite
	goto	fintest
;
st11	movf	MVEXLR,W	;ici le capteur CD1 = 1 et CC = 0 => virage de large rayon à droite
	movwf	VITG		;vitesse extérieure large rayon => vitesse gauche
	movf	MVINLR,W
	movwf	VITD		;vitesse intérieure large rayon => vitesse droite
	goto	fintest
;
st2	btfss	CG1		;test du capteur de position un rang à gauche 
	goto	st3
	btfss	CC
	goto	st21
	movf	MVINTLR,W	;ici le capteur CG1 = 1 et CC = 1 => virage de très large rayon à gauche
	movwf	VITG		;vitesse intérieure très large rayon => vitesse gauche
	movf	MVEXTLR,W
	movwf	VITD		;vitesse extérieure très large rayon => vitesse droite
	goto	fintest
;
st21	movf	MVINLR,W	;ici le capteur CG1 = 1 et CC = 0 => virage de large rayon à gauche
	movwf	VITG		;vitesse intérieure large rayon => vitesse gauche
	movf	MVEXLR,W
	movwf	VITD		;vitesse extérieure large rayon => vitesse droite
	goto	fintest
;
st3	btfss	CC		;test du capteur central
	goto	fintest		;aucun capteur CC, CD1 et CG1 activé => vitesses non changées
	movf	MVLD,W
	movwf	VITD
	movf	MVLD,W
	movwf	VITG		;capteur central = 1 => vitesse ligne droite = vitesse droite et gauche
;
fintest
;
;********	activation des moteurs par le mot de controle MCMOT
;
	bcf	MCMOT,2		;marche avant moteur gauche
	bcf	MCMOT,3		;marche avant moteur droit
	bsf	MCMOT,0		;autorisation de marche moteur gauche
	bsf	MCMOT,1		;autorisation de marche moteur droit
;
;******** test capteur avant
;
	btfss	CAPAV
	bcf	MCPAV		;ici capteur avant activé (RD4 à 0) => mise à 0 du bit mémoire MCPAV
;
	btfsc	MCPAV
	goto	suicom		;ici le capteur avant n'a pas été activé => commande vitesse normale
	bcf	MCMOT,0
	bcf	MCMOT,1		;le capteur avant a été activé => arrêt des moteurs et ensuite freinage
;
	call	commot		;sous programme de commande des moteurs
;
;freinage rapide à contre source suivi d'un arret de traitement dans boucle sans fin avec sortie par BPAG
	movlw	vfr
	movwf	VITD
	movwf	VITG		;mise en vitesse de freinage
;
	bsf	MCMOT,2		;marche arriere moteur gauche
	bsf	MCMOT,3		;marche arriere moteur droit
	bsf	MCMOT,0	
	bsf	MCMOT,1		;mise en marche des moteurs
	call	commot		;commande moteur pour marche arriere
;
	bsf	LEDO		;allumage de la LED orange pendant le freinage
	movlw	durf
	movwf	DUR		;chargement durée de tempo de freinage
	call	tempo
	call	tempo		;2 tempo de 0,065s = 0,130 s
	bcf	LEDO
;
	bcf	MCMOT,0
	bcf	MCMOT,1		;arret des moteurs
	call	commot
;
adbo	bsf	LEDR		;allumage Led rouge après collision
	btfsc	BPAG
	goto	adbo		;arret collision, attente appui sur bouton poussoir arrière gauche BPAG
	bcf	LEDR
	goto	debut		;déblocage et recommencer au début
;
suicom
;
;*****************************************************************************************************
;
;*****  test et action stop figure
;
;************************************************
;
;macro test stop figure = TESTSF
;
testsf	macro
		btfss	EDCC		;test si entrée capteur central = 1
		goto	adfsf		;ici l'entrée directe capteur central CC n'est plus sur la ligne => abandon stop figure
		btfsc	SRV		;test si entrée SRV = 0
		goto	adfsf		;ici détection priorité à droite => abandon stop figure
	endm
;*******************************
;
	btfsc	BDMD		;test si marque droite détectée
	goto	adfsf		;signal marque droite =1, marque non détectée => suivi normal
;
;ici marque droite détectée une première fois => tempo 1
	movlw	dursf1
	movwf	DUR		;chargement durée de tempo 1 de détection stop figure
	call	tempo		;marque droite détectée => tempo 1
;
	testsf			;macro test capteur central=1 et pas de priorité à droite
;*************	btfss	BDMD		;test si marque droite disparue
;*************	goto	adfsf		;signal marque droite =0, marque non disparue => abandon stop figure
;
	movlw	dursf2
	movwf	DUR		;chargement durée de tempo 2 de détection stop figure
	call	tempo		;marque droite disparue => tempo 2
;
	testsf			;macro test capteur central=1 et pas de priorité à droite
	btfsc	BDMD		;test si marque droite réapparue
	goto	adfsf		;signal marque droite =1, marque non réapparue => abandon stop figure
;
;*******************************
;ici il y a eu détection des deux marques stop figure => arret freiné
;
	movlw	durstf
	movwf	DUR			;chargement durée de tempo de stop figure
	call	tempo		;tempo avant arret
	call	tempo		;tempo avant arret
	call	tempo		;tempo avant arret
	call	tempo		;tempo avant arret
	call	tempo		;tempo avant arret
	call	tempo		;tempo avant arret
	call	tempo		;tempo avant arret
	call	tempo		;tempo avant arret
	call	tempo		;tempo avant arret
;
	bcf	MCMOT,0
	bcf	MCMOT,1		; => arrêt des moteurs et ensuite freinage
;
	call	commot		;sous programme de commande des moteurs
;
;freinage rapide à contre source puis figure de stop
	movlw	vffs		;vitesse de freinage avant figure de stop
	movwf	VITD
	movwf	VITG		;mise en vitesse de freinage
;
	bsf	MCMOT,2		;marche arriere moteur gauche
	bsf	MCMOT,3		;marche arriere moteur droit
	bsf	MCMOT,0	
	bsf	MCMOT,1		;mise en marche des moteurs
	call	commot		;commande moteur pour marche arriere
;
	movlw	durf
	movwf	DUR		;chargement durée de tempo de freinage
	call	tempo
	call	tempo
	call	tempo		;3 tempo de 0,065s = 0,195 s
;
	bcf	MCMOT,0
	bcf	MCMOT,1		;arret des moteurs
	call	commot
;
;***** figure de stop = 360
	movlw	vstpf
	movwf	VITD
	movwf	VITG		;mise en vitesse de rotation stop figure
;
	bcf	MCMOT,2		;marche avant moteur gauche
	bsf	MCMOT,3		;marche arrière moteur droit
	bsf	MCMOT,0	
	bsf	MCMOT,1		;mise en marche des moteurs
	call	commot		;commande moteur pour marche arriere
;*****************************************************************
	movlw	durstpf
	movwf	DUR			;chargement durée de tempo de rotation
	call	tempo		;tempo pour quitter la piste
	call	tempo
	call	tempo
	call	tempo
;
bcstf1	
	btfss	PORTB,1	;test si capteur central RB1 =1
	goto	bcstf1
;ici le robot a fait un 1/2 tour, on continue l'autre demi tour
	call tempo
bcstf2	
	btfss	PORTB,1	;test si capteur central RB1 =1
	goto	bcstf2
;ici le robot a fait un tour complet et a dépassé la ligne
	bsf	MCMOT,2		;marche arrière moteur gauche	pour tourner et rejoindre la piste
	bcf	MCMOT,3		;marche avant moteur droit
	bsf	LEDR
bcstf3	
	btfss	PORTB,1	;test si capteur central RB1 =1 pour revenir sur la piste
	goto	bcstf3
	bcf		LEDR
;
adfsf				;adresse de fin de stop figure pour ensuite suivi normal en recommençant la boucle principale
;
;*****************************************************************************************************
;
;*****	test pour raccourci ou non
	btfss	INTG		;test inter DIL de gauche INTG
	goto	adcom		;ici INTG=0 => suivi normal
	btfss	DMRA		;test détection de marque de raccourci
	goto	adcom		;ici pas de marque de raccourci détectée => suivi normal
;
	movlw	vinra		;ici sortie de ligne pour raccourci => virage à gauche
	movwf	VITG		;vitesse interieure d'atteinte de raccourci => vitesse gauche
	movlw	vexra
	movwf	VITD		;vitesse extérieure d'atteinte de raccourci => vitesse droite
	call	commot
;
	bsf	LEDR		;allumage LED rouge pendant le virage
	movlw	durvra
	movwf	DUR		;chargement durée de tempo de virage de raccourci
	call	tempo
	call	tempo
	call	tempo
	call	tempo
	call	tempo
	call	tempo
	call	tempo		;ici 7 tempo, durée de virage 7 * 0,065s = 0,455s
	bcf	LEDR		;extinction LED rouge en fin de virage
;
	movlw	vldra
	movwf	VITD
	movwf	VITG		;mise en vitesse d'atteinte de raccourci en ligne droite	
;
adcom	call	commot
	goto	bouclpp		;recommencer la boucle principale
;
;*****************************************************************************************************      
;
commot
;********      commande moteur gauche

	bcf	STATUS,RP0
	bcf	STATUS,RP1	;page 0
;
	btfss	MCMOT,0		;test du bit d'autorisation de marche
	goto	stopg		;inhibition => arrêt moteur gauche
	btfsc	MCMOT,2		;ici autorisation de marche => test du bit de sens de rotation
	goto	marg		;=> marche arrière
;
	bcf	PORTD,0		;marche avant => RD0 = 0
	movf	VITG,W
	banksel	CCPR2L
	movwf	CCPR2L		;(2) écriture de la durée th dans CCPR2L rapport cyclique moteur gauche
	banksel PORTC
	bsf	PORTC,0		;autorisation de marche => RC0 = 1
	goto	finmg
;
marg	bsf	PORTD,0		;marche arrière => RD0 = 1
	movf	VITG,W
	sublw	0C0h		;complémentation du rapport cyclique pour marche arrière
	movwf	CCPR2L		;(2) écriture de la durée th dans CCPR2L rapport cyclique moteur gauche
	banksel PORTC
	bsf	PORTC,0		;autorisation de marche => RC0 = 1
	goto	finmg
;
stopg	bcf	PORTC,0		;arrêt moteur gauche => RC0 = 0		
;
finmg	nop
;
;********      commande moteur droit
;
	bcf	STATUS,RP0
	bcf	STATUS,RP1	;page 0
;
	btfss	MCMOT,1		;test du bit d'autorisation de marche
	goto	stopd		;inhibition => arrêt moteur droit
	btfsc	MCMOT,3		;ici autorisation de marche => test du bit de sens de rotation
	goto	mard		;=> marche arrière
;
	bcf	PORTD,1		;marche avant => RD1 = 0
	movf	VITD,W
;correction offset
	addlw	ofsmd		;ajout de l'offset
	btfss	STATUS,C	;test de dépassement de FF
	goto	admd
	movlw	0C0h	;butée maximum de vitesse moteur droit
;
admd
	banksel	CCPR1L
	movwf	CCPR1L		;(2) écriture de la durée th dans CCPR1L rapport cyclique moteur droit
	banksel PORTC
	bsf	PORTC,3		;autorisation de marche => RC3 = 1
	goto	finmd
;
mard	bsf	PORTD,1		;marche arrière => RD1 = 1
	movf	VITD,W
	sublw	0C0h		;complémentation du rapport cyclique pour marche arrière
	movwf	CCPR1L		;(2) écriture de la durée th dans CCPR1L rapport cyclique moteur droit
	banksel PORTC
	bsf	PORTC,3		;autorisation de marche => RC3 = 1
	goto	finmd
;
stopd	bcf	PORTC,3		;arrêt moteur droit => RC3 = 0		
;
finmd	return
;
;*******************************************************************************
;       
;routine de temporisation par débordement du timer
tempo   clrwdt
	bcf	STATUS,RP0
	bcf	STATUS,RP1	;page 0
	bcf     INTCON,T0IF	;raz du bit T0IF de débordement du timer0
	movf	DUR,W	        ;registre durée tempo DUR -> W
	sublw   0               ;0-W -> W
	movwf   TMR0
adtp1   nop
	btfss   INTCON,T0IF        ;saut si débordement du timer0
	goto    adtp1
	return
;
;*******************************************************************************
;
	end
