À tout moment de son parcours de suivit de ligne, le robot doit être capable
de freiner le plus vite possible s'il rencontre un obstacle frontal.
Le temps de réaction maximum en fonction de la porté du capteur et de la
vitesse du robot étant de 55 ms, le robot doit effectuer le control au
moins 20 fois par seconde, soit toutes les 5 500 instructions.
Ici, la boucle principale teste le capteur toutes les 38 instructions, soit
plus de 26 000 fois pas secondes, ce qui est donc suffisant pour ne pas
recourir aux interruptions.
En cas de détection de l'obstacle, le robot est intensément lancé en
marche arrière durant un temps calculer pour que cela suffise exactement
à compenser l'énergie cinétique et ainsi stopper le robot quasi
instantanément contrairement à sur plusieurs centimètres sans
rétro freinage, ce qui ne suffisait pas à répondre au cahier des charges.
On signale l'obstacle par les LED stop et le buzzer.
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