#picaxe 40X2
'*********** E/S ********************************
dirsB = %11100000 ' positionne B.5 et B.6 b7 en sorties
'entrees ------------------------------
symbol FC_opto = pinB.4 'Fin de course opto
symbol Stop_rota = pinB.3 'arret moteur pas ? pas
'sorties ------------------------------
symbol dir = pinB.5 'sortie direction
symbol pas = B.6 'sortie pas
'*********** variables **************************
symbol touche = b2
Symbol nombre = b3
Symbol compteur = b4
SYMBOL LeMenu = b5 ' Le Menu actuellement affich?
Symbol LaVoie = b6 ' La Voie actuellement s?lectionn?e
Symbol L_Aiguille = b7 ' L'aiguille actuellement choisie
symbol Nb_de_pas = w23 'nombre de pas ? realiser
symbol Pos_cible = w24 'position cible
symbol Pos_actuelle = w25 'position courante
symbol var_temp = w26 'variable temporaire
Symbol addition = w27
'*********** constantes **************************
symbol CW = 1 'sens horaire
symbol CCW = 0 'sens anti horaire (arbitraire)
symbol Vit_lente = 100 'predefini vitesse lente
symbol Vit_rapide = 20 'et vitesse rapide
'reserve bits = b0
symbol Sens = bit0
'*********** Macros ******************************
'definition macro avec parametres; Nb de pas, sens, periode entre pas.
#MACRO PaP(Nb,Sens,Per)
dir = Sens 'affecte 1 ou 0 ? dir donc ? B.5
for var_temp = 0 to Nb 'envoie Nb pulses au circuit
pulsout pas,1 'driver
pause Per ' pause en X fois 5?s
next
Pos_actuelle = sens * 2 * Nb + Pos_actuelle - Nb 'actualisation position du pont
'si sens =1 on ajoute Nb pas ? Pos_actuelle sinon on lui retranche Nb pas ;-)
#ENDMACRO
'************ initialisation *******************
setfreq m16 'frequence 16MHz interne
SerOut B.7, N2400, ( 254, %00000001 ) ' efface l'ecran
pause 100
serout B.7,N2400_16,(254,128,"INITIALISATION..")
serout B.7,N2400_16,(254,192," 3")
pause 2000
serout B.7,N2400_16,(254,192," 2")
pause 2000
serout B.7,N2400_16,(254,192," 1")
pause 2000
LeMenu=Menu_INIT; Charge la variable b5(le menu)valeur 0
LaVoie=1
L_Aiguille=1
'############## Programme principal #################
do
serout B.7,N2400_16,(254,128,"1:PONT 2:AIGUIL")
serout B.7,N2400_16,(254,192,"3:REGL Choix:__")
gosub clavier ' On attend un choix de menu
select case nombre
case = 0
'on fais rien
case = 1
gosub pont
case = 2
gosub aiguil
case = 3
gosub reglage
else
gosub erreur
endselect
loop
Clavier:
nombre = 0
Do
Do
readadc a.0 , touche ' On detecte un appui
loop while touche > 250
pause 100
for compteur = 0 to 19 ' on mesure 20 fois
readadc a.0 , touche ' On lit la touche appuyee
addition = addition + touche ' on fait la somme
next
touche = addition / 20
addition = 0
select case touche 'on reaffecte aux touches leurs vraies valeurs sauf # et *
case > 133 : touche = 1
case > 128 : touche = 2
case > 122 : touche = 3
case > 111 : touche = 4
case > 105 : touche = 5
case > 98 : touche = 6
case > 81 : touche = 7
case > 71 : touche = 8
case > 60 : touche = 9
case > 35 : touche = 11 'correction
case > 20 : touche = 0
case > 0 : touche = 12 'validation
endselect
do ' On attends que la touche soit rel?ch?e
readadc a.0 ,compteur
loop while compteur < 250
select case touche
case = 12 ' si un appui sur la touche est detect?
return ' Alors on enregsitre le nombre et on sort
case = 11 'correction dernier chiffre
select case nombre
case = 0
return' Si on appui sur correction on fais un retour
case < 10
nombre = 0
serout B.7,N2400_16,(254,206,"__")
else
nombre = nombre/10
serout B.7,N2400_16,(254,206,"_",#nombre)
end select
else
if nombre > 9 then ' Verifie si c'est un troisieme chiffre qu'on rentre
nombre = touche ' Si c'est le cas on repart a zero
serout B.7,N2400_16,(254,206,"_",#nombre)
else
nombre = nombre*10 + touche 'ajout du chiffre
if nombre > 9 then
serout B.7,N2400_16,(254,206,#nombre)
else
serout B.7,N2400_16,(254,206,"_",#nombre)
end if
end if
endselect
loop
'#####################################################################################################
'############################## Programme secondaire #############################
'#####################################################################################################
pont:
do
serout B.7,N2400_16,(254,128,"Voie en cours: ",#LaVoie)
serout B.7,N2400_16,(254,192,"Voie choisie: __")
gosub clavier
select case nombre
case = 0
return
case = 1
read 1,pos_cible
gosub Mise_en_position
exit
case = 2
'vers la voie 2 Etc ......
exit
else
' si la saisie est differente d'un chiffre attendu on affiche une erreur de saisie
gosub erreur
endselect
loop
return
Aiguil:
do
serout B.7,N2400_16,(254,128,"Aiguil ",#L_Aiguille," Etat=_")
serout B.7,N2400_16,(254,192,"Cor ou choix:__")
gosub clavier
select case nombre
case = 0
return
case = 1
' on effectue la tache corrspondante
exit
case = 2
'on effectue la tache corrspondante Etc ......
exit
else
' si la saisie est differente d'un chiffre attendu on affiche une erreur de saisie
gosub erreur
endselect
loop
return
reglage:
do
serout B.7,N2400_16,(254,128,"1:PONT 2:AIGUIL")
serout B.7,N2400_16,(254,192,"3:ROTO Choix:__")
gosub clavier
select case nombre
case = 0
return
case = 1
' on effectue le reglage du pont
serout B.7,N2400_16,(254,128,"RECHERCHE du 0 ")
serout B.7,N2400_16,(254,192,"Attendre svp... ")
gosub Init_PaP
serout B.7,N2400_16,(254,128,"Pont en position")
serout B.7,N2400_16,(254,192," ")
pause 4000
serout B.7,N2400_16,(254,128,"valeur pas:",#Pos_actuelle)
serout B.7,N2400_16,(254,192,"Reglage rapide ")
dir = ccw ' on tourne dans un sens
do loop while Stop_rota = 0 ' On attend qu'on bascule l'inter
do while Stop_rota = 1 'tout pendant que l'inter est actif
pulsout pas,1 'on tourne en grande vitesse sens cw
inc Pos_actuelle
serout B.7,N2400_16,(254,139,#Pos_actuelle)
pause Vit_rapide
loop
serout B.7,N2400_16,(254,192,"Ajout de pas: _?")
do
gosub clavier ' on va lire le clavier
select case nombre
case = 0
dir = cw ' on tourne dans l'autre sens
for var_temp = 1 to 99
pulsout pas,1
dec Pos_actuelle
serout B.7,N2400_16,(254,139,#Pos_actuelle)
next
case = 99
serout B.7,N2400_16,(254,128,"Enreg la valeur?")
serout B.7,N2400_16,(254,192,"Oui(1) Non(2) ")
Gosub clavier
Select case nombre
case = 1
serout B.7,N2400_16,(254,192,"Numero voie: ?")
Gosub clavier
write nombre,Pos_actuelle
return
case = 2
return
else
gosub erreur
endselect
else
dir = ccw ' on tourne dans l'autre sens
for var_temp = 1 to nombre
pulsout pas,1
inc Pos_actuelle
serout B.7,N2400_16,(254,139,#Pos_actuelle)
next
end select
loop
exit
case = 2
'on effectue le reglage des aiguilles
serout B.7,N2400_16,(254,128,"INIT AIGUILLAGE ")
serout B.7,N2400_16,(254,192,"Attendre svp ")
pause 4000
exit
case = 3
' on effectue le ROTO ( je sais pas ce que c'est lol)
serout B.7,N2400_16,(254,128,"Etalon__ Voie ",#LaVoie)
serout B.7,N2400_16,(254,192,"Cor:EXP Choix:__")
gosub clavier
exit
else
' si la saisie est differente d'un chiffre attendu on affiche une erreur de saisie
gosub erreur
endselect
loop
return
'#####################################################
Init_PaP:'s/Programme initialisation du moteur pas a pas
dir = cw
do while FC_opto = 1 'tout pendant que l'opto est ocult
pulsout pas,1 'on tourne en grande vitesse sens cw
pause Vit_rapide
loop
PaP(100,cw,Vit_rapide) 'la fente detectee, on passe au-dela - normalement 26 pas suffisent pour 1mm
dir = ccw 'puis on revient en arriere
Do while FC_opto = 1 'en vitesse tres lente jusqu'a detection du bord de fente.
pulsout pas,1
pause Vit_lente
loop
Pos_actuelle = 32000 'la detection faite, on initialise le compteur de pas ? 32000
return
'################################################################################################################
Mise_en_position: 's/Programme calcul du nombre de pas a faire et commande du moteur.
If pos_cible > pos_actuelle then 'si la future position est dans le sens positif
Nb_de_pas = pos_cible - pos_actuelle 'calcul du nombre de pas
sens = cw 'et du sens
else
Nb_de_pas = pos_actuelle - pos_cible 'sinon , on fait l'inverse
sens = ccw
endif
'optimisation du sens
if Nb_de_pas > 4800 then 'Si on depasse 1/2 tour
Nb_de_pas = 9600 - Nb_de_pas 'on prends le complement
sens = sens + 1 'et on inverse le sens
endif
PaP(Nb_de_pas,sens,vit_lente) 'Action du moteur
' serout B.7,N2400_16,(254,128,"Nb:",#Nb_de_pas," sens:",#sens," ")
return
erreur:
serout B.7,N2400_16,(254,128," ERREUR ")
serout B.7,N2400_16,(254,192," DE SAISIE ")
pause 2000
return