Bonjour,
Utiliser une interruption ? je croyais que Count bloquait les interruptions non ? c'est pour celà que la durée de l'impultion arrête l'emission de la fréquence sur l'entrée count via un transistor.
Les deux faisceaux infrarouge ont le même temps de latence à la mise à zero lors d'une détection , chacun est composé d'un picaxe 8m2 qui ne s'occupe que de détecter l'infrarouge à 38khz.
Sur le 14m2 en fait le transistor permet d'autoriser la sortie pwmout (11140 hz) vers l'entrée count en fait et non pulsin comme dit à mon premier post.
J'ai testé le calcul du 14m2 en générant un pulsout de 18 ms et effectivement j'ai 100 comme vitesse , ou 36 ms j'ai bien 50 en sortie affichage lcd .
Programme du 14m2:
pause 500
serout b.5,N2400,(254,1)
pause 400
PWMOUT c.0,90,200
debut:
;debug
if pinB.1 =0 then goto debut
switch on b.3 ;allumage d'une led de signalisation
switch on b.4 ;hold infra , bloque la génération de l'implultion en provenance du 8m2 qui détectecte l'état des infra (laisser le temps au 14m2 de traiter l'info)
count c.4,400,w3 ; comptage du nombre d'impultions pendant la durée entre le passage des deux faisceaux infrarouge sur 50 cm
let w2=19990/w3 ;SI 11000 hz alors div 20000 si 5557 hz alors div 10000 ;5040 si 2778 hz
if w2>112 then sup112
if w2 <5 then inf2
serout b.5,N2400,(254,1)
pause 30
serout b.5,N2400,("vitesse de ",#w2)
pause 400
switch off b.4 ;not hold infra , dit au 8m2 qu'on est prêt pour un nouveau passage
switch off b.3
goto debut
sup112:
serout b.5,N2400,(254,1)
pause 30
serout b.5,N2400,("superieur a 112 !")
pause 400
switch off b.4
switch off b.3
goto debut
inf2:
serout b.5,N2400,(254,1)
pause 30
serout b.5,N2400,("inferieur a 5 !")
pause 400
switch off b.4
switch off b.3
goto debut
Programme du 8m2 intermediaire :
setfreq m16
let w0=0
debut:
if pin4=1 and pin3=1 then debut ;pin 4 sortie d'un 8m2 detection 1er faisceau
if pin3=0 then sensnormal ; led verte sortie 0 a 1 sinon sens inverse ; pin 3 , entrée du deuxieme 8m2 faisceau 2
if pin4=0 then sensinverse
pause 40
goto debut
sensnormal:
high 2 ;vers entree 14m2 broche b1 lancement du comptage
pause 20
high 1 ;vers broche base transistor 2n3904 collecteur de pwout c0 emeteur vers c4 count
high 0
boucl:
if w0>8000 then erreur
inc w0
if pin4=1 then goto boucl
pause 20
low 1
pause 20
low 2
let w0=0
retour:
pause 30
if pin4=1 and pin3=1 then debut
goto retour
sensinverse:
high 2
pause 30
high 1
low 0
boucl1:
if w0>8000 then erreur
inc w0
if pin3=1 then boucl1 ; test si il y a bien un passage sur le deuxième infrarouge
pause 20
low 1
pause 20
low 2
let w0=0
retour1:
pause 30
if pin4=1 and pin3=1 then debut
goto retour1
erreur:
low 2
low 1
pause 1000
let w0=0
goto debut
Programme des 8m2 des recepteur IR :
setfreq m16
debut:
high 2
debutb:
pulsin 3,1,w0
if w0>12000 and w0 <13000 then goto debutb ;3100 3240 en m4 12000 13000 en m16
low 2
pause 20
boucle:
pulsin 3,1,w0
if w0<12000 or w0>13000 then boucle
high 2
goto debutb
Et enfin programme de l'émetteur infrarouge : (une led pour un recepteur , il ne faut surtout pas que la led du premier sature le deuxieme recepteur)
debut:
PWMOut 2, 25, 52 ' 26 ; 38.4 kHz
' pour 40 kHz, PWMOut 3, 24, 50
Pause 3
pwmout 2,off
pause 30
goto debut