;**********************************************************************
; 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....)