Programme total

;**********************************************************************
;   Ce fichier est la base de départ pour une programmation avec      *
;   le PIC 16F84. Il contient  les informations de  base pour         *
;   démarrer.                                                         *  
;                                                                     *
;   Si les interruptions ne sont pas utilisées, supprimez les lignes  *
;   entre ORG 0x004 et l'étiquette init. De plus, les variables       *
;   w_temp et status_temp peuvent être supprimées.                    *
;                                                                     *
;**********************************************************************
;                                                                     *
;    NOM:       FL                                                    *
;    Date:      27/02/06                                              *
;    Version:   0.7                                                   *
;    Circuit:   Carte PIC                                             *
;    Auteur:    Captain H@dock                                        *
;                                                                     *
;**********************************************************************
;                                                                     *
;    Fichier requis: P16F84.inc                                       *
;                                                                     *
;                                                                     *
;                                                                     *
;**********************************************************************
;                                                                     *
;    Notes: Le programme du robot tend à être complet.                *
;                                                                     *
;                                                                     *
;                                                                     *
;**********************************************************************


	LIST      p=16F84 		; Définition de processeur
	#include <p16F84.inc> 		; Définitions des constantes

	__CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC

; '__CONFIG' précise les paramètres encodés dans le processeur au moment de
; la programmation du processeur. Les définitions sont dans le fichier include.
; Voici les valeurs et leurs définitions :
;	_CP_ON				Code protection ON : impossible de relire
;	_CP_OFF				Code protection OFF
;	_PWRTE_ON			Timer reset sur power on en service
;	_PWRTE_OFF			Timer reset hors-service
;	_WDT_ON				Watch-dog en service
;	_WDT_OFF			Watch-dog hors service
;	_LP_OSC				Oscillateur quartz basse vitesse
;	_XT_OSC				Oscillateur quartz moyenne vitesse
;	_HS_OSC				Oscillateur quartz grande vitesse
;	_RC_OSC				Oscillateur à réseau RC

;*********************************************************************
;                              ASSIGNATIONS                          *
;*********************************************************************

OPTIONVAL	EQU	B'00000000'	; RBPU     b7 : 1= Résistance rappel +5V hors service
							; INTEDG   b6 : 1= Interrupt sur flanc montant de RB0
							;               0= Interrupt sur flanc descend. de RB0
							; TOCS      b5 : 1= source clock = transition sur RA4
							;                0= horloge interne
							; TOSE      b4 : 1= Sélection flanc montant RA4(si B5=1)
							;                0= Sélection flanc descendant RA4
							; PSA       b3 : 1= Assignation prédiviseur sur Watchdog
							;                0= Assignation prédiviseur sur Tmr0
							; PS2/PS0   b2/b0 valeur du prédiviseur
                        	;           000 =  1/1 (watchdog) ou	1/2 (tmr0)
							;           001 =  1/2           		1/4
							;           010 =  1/4		     		1/8
							;           011 =  1/8		     		1/16
							;           100 =  1/16		     		1/32
							;           101 =  1/32		     		1/64
							;           110 =  1/64		     		1/128
							;           111 =  1/128	     		1/256


INTERMASK	EQU B'00000000'	; GIE       b7 : masque autorisation générale interrupt
                        	;                ne pas mettre ce bit à 1 ici
                        	;                sera mis en temps utile
							; PEIE      b6 : masque autorisation générale périphériques
							; T0IE      b5 : masque interruption tmr0
							; INTE      b4 : masque interuption RB0/Int
							; RBIE      b3 : masque interruption RB4/RB7
							; T0IF      b2 : flag tmr0
							; INTF      b1 : flag RB0/Int
							; RBIF      b0 : flag interruption RB4/RB7

;*********************************************************************
;                             DEFINE                                 *
;*********************************************************************

; exemples
; ---------
#DEFINE CAP_OB	PORTB,0		; Capteur d'obstacle
#DEFINE BUZZ	PORTB,1		; Buzzer d'information
#DEFINE MOT_D_1	PORTB,2		; Commande du moteur droit sens 1
#DEFINE MOT_D_2	PORTB,3		; Commande du moteur droit sens 2
#DEFINE MOT_G_1	PORTB,4		; Commande du moteur gauche sens 1
#DEFINE MOT_G_2	PORTB,5		; Commande du moteur gauche sens 2
#DEFINE CAP_L_D	PORTB,6		; Capteur de la ligne droite
#DEFINE CAP_L_G	PORTB,7		; Capteur de la ligne gauche

#DEFINE FEUX_ST	PORTA,0		; Del des feux stop
#DEFINE DEL_1	PORTA,1		; Del d'info
#DEFINE DEL_2	PORTA,2		; Del d'info
#DEFINE DEL_3	PORTA,3		; Del d'info
#DEFINE BP_STAR	PORTA,4		; Bouton poussoir de départ

;Tris associés :
; TRISB 1100 0001
; TRISA    1 0000

;*********************************************************************
;                             MACRO                                  *
;*********************************************************************

;Exemple
;-------
LIREIN 	macro	
		comf PORTB,0
		andlw	1
		endm


;*********************************************************************
;                   DECLARATIONS DE VARIABLES                        *
;*********************************************************************

;exemples
;---------
	CBLOCK 0x00C   		; début de la zone variables
	w_temp :1		; Zone de 1 byte
	status_temp : 1		; zone de 1 byte
	cmpt1 : 1		; compteur de boucles 1
	cmpt2 : 1		; compteur de boucles 2
	cmpt3 : 1		; compteur de boucles 3
	cmpt4 : 1		; compteur de boucles 4
	rotled : 1		; zone de rotation des LED
	nb_tempo : 1		; Paramètre de durée de la fonction tempo
	dmtmp : 1		;Temps de demi tour
	ENDC			; Fin de la zone

;**********************************************************************
;                      DEMARRAGE SUR RESET                            *
;**********************************************************************

	org     0x000 		; Adresse de départ après reset
  	goto    init		; Adresse 0: initialiser

;**********************************************************************
;                     ROUTINE INTERRUPTION                            *
;**********************************************************************

			;sauvegarder registres	
			;---------------------
	ORG 	0x004		; adresse d'interruption
	movwf	w_temp  	; sauver registre W
	swapf	STATUS,w	; swap status avec résultat dans w
	movwf	status_temp	; sauver status swappé

			; switch vers différentes interrupts
			; inverser ordre pour modifier priorités
			;----------------------------------------
	
	btfsc	INTCON,T0IE	; tester si interrupt timer autorisée
	btfss	INTCON,T0IF	; oui, tester si interrupt timer en cours
	goto 	intsw1		; non test suivant
	call	inttimer	; oui, traiter interrupt timer
	bcf	INTCON,T0IF	; effacer flag interrupt timer
	goto	restorereg	; et fin d'interruption
	        		; SUPPRIMER CETTE LIGNE POUR
				; TRAITER PLUSIEURS INTERRUPT
				; EN 1 SEULE FOIS

intsw1
	btfsc	INTCON,INTE	; tester si interrupt RB0 autorisée
	btfss	INTCON,INTF	; oui, tester si interrupt RB0 en cours
	goto 	intsw2		; non sauter au test suivant
	call	intrb0		; oui, traiter interrupt RB0
	bcf	INTCON,INTF	; effacer flag interupt RB0
	goto	restorereg	; et fin d'interruption
				; SUPPRIMER CETTE LIGNE POUR
				; TRAITER PLUSIEURS INTERRUPT
				; EN 1 SEULE FOIS

intsw2
	btfsc	INTCON,RBIE	; tester si interrupt RB4/7 autorisée
	btfss	INTCON,RBIF	; oui, tester si interrupt RB4/7 en cours
	goto 	intsw3		; non sauter
	call	intrb4		; oui, traiter interrupt RB4/7
	bcf	INTCON,RBIF	; effacer flag interupt RB4/7
	goto	restorereg	; et fin d'interrupt

intsw3

				;restaurer registres
				;-------------------
restorereg
	swapf	status_temp,w	; swap ancien status, résultat dans w
	movwf   STATUS		; restaurer status
	swapf   w_temp,f	; Inversion L et H de l'ancien W
                       		; sans modifier Z
	swapf   w_temp,w  	; Réinversion de L et H dans W
				; W restauré sans modifier status
	retfie  		; return from interrupt

;**********************************************************************
;                     INTERRUPTION TIMER 0                            *
;**********************************************************************
inttimer
	return			; fin d'interruption timer
				; peut être remplacé par
				; retlw pour retour code d'erreur

;**********************************************************************
;                     INTERRUPTION RB0/INT                            *
;**********************************************************************
intrb0
	return			; fin d'interruption RB0/INT
				; peut être remplacé par
				; retlw pour retour code d'erreur

;**********************************************************************
;                     INTERRUPTION RB0/RB4                            *
;**********************************************************************
intrb4
	movf PORTB,w		; indispensable pour pouvoir resetter RBIF
	return			; fin d'interruption RB0/RB4
				; peut être remplacé par
				; retlw pour retour code d'erreur


;*********************************************************************
;                       INITIALISATIONS                              *
;*********************************************************************

init
	clrf	PORTA		; Sorties portA à 0
	clrf	PORTB		; sorties portB à 0
	clrf	EEADR		; permet de diminuer la consommation
	bsf	STATUS,RP0	; sélectionner banque 1
	movlw	OPTIONVAL	; charger masque
	movwf	OPTION_REG	; initialiser registre option

				; Effacer RAM
				; ------------
	movlw	0x0c		; initialisation pointeur
	movwf	FSR		; pointeur d'adressage indirec
init1
	clrf	INDF		; effacer ram
	incf	FSR,f		; pointer sur suivant
	btfss	FSR,6		; tester si fin zone atteinte (>=40)
	goto	init1		; non, boucler
	btfss	FSR,4		; tester si fin zone atteinte (>=50)
	goto	init1		; non, boucler



;Definition des tris
	movlw	B'10000'	; Valeur du TRISA
	movwf	TRISA		; Affectation au TRISA
	movlw	B'11000001'	; Valeur du TRISB
	movwf	TRISB		; Affectation au TRISB
;Tris définis.


	bcf	STATUS,RP0	; Sélectionner banque 0
	movlw	INTERMASK	; masque interruption
	movwf	INTCON		; charger interrupt control

	goto 	start		; Lancer le programme

;*********************************************************************
;                      SOUS-ROUTINE DE TEMPORISATION                 *
;*********************************************************************
;---------------------------------------------------------------------
; Cette sous-routine introduit un retard.
; Elle ne reçoit un paramètre, le nombre de boucle par la variable
; nb_tempo et n'en retourne aucun.
;---------------------------------------------------------------------
tempo
	;Avant la tempo donner la durée avec
;	movlw	1		; pour 2 boucles
;	movwf	nb_tempo	; Affectation à nombre de tempo

	movf	nb_tempo,w	; Récupération du nombre de tempo
	movwf	cmpt3		; Affectation à cmpt3
boucle3
	movlw	B'00001111'	; Valeur de la tempo 0xFF=MAX 0x0=MIN
	movwf	cmpt2		; Affectation à cmpt2
boucle2
	clrf	cmpt1		; effacer compteur1
boucle1
	decfsz	cmpt1,f		; décrémenter compteur1
	goto	boucle1		; si pas 0, boucler
	decfsz	cmpt2,f 	; si 0, décrémenter compteur 2
	goto	boucle2		; si cmpt2 pas 0, recommencer boucle1
	decfsz	cmpt3,f		; si 0, décrémenter compteur 3
	goto	boucle3		; si cmpt3 pas 0, recommencer boucle2
	return			; retour de la sous-routine

;---------------------------------------------------------------------
; Cette sous-routine fait faire 180° pour voir le temps de demi-tour.
; Ce temps est stoqué dans dmtmp, puis divisé par deux; 
; Elle ne reçoit un paramètre, le nombre de boucle par la variable
; nb_tempo et n'en retourne aucun.
;---------------------------------------------------------------------
tempocalc
	clrf	dmtmp		; effacer compteur3
	bsf	MOT_G_1		; Allumer le moteur gauche dans le sens1
	bsf	MOT_D_2		; Allumer le moteur droit dans le sens2
bouclec3
	movlw	B'00001111'	; Valeur de la tempo 0xFF=MAX 0x0=MIN
	movwf	cmpt2		; Affectation à cmpt2
bouclec2
	clrf	cmpt1		; effacer compteur1
bouclec1
	btfsc	CAP_L_D		; Si ligne pas atteinte
	goto	endofcalc	; sortir
	decfsz	cmpt1,f		; décrémenter compteur1
	goto	bouclec1	; si pas 0, boucler
	decfsz	cmpt2,f 	; si 0, décrémenter compteur 2
	goto	bouclec2	; si cmpt2 pas 0, recommencer boucle1
	bcf	BUZZ		;Allumer le buzzer
	incfsz	dmtmp, f	; incrémenter le compteur
	bsf	BUZZ		; Étteindre le buzzer
	goto	bouclec3	; Boucler
endofcalc
	bcf	MOT_G_1		; Étteindre le moteur gauche dans le sens1
	bcf	MOT_D_2		; Étteindre le moteur droit dans le sens2
;	movlw	0x3		; pour soustraire
;	subwf	dmtmp,f		; on soustrait pour être plutot trop court
	rrf	dmtmp		;Renvoi le quart de tour

	return			; retour de la sous-routine
;---------------------------------------------------------------------
; Cette sous-routine introduit un retard pour les rotation.
; Elle ne reçoit un paramètre, le nombre de boucle par la variable
; nb_tempo et n'en retourne aucun.
;---------------------------------------------------------------------
tempo2
	movf	dmtmp,w		; Récupération du nombre de tempo
	movwf	cmpt3		; Affectation à cmpt3
boucleb3
	movlw	B'00001111'	; Valeur de la tempo 0xFF=MAX 0x0=MIN
	movwf	cmpt2		; Affectation à cmpt2
boucleb2
	clrf	cmpt1		; effacer compteur1
boucleb1
	decfsz	cmpt1,f		; décrémenter compteur1
	goto	boucleb1	; si pas 0, boucler
	decfsz	cmpt2,f 	; si 0, décrémenter compteur 2
	goto	boucleb2	; si cmpt2 pas 0, recommencer boucle1
	decfsz	cmpt3,f		; si 0, décrémenter compteur 3
	goto	boucleb3	; si cmpt3 pas 0, recommencer boucle2
	return					; retour de la sous-routine
;---------------------------------------------------------------------
; Sous-routines de virage.
;---------------------------------------------------------------------
tourne_droit_90
;Un virage à 90° sur la droite
	bsf	MOT_G_1		;Allumer le moteur gauche dans le sens1
	bsf	MOT_D_2		;Allumer le moteur droit dans le sens2
	movlw	0x53		; pour 1 boucle
	movwf	nb_tempo	; Affectation à nombre de tempo
	call 	tempo		; appeler la tempo
	bcf	MOT_D_2		;Étteindre le moteur droit dans le sens2
	bcf	MOT_G_1		;Étteindre le moteur gauche dans le sens1
	return
tourne_gauche_90
;Un virage à 90° sur la gauche
	bsf	MOT_D_1		;Allumer le moteur droit dans le sens1
	bsf	MOT_G_2		;Allumer le moteur gauche dans le sens2
	movlw	0x43		; pour 1 boucle
	movwf	nb_tempo	; Affectation à nombre de tempo
	call 	tempo		; appeler la tempo
	bcf	MOT_D_1		;Étteindre le moteur droit dans le sens1
	bcf	MOT_G_2		;Étteindre le moteur gauche dans le sens2
	return

;---------------------------------------------------------------------
; Sous-routine d'avance.
;---------------------------------------------------------------------
avance
	bsf	MOT_D_1		;Allumer le moteur droit dans le sens1
	bsf	MOT_G_1		;Allumer le moteur gauche dans le sens1
	movlw	0xA0		; pour 1 boucle
	movwf	nb_tempo	; Affectation à nombre de tempo
	call 	tempo		; appeler la tempo
	bcf	MOT_D_1		;Étteindre le moteur droit dans le sens1
	bcf	MOT_G_1		;Étteindre le moteur gauche dans le sens1
	return                  
;*********************************************************************
;                      PROGRAMME PRINCIPAL                           *
;*********************************************************************

start

;	clrwdt			; effacer watch dog

;Les DELS sont en PULL-UP, il faut les éteindre en les passant à 1
	bsf	DEL_1		;Éteindre la DEL_1
	bsf	DEL_2		;Éteindre la DEL_2
	bsf	DEL_3		;Éteindre la DEL_3
	bsf	FEUX_ST		;Éteindre les feux stop
;Le buzzer aussi
	bsf	BUZZ		;Éteindre le buzzer

;effet robotcop sur les DEL (serpentin)

	;Définition de la durée de la tempo
	movlw	6		; pour 2 boucles
	movwf	nb_tempo	; Affectation à nombre de tempo

;	movlw	B'1001'		; Valeur du nombre de décalages (=nbtour*3)
;	movwf	cmpt4		; Affectation à cmpt4
	movlw	B'01101101'	; Valeur de l'empreinte de rotation
	movwf	rotled		; Affectation
	bsf	STATUS,C	; Le Bit de Carry
rot_aff
	rlf 	rotled		; décalage à gauche
	movf	rotled,w	; Affectation à W
	andlw	B'01110'	; Masquer sur les !(trois LED)
	movwf	PORTA		; Affichage
	call 	tempo		; appeler la tempo
;	decfsz	cmpt4,f		; décrémenter compteur1
	btfss	BP_STAR		; Si bouton non pressé
	goto	rot_aff		; si pas 0, boucler
;fin du robocop
;test buzz
	bcf	BUZZ		;Allumer le buzzer
	movlw	20		; pour 20 boucles
	movwf	nb_tempo	; Affectation à nombre de tempo
	call 	tempo		; appeler la tempo
	bsf	BUZZ		;Etteindre le buzzer


;Fin de la séquence d'initialisation.

	bsf	DEL_1		;Éteindre la DEL_1
	bsf	DEL_2		;Éteindre la DEL_2
	bsf	DEL_3		;Éteindre la DEL_3
	bsf	FEUX_ST		;Éteindre les feux stop

seek0
;démmarage des moteurs
	bsf	MOT_D_1		;Allumer le moteur droit dans le sens1
	bsf	MOT_G_1		;Allumer le moteur gauche dans le sens1


;récupérage de la ligne
	movlw	B'00000011'	; Valeur des flags
				;(B0=0 => déja vu à D et D1 à G)
				;(B2=0 => premier cycle)
	movwf	rotled		; Affectation à rotled

  	;initialisation des flags




seek1				;boucle d'avance, la ligne n'a pas
				;encore été détectée

	btfsc	CAP_L_G		; Si ligne détectée à gauche
	bcf	rotled,1	; flag ligne G à 0

	btfsc	CAP_L_D		; Si ligne détectée à droite
	bcf	rotled,0	; flag ligne D à 0


	btfsc	rotled,0	; Si ligne pas encore franchie à D
	goto	seek1		; Reboucler
	btfsc	rotled,1	; Si ligne pas encore franchie à G
	goto	seek1		; Reboucler

	btfsc	rotled,2	; Si fin de la deuxième phase
	goto	fseek		; Reboucler


	bcf	MOT_D_1		;Étteindre le moteur droit dans le sens1
	bcf	MOT_G_1		;Étteindre le moteur gauche dans le sens1
	movlw	20		; pour 2 boucles
	movwf	nb_tempo	; Affectation à nombre de tempo
	call 	tempo		; appeler la tempo

	bsf	MOT_G_1		; Allumer le moteur gauche dans le sens1
	bsf	MOT_D_2		; Allumer le moteur droit dans le sens2

				;Pour se remettre dans le sens de la ligne

	movlw	B'00000111'	; Valeur des flags
	movwf	rotled		; Affectation à rotled

	goto	seek1		; Reboucler
                                
fseek

	bcf	MOT_D_2		; Allumer le moteur droit dans le sens2
	bsf	MOT_D_1		;Allumer le moteur droit dans le sens1

;boucle de déplacement
move

	btfsc	BP_STAR		; Si bouton pressé
	goto 	pause		; Sauter aux instructions

	movlw	B'00000001'	; Valeur du flags
				;(B0=0 => pas de ligne sur G ou D)
				; Si B0=1 après les test alors les deux
				;capteurs sont sur la ligne => arrêt
	movwf	rotled		; Affectation à rotled



	btfsc	CAP_OB		; Si obstacle détecté
	goto 	OB		; Sauter aux instructions OB
	goto 	N_OB		; Sauter les instructions OB
OB
	bcf	BUZZ		;Allumer le buzzer
	bcf	FEUX_ST		;Allumer les feux stop
	bcf	MOT_D_1		;Étteindre le moteur droit dans le sens1
	bcf	MOT_D_2		;Étteindre le moteur droit dans le sens2
	bcf	MOT_G_1		;Étteindre le moteur gauche dans le sens1
	bcf	MOT_G_2		;Étteindre le moteur gauche dans le sens2

;Reculer (freiner)

	bsf	MOT_D_2		;Allumer le moteur droit dans le sens2
	bsf	MOT_G_2		;Allumer le moteur gauche dans le sens2
	movlw	7		; pour 1 boucle
	movwf	nb_tempo	; Affectation à nombre de tempo
	call 	tempo		; appeler la tempo

	bcf	MOT_G_1		;Étteindre le moteur gauche dans le sens1
	bcf	MOT_G_2		;Étteindre le moteur gauche dans le sens2
	bcf	MOT_D_1		;Étteindre le moteur droit dans le sens1
	bcf	MOT_D_2		;Étteindre le moteur droit dans le sens2

	movlw	20		; pour 1 boucle
	movwf	nb_tempo	; Affectation à nombre de tempo
	call 	tempo		; appeler la tempo
	bsf	BUZZ		;Étteindre le buzzer

stay_OB
	btfsc	CAP_OB		; Si obstacle détecté
	goto 	evitement	; Sauter aux instructions
fin_evitement			; Et on revient
	goto	move		;Retourner dans la boucle principale


N_OB

	bsf	BUZZ		;Etteindre le buzzer
	bsf	FEUX_ST		;Etteindre les feux stop

	btfsc	CAP_L_D		; Si ligne détecté à droite
	goto 	L_D		; Sauter aux instructions
	goto 	N_L_D		; Sauter les instructions
L_D
	bcf	DEL_1		;Allumer la DEL_1
	bcf	MOT_D_1		;Étteindre le moteur droit dans le sens1
N_L_D

	btfss	CAP_L_D		; Si pas de ligne détecté à droite
	goto 	NL_D		; Sauter aux instructions
	goto 	N_NL_D		; Sauter les instructions
NL_D
	bcf	rotled,0	; flag ligne D à 0
	bsf	DEL_1		;Etteindre la DEL_1
	bcf	MOT_D_2		;Étteindre le moteur droit dans le sens2
	bsf	MOT_D_1		;Allumer le moteur droit dans le sens1
N_NL_D
	btfsc	CAP_L_G		; Si ligne détecté à gauche
	goto 	L_G		; Sauter aux instructions
	goto 	N_L_G		; Sauter les instructions
L_G
	bcf	DEL_2		;Allumer la DEL_2
	bcf	MOT_G_1		;Étteindre le moteur gauche dans le sens1
N_L_G

	btfss	CAP_L_G		; Si pas de ligne détecté à gauche
	goto 	NL_G		; Sauter aux instructions
	goto 	N_NL_G		; Sauter les instructions
NL_G
	bcf	rotled,0	; flag ligne D à 0
	bsf	DEL_2		;Etteindre la DEL_2
	bcf	MOT_G_2		;Étteindre le moteur gauche dans le sens2
	bsf	MOT_G_1		;Allumer le moteur gauche dans le sens1
N_NL_G

	btfss	rotled,0	; Si pas de ligne détecté pendant les deux
	goto 	move		; boucler

; Si on est ici, c'est qu'il y a une bande noire en travers de la route.
; On pile
	bsf	MOT_D_2		;Allumer le moteur droit dans le sens2
	bsf	MOT_G_2		;Allumer le moteur gauche dans le sens2
	movlw	7		; pour 20 boucles
	movwf	nb_tempo	; Affectation à nombre de tempo
	call 	tempo		; appeler la tempo

;et on arrête tout
	bcf	FEUX_ST		;Allumer les feux stop
	bcf	DEL_1		;Allumer la DEL_1
	bcf	MOT_D_1		;Étteindre le moteur droit dans le sens1
	bcf	MOT_D_2		;Étteindre le moteur droit dans le sens2
	bcf	MOT_G_1		;Étteindre le moteur gauche dans le sens1
	bcf	MOT_G_2		;Étteindre le moteur gauche dans le sens2

fin
	btfss	BP_STAR		; Si pas de bouton détecté
	goto    fin
;On boucle tant que le bouton n'est pas préssé une fois.
;sinon on retourne au loader.
	movlw	99		; pour 20 boucles
	movwf	nb_tempo	; Affectation à nombre de tempo
	call 	tempo		; appeler la tempo
;Tempo pour éviter le rebond au début du programme
	goto    start


pause
	btfss	BP_STAR		; Si pas de bouton détecté
	goto 	move		; Retourner au programme
	bsf	BUZZ		;Etteindre le buzzer
	bcf	FEUX_ST		;Allumer les feux stop
	bcf	DEL_1		;Allumer la DEL_1
	bcf	DEL_2		;Allumer la DEL_2
	bcf	MOT_D_1		;Étteindre le moteur droit dans le sens1
	bcf	MOT_D_2		;Étteindre le moteur droit dans le sens2
	bcf	MOT_G_1		;Étteindre le moteur gauche dans le sens1
	bcf	MOT_G_2		;Étteindre le moteur gauche dans le sens2

goto pause

evitement


;Une petite marche arrière....

	bcf	FEUX_ST		;Allumer les feux stop
	bsf	MOT_D_2		;Allumer le moteur droit dans le sens2
	bsf	MOT_G_2		;Allumer le moteur gauche dans le sens2
	movlw	15		; pour 1 boucle
	movwf	nb_tempo	; Affectation à nombre de tempo
	call 	tempo		; appeler la tempo

	bcf	MOT_G_1		;Étteindre le moteur gauche dans le sens1
	bcf	MOT_G_2		;Étteindre le moteur gauche dans le sens2
	bcf	MOT_D_1		;Étteindre le moteur droit dans le sens1
	bcf	MOT_D_2		;Étteindre le moteur droit dans le sens2
	bsf	FEUX_ST		;Étteindre les feux stop


;Une petite pause
;	call 	tempocalc
;	call	tourne_gauche_90
	call	tourne_droit_90
;Une petite pause
	movlw	40		; pour 20 boucles
	movwf	nb_tempo	; Affectation à nombre de tempo
	call 	tempo		; appeler la tempo
	call	avance
;Une petite pause
	movlw	40		; pour 20 boucles
	movwf	nb_tempo	; Affectation à nombre de tempo
	call 	tempo		; appeler la tempo
	call	tourne_gauche_90
;Une petite pause
	movlw	40		; pour 20 boucles
	movwf	nb_tempo	; Affectation à nombre de tempo
	call 	tempo		; appeler la tempo
	call	avance          
      	call	avance
;Une petite pause
	movlw	40		; pour 20 boucles
	movwf	nb_tempo	; Affectation à nombre de tempo
	call 	tempo		; appeler la tempo
	call	tourne_gauche_90

	;Chercher la ligne
	goto	seek0		; Reboucler

;théoriquement inutil
goto fin_evitement


	END 			; directive de fin de programme
;(on n'est pas censé arriver ici....)