Arrêt devant l'obstacle

À 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.

Logigramme

Organigramme

Code source

	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