; ################################ Initialisation du chrono ################################
; *************** initialisation du sens des barrieres ***************
sensbarrieres:
if choix_sens=1 then
high A.2 'led_sens allumee
hintsetup %00000101 'Initialisation interrupt sur entree B.0 -> barriere1 ou B.2 -> BP START/STOP
setint %00000001,%00000001 'trigger entree
setintflags or %00000101,%00000101 'Activation flag interrupt -> "or" permet une entree OU l'autre
pause 10
else if choix_sens=0 then
low A.2 'led_sens eteinte
hintsetup %00000110 'Initialisation interrupt sur entree B.1 -> barriere2 ou B.2 -> BP START/STOP
setint %00000001,%00000001 'trigger entree
setintflags or %00000110,%00000110 'Activation flag interrupt -> "or" permet une entree OU l'autre
pause 10
end if
gosub affichage_start 'affichage du START
; *************** boucle attente demarrage et arret du chrono ***************
chrono_demarrage:
; --------------- demarrage du chrono : valeur temps a zero -> chrono a zero
val_temps=0
; --------------- Mode de fonctionnement -> affichage du nombre de barrieres et sens : 1 seule fois/demarrage
if status_chrono=99 or led_nbr<>choix_nbr or choix_sens<>led_sens then
if choix_sens<>led_sens then 'changement du sens des barrieres
SETINTFLAGS OFF 'Suppresssion "flags" pour "interrupt'
gosub sensbarrieres 'reinitialisation sens des barrieres
end if
high A.1
if choix_sens=1 and choix_nbr=1 and status_chrono<>12 then '---------- barrieres 1 -> 2
high A.3 'led_nbr allumee
status_chrono=12
barriere_stop=2
hserout LCD,(254,137,"1 -> 2 ") 'affichage LCD 1ere ligne
else if choix_sens=0 and choix_nbr=1 and status_chrono<>21 then '---------- barrieres 2 -> 1
high A.3 'led_nbr allumee
status_chrono=21
barriere_stop=1
hserout LCD,(254,137,"2 -> 1 ") 'affichage LCD 1ere ligne
else if choix_sens=1 and choix_nbr=0 and status_chrono<>11 then '---------- barrieres 1 seule
low A.3 'led_nbr eteinte
status_chrono=11
barriere_stop=1
hserout LCD,(254,137,"1 seule") 'affichage LCD 1ere ligne
else if choix_sens=0 and choix_nbr=0 and status_chrono<>22 then '---------- barrieres 2 seule
low A.3 'led_nbr eteinte
status_chrono=22
barriere_stop=2
hserout LCD,(254,137,"2 seule") 'affichage LCD 1ere ligne
end if
pause 1000
low A.1
end if
; --------------- controle des barrieres
if barriere1=1 and barriere2=1 then '---------- Attente demarrage : faire clignoter led_status
val_temps_mem=timer
if val_temps_mem<=100 then
high A.0
else if val_temps_mem>100 and val_temps_mem<=200 then
low A.0
else
timer=0
endif
else if choix_nbr=1 then '---------- 2 barrieres
if barriere1=0 or barriere2=0 then 'Au moins une barriere active
low A.0
SETINTFLAGS OFF 'Suppresssion "flags" pour "interrupt'
gosub controle2barrieres
end if
else if barriere1=0 and choix_sens=1 and choix_nbr=0 then '---------- 1 barriere, barriere 1 active : avec sens = 1 -> 2
low A.0
SETINTFLAGS OFF 'Suppresssion "flags" pour "interrupt'
gosub controle1barrierre1
else if barriere2=0 and choix_sens=0 and choix_nbr=0 then '---------- 1 barriere, barriere 2 active : avec sens = 2 -> 1
low A.0
SETINTFLAGS OFF 'Suppresssion "flags" pour "interrupt'
gosub controle1barrierre2
end if
; --------------- Affichage historique : max. 8 temps
if memoires_temps=0 then
low A.0
SETINTFLAGS OFF 'Suppresssion "flags" pour "interrupt'
gosub liste_temps
end if
goto chrono_demarrage 'boucle d'attente pour le START
Interrupt:
if flag3=1 then '===== activation d'une entre interrupt suivant flag => B.0 a B.2 : START
if val_temps=0 then '----- blocage des barrieres
timer=0
val_temps_mem=0
high A.0 'led_status allumee
;--------- Boucle 3 sec. de blocage barriere ----------
do
high A.1 'led_defaut allumee
if val_temps=0 then
high B.7 'buzzer active
bintoascii val_temps,b1,b2,b3,b4,b5
hserout LCD,(254,128,"Bloc. : ") 'affichage LCD 1ere ligne
put 1, b1,b2,b3,b4,b5,flag2,1 'enregistrement des valeurs scratchpad (debut = 1->7) lues via i2c : TX = 1 (7)
endif
val_temps=timer
gosub affichage_temps_chrono 'affichage du temps
if val_temps>75 and val_temps<81 then
low B.7 'buzzer arret
end if
loop while val_temps<300
;--------- Verification STOP actif, sinon START ----------
if barriere_stop=2 and barriere2=0 then 'verifier STOP barriere2 en alarme : mode MANUEL
gosub mode_manuel
else if barriere_stop=1 and barriere1=0 then 'verifier STOP barriere1 en alarme : mode MANUEL
gosub mode_manuel
else
hserout LCD,(254,128,"START ") 'affichage LCD 1ere ligne : mode AUTOMATIQUE
low A.1 'led_defaut etteinte
endif
endif
val_temps=timer
if val_start_alerte=1 then '----- mode manuel
do
val_temps=timer
gosub affichage_temps_chrono
if start_stop=0 then
low B.7 'arreter buzzer demarre par le mode MANUEL
goto chrono_arrete
endif
if val_temps>=450 and val_temps<456 then
low B.7 'arreter buzzer demarre par le mode MANUEL
endif
if barriere_stop=1 and barriere1=1 then 'verifier si STOP barriere1 5 sec. consecutives au repos
gosub mode_manuel_verification
else if barriere_stop=2 and barriere2=1 then 'verifier si STOP barriere2 5 sec. consecutives au repos
gosub mode_manuel_verification
else
val_manuel_temps=val_temps 'maj du temps de 5 sec. si retour alarme avant d?lai
endif
loop while val_start_alerte=1
endif
val_temps=timer
if status_chrono=12 or status_chrono=22 then '----- mode AUTOMATIQUE : STOP = barriere2 ou BP START/STOP
do
val_temps=timer
gosub affichage_temps_chrono
loop while barriere2=1 and start_stop=1
goto chrono_arrete
else '----- mode AUTOMATIQUE : STOP = barriere1 ou BP START/STOP
do
val_temps=timer
gosub affichage_temps_chrono
loop while barriere1=1 and start_stop=1
goto chrono_arrete
endif
endif
'---------- reinitialisation flag interrupt : OBLIGATOIRE
if led_sens=1 then '----- START = barriere1 ou BP START/STOP
SetIntFlags or %00000101,%00000101
else '----- START = barriere2 ou BP START/STOP
SetIntFlags or %00000110,%00000110
endif
return
; *************** Affichage temps LCD, afficheur exterieur + PC via i2c ***************
affichage_temps_chrono:
bintoascii val_temps, b1,b2,b3,b4,b5 'decomposition ascii
hserout LCD,(254,136,b1,b2,b3,",",b4,b5," s") 'affichage LCD 1ere ligne : temps
put 1, b1,b2,b3,b4,b5,9,1 'valeurs dans scratchpad (1 -> 7) qui seront lues via i2c : TX = 1 (7)
return