positionnement avec un moteur pas à pas

dje8269

Senior Member
If then ELSE , n'as que deux choix possible?!
Soit c'est ça , sinon c'est l'autre. Sélect case à une multitude de choix dont un seul est validé. ensuite au saute à la fin.
 

BESQUEUT

Senior Member
pourquoi utiliser case plutot que if then?
if c'est plus clair...
Vous avez raison : c'est la même chose.
Mais c'est plus commode (et plus optimisé) dès qu'on a plus qu'une alternative.

Le IF... THEN correspond à :

Si (test) alors
==> faire ceci
Sinon
==> faire cela
Fin de l'alternative

Le CASE correspond plutôt à :

En fonction de la valeur de : LeMenu

Si c'est Menu_INIT
==> faire l'initialisation

Si c'est Menu_Etalonnage
==> faire l'étalonnage

Si c'est Menu_Exploitation
==> Afficher le menu ad hoc en fonction du Nombre tapé au clavier et validé
Si...

Fin des possibilités


C'est plus optimisé parce que avec une série de IF THEN
tous les tests seront réalisés, même si le premier est vrai (et donc forcément tous les autres sont faux...)

Avec le SELECT CASE, dès qu'un test est vrai, on fait ce qu'il y a à faire et on passe à la suite.

Il y a une solution encore plus performante : le ON GOSUB
Mais je n'ai pas osé par crainte de vous perdre encore plus...


Il y a une infinité de façons d'écrire un programme pour un même cahier des charges.
Certaines plus lisibles, ou plus élégantes
D'autres plus rapides à l'exécution.
D'autres encore plus économes en mémoire.
Et même certaines qui permettent de faire plusieurs choses en même temps.

Au début, l'important c'est que vous preniez votre autonomie et que votre programme réponde à vos besoins, même si ce n'est pas très orthodoxe, que le programme est un peu lent et/ou qu'il prends beaucoup de place en mémoire. PEU IMPORTE !
L'important c'est que ça vienne de vous. Publiez...
Et si c'est nécessaire, on vous dira comment améliorer.
 
Last edited:

zeltron

Senior Member
ok ok merci bien compris c'est maintenant plus clair! ;)
le vocabulaire if then est plus simple à comprendre...
 

zeltron

Senior Member
:mad:
pff voila 2 jours que je trifouille l'organisation du programme j'avance
mais à pas de fourmis! je ne doit pas être loin de la solution

besoin d'un petit déblocage
je ne vais pas plus loin dans le prog car déjà aprés l'affichage du menu init
ça ne marche pas
voici le code
Code:
#rem
###########################################
#  Programme de gestion de pont tournant  #  
#  Moteur PaP 200pas - driver EasyDriver  #
#  Date 25/01/2015 revision 1               #
###########################################
#ENDREM

#picaxe 40X2
'************  initialisation   *******************
setfreq m16             'frequence 16MHz interne

'*********** E/S ********************************
dirsB = %11100000       ' positionne B.5 et B.6 b7 en sorties

'entrees ------------------------------
symbol FC_opto =  pinB.4   'Fin de course opto

'sorties ------------------------------
symbol dir     =  pinB.5   'sortie direction
symbol pas     =  B.6      'sortie pas
'*********** variables **************************
symbol var_temp      = w13 'variable temporaire
symbol Pos_actuelle  = w12 'position courante
symbol Pos_cible     = w11 'position cible
symbol Nb_de_pas     = w10 'nombre de pas ? realiser
Symbol nombre        = b3
Symbol touche        = b2
Symbol compteur      = b4
Symbol addition      = w27
SYMBOL LeMenu=b5; defini un symbole pour la variable b5
'*********** 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

SYMBOL Menu_INIT=0;defini un symbole menu_init pour la const 0  
SYMBOL Menu_ETAL=1;idem pour 1 etc
SYMBOL Menu_EXPL=2
SYMBOL Menu_ROTO=3
SYMBOL Menu_AIGU=4
SYMBOL Menu_REGL=5

'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
'##############   Programme principal   ############################

init:pause 500
SerOut B.7, N2400, ( 254, %00000001 ) ' efface l'ecran
pause 100


'Text sur display
serout B.7,N2400_16,(254,128,"INITIALISATION..")
serout B.7,N2400_16,(254,192,"APPUYEZ SUR VAL ")
LeMenu=Menu_INIT; Charge la variable b5(le menu)valeur 0

;gestion clavier
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

	select touche
      case = 12
		pause 500
		gosub ChoixValide
	return     		'fin de la saisie clavier

	
	case = 11               'correction dernier chiffre
      	nombre = nombre/10   
   	case < 240           'un chiffre valide est rentre
      	nombre = nombre*10 + touche 'ajout du chiffre

  	endselect	
 loop 

' On fait ce qu'il faut en fonction du menu en cours et du Nombre qui vient d'etre valide.
' En particulier, on affiche un nouveau menu si c'est necessaire

ChoixValide:
	select case LeMenu
	case Menu_INIT
serout B.7,N2400_16,(254,128,"1:ROTO  2:AIGUIL")
serout B.7,N2400_16,(254,192,"3:REGL  Choix:__")

		LeMenu=Menu_EXPL 
		gosub clavier   

	;	case Menu_ETAL:


case Menu_EXPL
	
		select case touche
		case 1
;			Menu_ROTO
serout B.7,N2400_16,(254,128,"1:INIT  2:ETALON")
serout B.7,N2400_16,(254,192,"3:EXPL  Choix:__")
do
   		readadc a.0 , touche 
   		loop while touche > 250    
   		pause 200

serout B.7,N2400_16,(254,207,#touche)
 
		LeMenu=Menu_ROTO

		case 2 
;Menu Aiguillages
serout B.7,N2400_16,(254,128,"Aiguil __ Etat=_")
serout B.7,N2400_16,(254,192,"Cor ou  choix:__")
;			serout B.7,N2400_16,(...)
;			LeMenu=Menu_AIGU
		case 3
;		Menu Reglages
serout B.7,N2400_16,(254,128,"Etalon__ Voie 01")
serout B.7,N2400_16,(254,192,"Cor:EXP Choix:__")

  


	EndSelect
EndSelect
gosub clavier	


;	case Menu_ROTO:
'...

;	case Menu_AIGU:
'...

;	case Menu_REGL:
'..
	return
 
Last edited:

BESQUEUT

Senior Member
Pas eu le temps de lire en détails, mais commencez par supprimer les
GOSUB Clavier

C'est le clavier qui appelle l'affichage, pas l'inverse, (et encore moins les 2 en même temps...)

Supprimez également le
RETURN
après la ligne
gosub ChoixValide
 

zeltron

Senior Member
ok vais voir ça merci ne m'en dite pas trop!
j'aimerais bien le trouver seul
maintenant que je suis plus calme :D
 

BESQUEUT

Senior Member
Là, vous n'êtes pas complètement perdu, mais quand même un peu égaré...
Voici une proposition pour vous remettre sur les rails :

Code:
#rem
###########################################
#  Programme de gestion de pont tournant  #  
#  Moteur PaP 200pas - driver EasyDriver  #
#  Date 27/01/2015 revision 2 JYB         #
###########################################
#ENDREM

#picaxe 40X2
'************  initialisation   *******************
setfreq m16             'frequence 16MHz interne

'*********** E/S ********************************
dirsB = %11100000       ' positionne B.5 et B.6 b7 en sorties

'entrees ------------------------------
symbol FC_opto =  pinB.4   'Fin de course opto

'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

SYMBOL Menu_INIT=0    ;defini un symbole menu_init pour la const 0  
SYMBOL Menu_ETAL=1   ;idem pour 1 etc
SYMBOL Menu_EXPL=2
SYMBOL Menu_ROTO=3
SYMBOL Menu_AIGU=4
SYMBOL Menu_REGL=5

'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




'##############   Programme principal   ############################

init:pause 500
SerOut B.7, N2400, ( 254, %00000001 ) ' efface l'ecran
pause 100


'Text sur display
serout B.7,N2400_16,(254,128,"INITIALISATION..")
serout B.7,N2400_16,(254,192,"APPUYEZ SUR VAL ")
LeMenu=Menu_INIT; Charge la variable b5(le menu)valeur 0
LaVoie=1
L_Aiguille=1


;gestion clavier
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 [COLOR="#FF0000"][S]case[/S] [/COLOR]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

      [COLOR="#FF0000"]sertxd ("Touche=", #Touche,13,10)[/COLOR]

	do	' On attends que la touche soit relâchée
   		readadc a.0 , touche 
   	loop while touche < 240    



	select touche
              case = 12
		gosub ChoixValide

	
              case = 11               'correction dernier chiffre
      	             nombre = nombre/10 
		serout B.7,N2400_16,(254,135,#nombre," ")

		
   	else
      	              nombre = nombre*10 + touche 'ajout du chiffre
     		serout B.7,N2400_16,(254,135,#nombre," ")

      endselect
	
	

 loop 




' On fait ce qu'il faut en fonction du menu en cours et du Nombre qui vient d'etre valide.
' En particulier, on affiche un nouveau menu si c'est necessaire

ChoixValide:
	select  LeMenu
	case Menu_INIT
		LeMenu=Menu_EXPL 
		serout B.7,N2400_16,(254,128,"1:ROTO  2:AIGUIL")
		serout B.7,N2400_16,(254,192,"3:REGL  Choix:__")
		

	case Menu_ETAL:
		LeMenu=Menu_ETAL
		serout B.7,N2400_16,(254,128,"Etalon__ Voie ",#LaVoie)
		serout B.7,N2400_16,(254,192,"Cor:EXP Choix:__")


	case Menu_EXPL
	
		select touche
		case 1
			LeMenu=Menu_ROTO
			serout B.7,N2400_16,(254,128,"Voie choisie ",#LaVoie)
			serout B.7,N2400_16,(254,192,"3:EXPL  Choix:__")


		case 2 
			LeMenu=Menu_AIGU
			serout B.7,N2400_16,(254,128,"Aiguil ",#L_Aiguille," Etat=_")
			serout B.7,N2400_16,(254,192,"Cor ou  choix:__")

		case 3
			LeMenu=Menu_REGL
			serout B.7,N2400_16,(254,128,"1:INIT  2:ETALON")
			serout B.7,N2400_16,(254,192,"3:EXPL  Choix:__")
			
	      EndSelect

	


	case Menu_ROTO:
		LaVoie=Nombre
		serout B.7,N2400_16,(254,128,"Voie choisie",#LaVoie)
'...

	case Menu_AIGU:
		L_Aiguille=Nombre
		serout B.7,N2400_16,(254,128,"Aiguil ",#L_Aiguille," Etat=_")

'...

	case Menu_REGL:
'..
	EndSelect
return
Soyez tranquille, je suis loin d'avoir tout dit...
Et ça ne sert à rien non plus de patauger trop longtemps...

Remarquez :
- que les variables ont été triées dans l'ordre (pour éviter d'utiliser deux fois la même...)
- que deux nouvelles variables apparaissent pour désigner la voie et l'aiguillage courant.
- qu'il manquait la ligne qui affiche le chiffre qui vient d'être frappé.
 
Last edited:

BESQUEUT

Senior Member
Pour voir ce qui se passe, vous pouvez utiliser le simulateur.
Pour ça, un code un peu modifié est plus commode (voir ci-dessous)
Mettez un point d'arrêt sur la ligne
addition = 0
en cliquant à gauche du numéro de ligne 103.

Ouvrer la liste des variables ( cachée tout à droite)

Onglet "simulation", cliquez sur "Run"

Le terminal doit s'afficher :Terminal.jpg

Tapez la valeur qui normalement aurait du être lue par le readADC
par exemple 1
et cliquez "send"

Puis cliquez sur "Step" pour avancer d'une ligne
etc...

Code:
#rem
###########################################
#  Programme de gestion de pont tournant  #  
#  Moteur PaP 200pas - driver EasyDriver  #
#  Date 25/01/2015 revision 1               #
   VERSION SPECIALE POUR SIMULATEUR
###########################################
#ENDREM

#picaxe 40X2
'************  initialisation   *******************
setfreq m16             'frequence 16MHz interne

'*********** E/S ********************************
dirsB = %11100000       ' positionne B.5 et B.6 b7 en sorties

'entrees ------------------------------
symbol FC_opto =  pinB.4   'Fin de course opto

'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

SYMBOL Menu_INIT=0;defini un symbole menu_init pour la const 0  
SYMBOL Menu_ETAL=1;idem pour 1 etc
SYMBOL Menu_EXPL=2
SYMBOL Menu_ROTO=3
SYMBOL Menu_AIGU=4
SYMBOL Menu_REGL=5

'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




'##############   Programme principal   ############################

init:pause 500
SerOut B.7, N2400, ( 254, %00000001 ) ' efface l'ecran
pause 100


'Text sur display
serout B.7,N2400_16,(254,128,"INITIALISATION..")
serout B.7,N2400_16,(254,192,"APPUYEZ SUR VAL ")
LeMenu=Menu_INIT; Charge la variable b5(le menu)valeur 0
LaVoie=1
L_Aiguille=1


;gestion clavier
Clavier:
nombre = 0
Do
'	Do 
'	readadc a.0 , touche ' On detecte un appui 
'      loop while touche > 250 
      serrxd touche

'	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
   	else      : touche = 12 'validation
	
      endselect



'	do	' On attends que la touche soit relâchée
'   		readadc a.0 , touche 
'   	loop while touche < 240    



	select touche
      case = 12
		gosub ChoixValide

	
      case = 11               'correction dernier chiffre
      	nombre = nombre/10 
		serout B.7,N2400_16,(254,135,#nombre," ")

		
   	else
      	nombre = nombre*10 + touche 'ajout du chiffre
     		serout B.7,N2400_16,(254,135,#nombre," ")

      endselect
	
	

 loop 




' On fait ce qu'il faut en fonction du menu en cours et du Nombre qui vient d'etre valide.
' En particulier, on affiche un nouveau menu si c'est necessaire

ChoixValide:
	select  LeMenu
	case Menu_INIT
		LeMenu=Menu_EXPL 
		serout B.7,N2400_16,(254,128,"1:ROTO  2:AIGUIL")
		serout B.7,N2400_16,(254,192,"3:REGL  Choix:__")
		

	case Menu_ETAL:
		LeMenu=Menu_ETAL
		serout B.7,N2400_16,(254,128,"Etalon__ Voie ",#LaVoie)
		serout B.7,N2400_16,(254,192,"Cor:EXP Choix:__")


	case Menu_EXPL
	
		select touche
		case 1
			LeMenu=Menu_ROTO
			serout B.7,N2400_16,(254,128,"Voie choisie ",#LaVoie)
			serout B.7,N2400_16,(254,192,"3:EXPL  Choix:__")


		case 2 
			LeMenu=Menu_AIGU
			serout B.7,N2400_16,(254,128,"Aiguil ",#L_Aiguille," Etat=_")
			serout B.7,N2400_16,(254,192,"Cor ou  choix:__")

		case 3
			LeMenu=Menu_REGL
			serout B.7,N2400_16,(254,128,"1:INIT  2:ETALON")
			serout B.7,N2400_16,(254,192,"3:EXPL  Choix:__")
			
	      EndSelect

	


	case Menu_ROTO:
		LaVoie=Nombre
		serout B.7,N2400_16,(254,128,"Voie choisie",#LaVoie)
'...

	case Menu_AIGU:
		L_Aiguille=Nombre
		serout B.7,N2400_16,(254,128,"Aiguil ",#L_Aiguille," Etat=_")

'...

	case Menu_REGL:
'..
	EndSelect
return
 

zeltron

Senior Member
ouinnnn c'est pas gagné
mon pauvre programme avait le merite d'afficher
"1:ROTO 2:AIGUIL")
"3:REGL Choix:__")

si la touche val était saisie.
mais le votre s'arrete à
"INITIALISATION..")
"APPUYEZ SUR VAL ")
le clavier fait n'importe quoi

j'ai testé le prog simulateur
mais pije rien ;)
déja sur le menu de droite aucune variable ne change..
 

BESQUEUT

Senior Member
le clavier fait n'importe quoi
Merci d'indiquer ce que vous faites et ce que vous observez...
J'ai ajouté une ligne de débug en rouge dans le #407.
Vous devriez voir la touche choisie dans le terminal.

Par ailleurs, ce serait bien d'avoir quelques LEDs (par exemple, une rouge et une verte)
branchées sur des sorties pour allumer un drapeau quand le clavier détecte quelque chose.

j'ai testé le prog simulateur
mais pije rien ;)
déja sur le menu de droite aucune variable ne change..
Vous avez bien chargé le programme ad hoc ?
Le terminal s'est-il ouvert ?
Qu'avez-vous tapé ?
 
Last edited:

zeltron

Senior Member
alors
pour commencer
l'affichage du text est écrasé par l'affichage de la touche appuyé
initialisation est remplacé par initial255 ion
si j'appuie sur la touche val et il ne se passe rien d'autre...

la lecture dans le terminal est
240 249 206 244 255 074 210 254
c'est quoi ça?
ce n'est pas les valeurs d'étalonnages du clavier puisque la touche val
devrait être inferieure à 20

pour placer bien le chiffre j'utilisais la commande
serout B.7,N2400_16,(254,207,#touche)
la commande serout B.7,N2400_16,(254,135,#nombre," ")
n'est pas adaptée mais ça c'est juste un petit pb cosmetique...
 

BESQUEUT

Senior Member
Oups : grosse bêtise chef...
Dans le #407, retirer le case que je viens de mettre en rouge.

Désolé : en VB on écrit
SELECT CASE Touche


Mais en Basic PICAXE, il ne faut pas mettre le CASE à ce niveau !
On écrit directement :
SELECT Touche
 

zeltron

Senior Member
ok j'ai viré case
mais non j'ai testé et il n'y a aucune évolution par rapport au fonctionnement de mon précedent post...
 

BESQUEUT

Senior Member
la lecture dans le terminal est
240 249 206 244 255 074 210 254
c'est quoi ça?
ce n'est pas les valeurs d'étalonnages du clavier puisque la touche val
devrait être inferieure à 20.
Ca écrit "Touche=240" ? c'est bien ça ?
Non seulement ça devrait être inférieur à 20, mais même être compris entre zéro et 12 puisque l'envoi se fait après le select case...
Merci de publier votre code (à priori, c'est le même que le mien, mais au cas où il y aurait un problème de copier/coller...)

Après vérification, il semble que PE6 accepte les deux possibilités, mais l'exemple de la doc donne bien SELECT CASE Touche.
Pour être cohérent, il faut donc faire ça à chacun des 3 SELECT CASE
 
Last edited:

zeltron

Senior Member
Ca écrit "Touche=240" ? c'est bien ça ?
non pas touche=240
mais ces valeurs à la suite
240 249 206 244 255 074 210 254
pour une seule frappe sur #
Code:
#rem
###########################################
#  Programme de gestion de pont tournant  #  
#  Moteur PaP 200pas - driver EasyDriver  #
#  Date 27/01/2015 revision 2 JYB         #
###########################################
#ENDREM

#picaxe 40X2
'************  initialisation   *******************
setfreq m16             'frequence 16MHz interne

'*********** E/S ********************************
dirsB = %11100000       ' positionne B.5 et B.6 b7 en sorties

'entrees ------------------------------
symbol FC_opto =  pinB.4   'Fin de course opto

'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

SYMBOL Menu_INIT=0    ;defini un symbole menu_init pour la const 0  
SYMBOL Menu_ETAL=1   ;idem pour 1 etc
SYMBOL Menu_EXPL=2
SYMBOL Menu_ROTO=3
SYMBOL Menu_AIGU=4
SYMBOL Menu_REGL=5

'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




'##############   Programme principal   ############################

init:pause 500
SerOut B.7, N2400, ( 254, %00000001 ) ' efface l'ecran
pause 100


'Text sur display
serout B.7,N2400_16,(254,128,"INITIALISATION..")
serout B.7,N2400_16,(254,192,"APPUYEZ SUR VAL ")
LeMenu=Menu_INIT; Charge la variable b5(le menu)valeur 0
LaVoie=1
L_Aiguille=1


;gestion clavier
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

      sertxd ("Touche=", #Touche,13,10)

	do	' On attends que la touche soit relâchée
   		readadc a.0 , touche 
   	loop while touche < 240    



	select touche
              case = 12
		gosub ChoixValide

	
              case = 11               'correction dernier chiffre
      	             nombre = nombre/10 
		serout B.7,N2400_16,(254,135,#nombre," ")

		
   	else
      	              nombre = nombre*10 + touche 'ajout du chiffre
     		serout B.7,N2400_16,(254,135,#nombre," ")

      endselect
	
	

 loop 




' On fait ce qu'il faut en fonction du menu en cours et du Nombre qui vient d'etre valide.
' En particulier, on affiche un nouveau menu si c'est necessaire

ChoixValide:
	select  LeMenu
	case Menu_INIT
		LeMenu=Menu_EXPL 
		serout B.7,N2400_16,(254,128,"1:ROTO  2:AIGUIL")
		serout B.7,N2400_16,(254,192,"3:REGL  Choix:__")
		

	case Menu_ETAL:
		LeMenu=Menu_ETAL
		serout B.7,N2400_16,(254,128,"Etalon__ Voie ",#LaVoie)
		serout B.7,N2400_16,(254,192,"Cor:EXP Choix:__")


	case Menu_EXPL
	
		select touche
		case 1
			LeMenu=Menu_ROTO
			serout B.7,N2400_16,(254,128,"Voie choisie ",#LaVoie)
			serout B.7,N2400_16,(254,192,"3:EXPL  Choix:__")


		case 2 
			LeMenu=Menu_AIGU
			serout B.7,N2400_16,(254,128,"Aiguil ",#L_Aiguille," Etat=_")
			serout B.7,N2400_16,(254,192,"Cor ou  choix:__")

		case 3
			LeMenu=Menu_REGL
			serout B.7,N2400_16,(254,128,"1:INIT  2:ETALON")
			serout B.7,N2400_16,(254,192,"3:EXPL  Choix:__")
			
	      EndSelect

	


	case Menu_ROTO:
		LaVoie=Nombre
		serout B.7,N2400_16,(254,128,"Voie choisie",#LaVoie)
'...

	case Menu_AIGU:
		L_Aiguille=Nombre
		serout B.7,N2400_16,(254,128,"Aiguil ",#L_Aiguille," Etat=_")

'...

	case Menu_REGL:
'..
	EndSelect
return
 
Last edited:

BESQUEUT

Senior Member
Pour un Picaxe à 16Mhz, il faut régler le terminal à 19200 bauds, affichage en ASCII

Par ailleurs, il y a un problème dans la boucle d'attente du relaché : on écrase la valeur de touche.

remplacer
do ' On attends que la touche soit relâchée
readadc a.0 , touche
loop while touche < 240



Par
do ' On attends que la touche soit relâchée
readadc a.0 , compteur
loop while compteur< 240
 

zeltron

Senior Member
yoooopi ça marche
sur le terminal je récupere les bonnes touches!
et le menu initialisation est validé!
merci et chapo!
 

BESQUEUT

Senior Member
yoooopi ça marche
Vous pouvez maintenant retirer le sertxd et continuer à mettre au point les différents menus.

J'espère que cette phase de mise au point vous aura permis de comprendre ce que signifie le "DEBOGAGE" et les techniques possibles :
- insertion de commentaires (via le sertxd)
- utilisation du simulateur,
- et bien sur un relecture attentive du code...
 

zeltron

Senior Member
Je vous annonce la naissance du bébé
Il se nomme MENU, pese 205 lignes
et le papa à accouché dans la douleur (oui c'est le papa...)
mais il est heureux de vous le présenter!
Code:
#rem
###########################################
#  Programme de gestion de pont tournant  #  
#  Moteur PaP 200pas - driver EasyDriver  #
#  Date 30/01/2015 revision 3 JYB         #
###########################################
#ENDREM

#picaxe 40X2
'************  initialisation   *******************
setfreq m16             'frequence 16MHz interne

'*********** E/S ********************************
dirsB = %11100000       ' positionne B.5 et B.6 b7 en sorties

'entrees ------------------------------
symbol FC_opto =  pinB.4   'Fin de course opto

'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

SYMBOL Menu_INIT=0    ;defini un symbole menu_init pour la const 0  
SYMBOL Menu_ETAL=1   ;idem pour 1 etc
SYMBOL Menu_EXPL=2
SYMBOL Menu_PONT=3
SYMBOL Menu_AIGU=4
SYMBOL Menu_REGL=5
SYMBOL Menu_ROTO=6

'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


'############## Programme principal #################

init:pause 500
SerOut B.7, N2400, ( 254, %00000001 ) ' efface l'ecran
pause 100


'Text sur display
serout B.7,N2400_16,(254,128,"INITIALISATION..")
serout B.7,N2400_16,(254,192,"APPUYEZ SUR   #  ")
LeMenu=Menu_INIT; Charge la variable b5(le menu)valeur 0
LaVoie=1
L_Aiguille=1


;gestion clavier
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 < 240    



	select case touche
		case = 12
		sertxd ("nombre=", #nombre,13,10)
gosub ChoixValide
            
		case = 11      'correction dernier chiffre
      	 nombre = nombre/10 
		serout B.7,N2400_16,(254,207,#touche)
 
		
   	else
     nombre = nombre*10 + touche 'ajout du chiffre
     		serout B.7,N2400_16,(254,207,#touche)
		
		
      endselect
	
	
loop 


' On fait ce qu'il faut en fonction du menu en cours et du Nombre qui vient d'etre valide.
' En particulier, on affiche un nouveau menu si c'est necessaire

ChoixValide:
	select  LeMenu
	case Menu_INIT
		LeMenu=Menu_EXPL 
	serout B.7,N2400_16,(254,128,"1:PONT  2:AIGUIL")
	serout B.7,N2400_16,(254,192,"3:REGL  Choix:__")
		
	case Menu_EXPL
	
		select case nombre
		case 1
			LeMenu=Menu_PONT
serout B.7,N2400_16,(254,128,"Voie en  cours ",#LaVoie)
serout B.7,N2400_16,(254,192,"Voie choisie: __")


		case 2 
			LeMenu=Menu_AIGU
serout B.7,N2400_16,(254,128,"Aiguil ",#L_Aiguille," Etat=_")
	serout B.7,N2400_16,(254,192,"Cor ou  choix:__")

		case 3
		LeMenu=Menu_REGL
serout B.7,N2400_16,(254,128,"1:PONT  2:AIGUIL")	
serout B.7,N2400_16,(254,192,"3:ROTO  Choix:__")	   	nombre=0	
			
endselect


	case Menu_REGL

		select case nombre
			
		case 1

		LeMenu=Menu_ETAL
serout B.7,N2400_16,(254,128,"RECHERCHE du 0  ")	
serout B.7,N2400_16,(254,192,"Attendre svp    ")	   	
		case 2
		LeMenu=Menu_ROTO
serout B.7,N2400_16,(254,128,"INIT AIGUILLAGE ")	
serout B.7,N2400_16,(254,192,"Attendre svp    ")	   			
		
		case 3
		LeMenu=Menu_EXPL
serout B.7,N2400_16,(254,128,"Etalon__ Voie ",#LaVoie)
serout B.7,N2400_16,(254,192,"Cor:EXP Choix:__")	   
		nombre=0

endselect 		
	
	
	Endselect 	

return	
return
il à fait ses 1er pas et il marche plutôt bien
sauf qu'il faudrait interdire les autres touches que 1,2,3
ou un truc dans le genre
car si l'opérateur est un peu bourrin et qu'il ne tappe pas sur la bonne touche
c'est mort...
et puis je ne sais pas comment retourner au menu init
j'ai mis un return pour retourner au menu gosub ChoixValide
mais marche pas...
pour la suite je vais m'occuper de la recherche du 0 pont je pense...
 

zeltron

Senior Member
j'ai intégré au programme la recherche 0 du pont mise au point precedement
ça marche bien
Code:
#rem
###########################################
#  Programme de gestion de pont tournant  #  
#  Moteur PaP 200pas - driver EasyDriver  #
#  Date 30/01/2015 revision 3 JYB         #
###########################################
#ENDREM

#picaxe 40X2
'************  initialisation   *******************
setfreq m16             'frequence 16MHz interne

'*********** E/S ********************************
dirsB = %11100000       ' positionne B.5 et B.6 b7 en sorties

'entrees ------------------------------
symbol FC_opto =  pinB.4   'Fin de course opto

'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

SYMBOL Menu_INIT=0    ;defini un symbole menu_init pour la const 0  
SYMBOL Menu_ETAL=1   ;idem pour 1 etc
SYMBOL Menu_EXPL=2
SYMBOL Menu_PONT=3
SYMBOL Menu_AIGU=4
SYMBOL Menu_REGL=5
SYMBOL Menu_ROTO=6

'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


'############## Programme principal #################

init:pause 500
SerOut B.7, N2400, ( 254, %00000001 ) ' efface l'ecran
pause 100


'Text sur display
serout B.7,N2400_16,(254,128,"INITIALISATION..")
serout B.7,N2400_16,(254,192,"APPUYEZ SUR   #  ")
LeMenu=Menu_INIT; Charge la variable b5(le menu)valeur 0
LaVoie=1
L_Aiguille=1


;gestion clavier
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 < 240    



	select case touche
		case = 12
		sertxd ("nombre=", #nombre,13,10)
gosub ChoixValide
            
		case = 11      'correction dernier chiffre
      	 nombre = nombre/10 
		serout B.7,N2400_16,(254,207,#touche)
 
		
   	else
     nombre = nombre*10 + touche 'ajout du chiffre
     		serout B.7,N2400_16,(254,207,#touche)
		
		
      endselect
	
	
loop 


' On fait ce qu'il faut en fonction du menu en cours et du Nombre qui vient d'etre valide.
' En particulier, on affiche un nouveau menu si c'est necessaire

ChoixValide:
	select  LeMenu
	case Menu_INIT
		LeMenu=Menu_EXPL 
	serout B.7,N2400_16,(254,128,"1:PONT  2:AIGUIL")
	serout B.7,N2400_16,(254,192,"3:REGL  Choix:__")
		
	case Menu_EXPL
	
		select case nombre
		case 1
			LeMenu=Menu_PONT
serout B.7,N2400_16,(254,128,"Voie en  cours ",#LaVoie)
serout B.7,N2400_16,(254,192,"Voie choisie: __")


		case 2 
			LeMenu=Menu_AIGU
serout B.7,N2400_16,(254,128,"Aiguil ",#L_Aiguille," Etat=_")
	serout B.7,N2400_16,(254,192,"Cor ou  choix:__")

		case 3
		LeMenu=Menu_REGL
serout B.7,N2400_16,(254,128,"1:PONT  2:AIGUIL")	
serout B.7,N2400_16,(254,192,"3:ROTO  Choix:__")	   	nombre=0	
			
endselect


	case Menu_REGL

		select case nombre
			
		case 1

		LeMenu=Menu_ETAL
serout B.7,N2400_16,(254,128,"RECHERCHE du 0  ")	
serout B.7,N2400_16,(254,192,"Attendre svp    ")	   	
	GOSUB	Init_PaP:	

		case 2
		LeMenu=Menu_ROTO
serout B.7,N2400_16,(254,128,"INIT AIGUILLAGE ")	
serout B.7,N2400_16,(254,192,"Attendre svp    ")	   			
		
		case 3
		LeMenu=Menu_EXPL
serout B.7,N2400_16,(254,128,"Etalon__ Voie ",#LaVoie)
serout B.7,N2400_16,(254,192,"Cor:EXP Choix:__")	   
		nombre=0

endselect 		
	
	
	Endselect 	

return
'#####################################################

Init_PaP:'s/Programmes 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   
'######################################################
return
maintenant je vais avoir besoin d'un petit coup de pouce
pourquoi je ne parviens pas à reboucler les menus ?

je pense qu'il faut maintenant mettre au point la memo des positions de voies autour du pont
mais j'ai aucune idée comment faire...
 

BESQUEUT

Senior Member
pourquoi je ne parviens pas à reboucler les menus ?
Après le
GOSUB Init_Pap
faire un
LeMenu=
et dessiner le menu qui va bien.

Pour éviter d'avoir plusieurs fois les 2 lignes qui dessinent un menu on pourrait faire un sous programme pour chaque :
Code:
MAJ_Menu_EXPL:
	LeMenu=Menu_EXPL 
	serout B.7,N2400_16,(254,128,"1:PONT  2:AIGUIL")
	serout B.7,N2400_16,(254,192,"3:REGL  Choix:__")
RETURN
et remplacer partout par :
GOSUB MAJ_Menu_EXPL
 

zeltron

Senior Member
j'avais fait un truc dans le genre que vous dites
notamment 2 fois le même menu
mais le souci c'est que le menu ne marche qu'une seule fois
la 1er fois
la seconde fois il se bloque
j'ai placé les lignes comme vous dites (si j'ai bien compris) et le problème reste identique
Code:
#rem
###########################################
#  Programme de gestion de pont tournant  #  
#  Moteur PaP 200pas - driver EasyDriver  #
#  Date 30/01/2015 revision 3 JYB         #
###########################################
#ENDREM

#picaxe 40X2
'************  initialisation   *******************
setfreq m16             'frequence 16MHz interne

'*********** E/S ********************************
dirsB = %11100000       ' positionne B.5 et B.6 b7 en sorties

'entrees ------------------------------
symbol FC_opto =  pinB.4   'Fin de course opto

'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

SYMBOL Menu_INIT=0    ;defini un symbole menu_init pour la const 0  
SYMBOL Menu_ETAL=1   ;idem pour 1 etc
SYMBOL Menu_EXPL=2
SYMBOL Menu_PONT=3
SYMBOL Menu_AIGU=4
SYMBOL Menu_REGL=5
SYMBOL Menu_ROTO=6

'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


'############## Programme principal #################

init:pause 500
SerOut B.7, N2400, ( 254, %00000001 ) ' efface l'ecran
pause 100


'Text sur display
serout B.7,N2400_16,(254,128,"INITIALISATION..")
serout B.7,N2400_16,(254,192,"APPUYEZ SUR   #  ")
LeMenu=Menu_INIT; Charge la variable b5(le menu)valeur 0
LaVoie=1
L_Aiguille=1


;gestion clavier
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 < 240    



	select case touche
		case = 12
		sertxd ("nombre=", #nombre,13,10)
gosub ChoixValide
            
		case = 11      'correction dernier chiffre
      	 nombre = nombre/10 
		serout B.7,N2400_16,(254,207,#touche)
 
		
   	else
     nombre = nombre*10 + touche 'ajout du chiffre
     		serout B.7,N2400_16,(254,207,#touche)
		
		
      endselect
	
	
loop 


' On fait ce qu'il faut en fonction du menu en cours et du Nombre qui vient d'etre valide.
' En particulier, on affiche un nouveau menu si c'est necessaire

ChoixValide:
	select  LeMenu
	case Menu_INIT
MAJ_Menu_EXPL:
		LeMenu=Menu_EXPL 
	serout B.7,N2400_16,(254,128,"1:PONT  2:AIGUIL")
	serout B.7,N2400_16,(254,192,"3:REGL  Choix:__")
return		
	case Menu_EXPL
	
		select case nombre
		case 1
			LeMenu=Menu_PONT
serout B.7,N2400_16,(254,128,"Voie en  cours ",#LaVoie)
serout B.7,N2400_16,(254,192,"Voie choisie: __")


		case 2 
			LeMenu=Menu_AIGU
serout B.7,N2400_16,(254,128,"Aiguil ",#L_Aiguille," Etat=_")
	serout B.7,N2400_16,(254,192,"Cor ou  choix:__")

		case 3
		LeMenu=Menu_REGL
serout B.7,N2400_16,(254,128,"1:PONT  2:AIGUIL")	
serout B.7,N2400_16,(254,192,"3:ROTO  Choix:__")	   	nombre=0	
			
endselect


	case Menu_REGL

		select case nombre
			
		case 1

		LeMenu=Menu_ETAL
serout B.7,N2400_16,(254,128,"RECHERCHE du 0  ")	
serout B.7,N2400_16,(254,192,"Attendre svp    ")	   	
	GOSUB	Init_PaP:	
	GOSUB MAJ_Menu_EXPL
		case 2
		LeMenu=Menu_ROTO
serout B.7,N2400_16,(254,128,"INIT AIGUILLAGE ")	
serout B.7,N2400_16,(254,192,"Attendre svp    ")	   			
		
		case 3
		LeMenu=Menu_EXPL
serout B.7,N2400_16,(254,128,"Etalon__ Voie ",#LaVoie)
serout B.7,N2400_16,(254,192,"Cor:EXP Choix:__")	   
		nombre=0

endselect 		
	
	
	Endselect 	

return
'#####################################################

Init_PaP:'s/Programmes 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   
'######################################################
return
 

dje8269

Senior Member
Apres lecture et relecture du code , je pense que quelques erreurs se glisse au fur et a mesure ; Si vous le permettez , je pourrais essayer une autre approche ( de débutant) , qui pourrait te permettre de comprendre un peu mieux et de pouvoir debugger seul .

AU début , les codes sont beaucoup plus long, car on dissocie presque tout . je pense que tu devrais faire pareil que moi , y'a quelques temps j'ai fais un chenillard avec des menus aussi ; en fait je faisais plusieurs petit programme indépendant les un des autres , que j'appelais a ma guise ; je pense qu'il faudrait peut être faire pareil .
 

zeltron

Senior Member
c'est bon j'ai trouvé ce quil se passe
a chaque fois avant les gosub il faut replacer le compteur nombre à 0
sinon le dernier chiffre est mémorisé et s'ajoute au menu
exemple si l'on saisie 3 puis le prog fait gosub
le menu revient pres à l'emploi
la on saisie 3 et on se retrouve avec 33
donc ca marche pas
pb résolu:D
il y a un truc aussi que je trouve bizarre apres un déplacement du pont
quand il s'arrete
le moteur ronronne en permanence assez fortement c'est assez génant
comme un vieux transfo bruyant

maintenant une idée par quoi continuer?
mettre au point la memo des positions de voies autour du pont
ou autre?
 
Last edited:

dje8269

Senior Member
bon apparement tu as trouvé l'erreur et tant mieux !

comme j'avais deja travailler sur un programme je te le publie. si celuici fonctionne bien , ne le change pas ;

Mes modifs par rapport a ton programme:

perso je comprends mieux quand tout est bien séparé . le programme principal c'est le menu principal qui ne fait qu'attendre un ordre ; une fois l'ordre reçu , il part dans un nouveau programme secondaire . a la fin de se programme secondaire on reviens au début ;

Le sous programme clavier sert a la saisie et a l'attente !

J'ai modifié le fonctionnement du clavier . on peut rentrer des chiffres de 0 a 99 . si on dépasse 99 on re-efface tout.
Pour retourner au menu principal on appui sur correction quand la valeur est a zéro .
J'ai supprimer l'appui sur # au démarrage car plutôt contraignant et l'ai remplacé par un petit compte a rebours, plus sympa .
J'ai créer un message d'erreur si les valeurs rentrées ne sont possibles

Il ne reste plus qu'a remplir les différents sous programme .

Je le répète je ne veux pas , mettre le bazar, si ton programme fonctionne comme tu le souhaite, et si tu le comprends bien ( vu que tu as réussis a le corriger) ne le change surtout pas . Mais tu peux tout de même l'essayer.
j'ai fais ça en attendant que les experts trouvent une solution a mon problème trop complexe pour moi ; et ce fut un plaisir , alors soit certain que si ca te plais pas ou si un expert trouve que part la suite ca va bugger, je le prendrais pas mal du tout ; moi je m'éclate a faire des programmes.

tester seulement en simulation ;

Code:
#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

'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

SYMBOL Menu_INIT=0    ;defini un symbole menu_init pour la const 0  
SYMBOL Menu_ETAL=1   ;idem pour 1 etc
SYMBOL Menu_EXPL=2
SYMBOL Menu_PONT=3
SYMBOL Menu_AIGU=4
SYMBOL Menu_REGL=5
SYMBOL Menu_ROTO=6

'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
		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
      		if nombre = 0 then : return: end if ' Si on appui sur correction on fais un retour
			nombre = nombre/10 
			serout B.7,N2400_16,(254,207,#touche)
			
	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 = 1
			' on effectue la tache pour amener a la voie 1
			' GOSUB changement de voie
			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 = 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 = 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:	
			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   

erreur:
serout B.7,N2400_16,(254,128,"    ERREUR    ")
serout B.7,N2400_16,(254,192,"  DE SAISIE   ")
pause 2000
return
 

zeltron

Senior Member
j'ai testé ton programme il est super!
Efficasse! :p
je vais étudier le code pour comprendre ça merci!
juste un truc
"Pour retourner au menu principal on appui sur correction quand la valeur est a zéro ."
ça marche pas ça...
parce que à cause de ça "J'ai créer un message d'erreur si les valeurs rentrées ne sont possibles"
comme 0 donne un message d'erreur ERREUR DE SAISIE
il n'y a pas de retour au menu principal
merci c'est top!
tu fais comment pour simuler un truc diabolique comme ça?
 

zeltron

Senior Member
j'ai vu que sur ton programme tu marques que tu ne connais
pas une rontonde
en voici une belle
rotonde-ferroviaire-dc3a9pc3b4t-de-bordeaux-saint-jean-bordeaux-france.jpg
la rontonde est autour du pont (ici y'en a 2 !!!!!) c'est les voies et engare
c'est donc l'enregistrement de la position des voies qui se trouvent autour du pont
c'est maintenant que l'on doit s'en occuper je pense
mais je ne sais absolument pas par quoi commencer et comment faire...
 

dje8269

Senior Member
Voila la reparation du code avec la sortie .

En fait si un nombre composé de 2 chiffres est affiché il faudrat 3 appui pour faire retour . Le premier appui efface les dizaines , le deuxième les unités , et la on sera a zero donc le troisieme feras sortir de la boucle .

Concernant la simulation, tu prend mon programme, tu le colle dans PE6 .

tu ouvre la fenêtre option dans l'onglet "fichier" tu le regle comme sur le screen-shoot ( en rouge)
tu devrais voir apparaitre un joli écran LCD simuler . ( en vert )
ensuite tu change la valeur de ton potar dans les options de simulation ( en bleu ) pour definir la valeur des tes boutons .

conseil : pendant la simulation faut mettre la partie moyennage en commentaire pour ne pas se taper les 20 lectures

Code:
#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

'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

SYMBOL Menu_INIT=0    ;defini un symbole menu_init pour la const 0  
SYMBOL Menu_ETAL=1   ;idem pour 1 etc
SYMBOL Menu_EXPL=2
SYMBOL Menu_PONT=3
SYMBOL Menu_AIGU=4
SYMBOL Menu_REGL=5
SYMBOL Menu_ROTO=6

'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
			' on effectue la tache pour amener a la voie 1
			' GOSUB changement de voie
			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:	
			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   

erreur:
serout B.7,N2400_16,(254,128,"    ERREUR    ")
serout B.7,N2400_16,(254,192,"  DE SAISIE   ")
pause 2000
return
Sans titre.jpg
 

dje8269

Senior Member
Joli mais c'est une photo rassure moi ! pas un modele reduit ?

La partie programmation de tout ca , me plait beaucoup , c'est la construction qui me saoulerais je pense . faut etre hyper minitieux ! moi je suis plus du genre , je test et si ca casse ben je re-test encore lol . d'ou ma signature ! y'a que ceux qui ne font rien qui ne font pas d'erreur !
 

zeltron

Senior Member
non ce n'est pas un modele réduit mais ça pourrait exister y'a des gros malades pire que moi
en voici un magnifique exemple ce site est remplie de super panorama
le mec est même dans son réseau...
c'est un projet d'une vie....
http://www.dailymail.co.uk/news/article-2354421/Worlds-largest-model-railroad-draws-thousands-NJ.html#v-2522798281001
voici son tableau de commande
http://www.casimages.com/i/14110404413815873312673027.jpg.html

j'ai testé ton programme c'est de la bombe!
je prefere même ta structure de programmation que la version précedente
parce que je la comprends mieux (peut être est elle plus simple aussi,)
j'aimerais la conserver mais je m'en remet aux experts
viable pour la suite??
je vais essayer de bidouiller la suite pour enregistrer des positions de voies autour du pont...
rdv dans quelques années...:D
 
Last edited:

dje8269

Senior Member
je prefere même ta structure de programmation que la version précedente
Disons que ma structure est plus proche d'une logique de débutant , je pense que c'est pour ca , étant moi même débutant ( enfin y'a un moment faudrait que j'arrête de dire ca !) .

Bien sur on peut l'optimiser encore je pense . mais trop vouloir après on comprend plus .

Je pense que le programme est viable, et comme l'ancien reste bloquant, et encore tout dépend de se qu'on veut faire apres .

Comme tu as du le comprendre , le programme si on touche a rien , attend qu'on presse une touche et ne fais rien d'autre . c'est con pour un µC de se tourner les pouces .
Si on désire lui faire faire des taches , c'est possible , mais pas en même temps . Ou alors des taches bien spécifique en tache de fond .

Un exemple concret vaut tout les discours ;

Disons que si tu ajoute un BP sur une entrée pour lever un passage à niveau par exemple . il pourra faire l'action , mais a ce moment la, le clavier deviendrait inactif ! pareil , si tu es dans un menu du clavier , il ne te sera pas possible d'appuyer sur le bp ET de lever la barrière .

C'est donc une tache a la fois .

Si on veut faire plusieurs chose a la fois , il faudrait dédié un picaxe rien qu'a cette tache et un autre pour le reste par exemple , et une communication entre les deux ;

Mais comme j'ai pas trop compris vaut histoire de pwm , d'inversion de polarité , de relais , etc ..... je laisse les experts compléter mes dires !
 

BESQUEUT

Senior Member
Si on veut faire plusieurs chose a la fois , il faudrait dédié un picaxe rien qu'a cette tache et un autre pour le reste par exemple , et une communication entre les deux ;
Ou bien garder la première structure et scruter non seulement le clavier, mais aussi les boutons poussoir dans la boucle principale.

Dans les choses bloquantes, il y a aussi la rotation du pont. Tant qu'il tourne, pas de manip possible du clavier...
Du coup par exemple, impossible de taper la prochaine position du pont...
sauf si...
on fait aussi avancer le pont dans la boucle principale.
Vous m'avez vu venir bien sur...
Continuez comme ça vous va le mieux.
J'ai déjà préconisé de mettre une ou deux LED pour signaler l'état du programme.
Par exemple une LED verte allumée quand on entre dans la boucle de scrutation du clavier, et éteinte ou rouge dès qu'on en sort.
Ca vous évitera de pester parce que le clavier "ne marche pas"...
Quand vous serez suffisamment agacés par ces blocages intempestifs, vous serez plus motivés pour une autre approche.
 

zeltron

Senior Member
Quand vous serez suffisamment agacés par ces blocages intempestifs, vous serez plus motivés pour une autre approche.
ah mais moi je n'ai pas besoin d'être agacé pour vous demander ce qu'il y a mieux de faire
je vous suit à 100%
je suis motivé pour n'importe quoi, sauf que, soit je ne comprend pas, soit je ne sais pas le faire etc...
vous m'avez proposez cette structure je fais avec si y'en as d'autre je ferai aussi avec pas de pb
c'est quoi la suite comment faire?
pour les led pas de pb d'ayeur je n'ai pas décablé les leds pour l'oscillo elles peuvent toujours servir
et ok soucis pour ajouter autre composants
pour l'arret d'urgence c'est possible de couper l'alimentation puissance de la carte easy driver
 
Last edited:

BESQUEUT

Senior Member
ah mais moi je n'ai pas besoin d'être agacé pour vous demander ce qu'il y a mieux de faire
je vous suit à 100%
je suis motivé pour n'importe quoi, sauf que, soit je ne comprend pas, soit je ne sais pas le faire etc...
Je me suis mal exprimé ; je ne doute pas que vous soyez motivé.
Disons qu'avec un peu plus d'expérience, ça vous semblera moins complexe,
que les fonctionnalités liées au multitasking seront plus évidentes
et donc que le rapport fonctionnalité/complexité deviendra plus favorable.
Mais avant de courir, il faut apprendre à marcher.
 

zeltron

Senior Member
@ dje
mon intention était d'utiliser le programme de Piem (ci dessous) et d'ajouter un inverseur cablé en b3
d'abord lancer le sous programme init pap qui recherche l'emplacement de l'opto et arrete la fente de la poulie axe du pont a ce point de référence
cette référence Piem l'enregistre à 32000
ensuite en partant de cette valeur et position de référence j'aimerais lancer la rotation antihoraire
genre dans une boucle et compter et afficher le nombre de pas en plus de 32000
arreter la rotation quand le pont est en face d'une voie à l'aide de l'inverseur
par la suite pouvoir enregistrer ce nombre de pas comme etant la voie 1 par exemple

j'ai recherché un peu j'arrive à tournerle pont , arreter avec l'inverseur sur la position de la voie
mais alors apres c'est le flou totale...
Code:
Code:
#rem
###########################################
#  Programme de gestion de pont tournant  #  
#  Moteur PaP 200pas - driver EasyDriver  #
#  Date 20141221 revision 2               #
###########################################
#ENDREM

#picaxe 40X2
'************  initialisation   *******************
setfreq m16             'frequence 16MHz interne

'*********** 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 commande carte easydriver
symbol pas     =  B.6      'sortie pas

'*********** variables **************************
symbol var_temp      = w13 'variable temporaire
symbol Pos_actuelle  = w12 'position courante
symbol Pos_cible     = w11 'position cible
symbol Nb_de_pas     = w10 'nombre de pas ? realiser

'reserve bits = b0
symbol Sens = bit0

'*********** 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

'*********** memorisation en EEPROM **************
'*****Table des positions des voies m?morisees ***
eeprom  0,(0,125,256,125,0,126,128,162)

'*********** Macros ******************************
'definition macro avec param?tres; Nb de pas, sens, p?riode 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
'##############   Programme principal   ############################
Prog_princ:
init:pause 500
SerOut B.7, N2400, ( 254, %00000001 ) ' efface l'eran

   gosub Init_PaP
'do
 '  pos_cible = 32800
 '  gosub Mise_en_position
 '  pos_cible = 30000
'   pause 6000
'   gosub Mise_en_position
'   pos_cible = 35000
'  gosub Mise_en_position
'   pause 10000
'loop
'#####################################################################

Init_PaP:   's/Programmes initialisation du moteur pas a pas

   dir = cw
   do while FC_opto = 1    'tout pendant que l'opto est oculte
      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 arri?re
   Do while FC_opto = 1    'en vitesse tr?s lente jusqu'a detection du bord de fente.
      pulsout pas,1
      pause Vit_lente
   loop
   Pos_actuelle = 32000    'la d?tection 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
 
Last edited:

dje8269

Senior Member
Ok je pense pouvoir t'aider ;

La position 32000 doit être en relation avec le 1/8 de pas . en plus et en moins . je regarde ca ce soir en arrivant a la maison , car la suis au taf . Ça devrait pouvoir se faire assez aisément .

Je comprend pas un truc qu'est ce qu'un inverseur ? pour moi c'est une porte logique, mais je vous pas l'intérêt dans ton cas ?
 

zeltron

Senior Member
ok bon courage;)
l'inverseur c'est un simple interrupteur qui envoie 1 sur la borne b3
moi j'y vais bientot au taf!
 

dje8269

Senior Member
Alosr voila ce a quoi j'ai pensé ; Si comme moi, tu es plus manuel qu'intellectuel, tu ira plus vite de cette façon la ;

Il va te falloir un peu de patience au debut mais après ca devrais aller plus vite .

Donc d'après ce que j'ai compris ; 32000 est une position de référence très précise . A partir de la , il faut savoir le nombre de pas a faire pour aller sur une voie . Dans un sens on soustraira 32000 pour avoir le nombre de pas et dans l'autre on soustraira notre valeur .

Je te propose ceci .

Tu affecte une valeur cible, dans ton programme et tu alimente la bete ;

le pont devrais s'initialisé et ensuite allez sur la valeur cible que tu as mis ; il faudra donc que tu trouve la bonne valeur cible a rentrer et recommencer encore et encore jusqu'à trouver la bonne position ; une fois trouvée on calculera et on l'enregistreras ;

Donc la procédure tu rentre une valeur dans la valeur cible . en rouge dans le programme . le pont va se positionner ; c'est t'es trop court , tu augmente le chiffre de la valeur cible, tu re-télécharge, et tu re -allume . le pont va se positionner un peu plus pret , et ainsi de suite jusqu'a trouvé la bonne valeur cible ;

c'est contraignant , mais efficace et certainement plus rapide que changé le programme ,le régler , affiché les valeurs etc . au debut tu va galerer ppur savoir avec un pas combien fais de degré la pont ; mais apres ca devrait aller plus vite ;

ca c'est en attendant , que je réfléchisse a un programme plus sympa et plus rapide, mais si j'ai pas finis avant que tu arrive du taf , tu peux deja commencer comme ca , au pire .

Code:
#rem
###########################################
#  Programme de gestion de pont tournant  #  
#  Moteur PaP 200pas - driver EasyDriver  #
#  Date 20141221 revision 2               #
###########################################
#ENDREM

#picaxe 40X2
'************  initialisation   *******************
setfreq m16             'frequence 16MHz interne

'*********** 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 commande carte easydriver
symbol pas     =  B.6      'sortie pas

'*********** variables **************************
symbol var_temp      = w13 'variable temporaire
symbol Pos_actuelle  = w12 'position courante
symbol Pos_cible     = w11 'position cible
symbol Nb_de_pas     = w10 'nombre de pas ? realiser

'reserve bits = b0
symbol Sens = bit0

'*********** 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

'*********** memorisation en EEPROM **************
'*****Table des positions des voies m?morisees ***
eeprom  0,(0,125,256,125,0,126,128,162)

'*********** Macros ******************************
'definition macro avec param?tres; Nb de pas, sens, p?riode 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
'##############   Programme principal   ############################
Prog_princ:
init:pause 500
SerOut B.7, N2400, ( 254, %00000001 ) ' efface l'eran

   gosub Init_PaP
do
 [COLOR="#FF0000"]  pos_cible = 32800[/COLOR]   gosub Mise_en_position
   
'  pos_cible = 30000
'   pause 6000
'   gosub Mise_en_position
'   pos_cible = 35000
'  gosub Mise_en_position
'   pause 10000
loop
'#####################################################################

Init_PaP:   's/Programmes initialisation du moteur pas a pas

   dir = cw
   do while FC_opto = 1    'tout pendant que l'opto est oculte
      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 arri?re
   Do while FC_opto = 1    'en vitesse tr?s lente jusqu'a detection du bord de fente.
      pulsout pas,1
      pause Vit_lente
   loop
   Pos_actuelle = 32000    'la d?tection 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
 
Last edited:

dje8269

Senior Member
Re,

Bon alors voila un truc qui j'espère te plaira .

Par contre j'ai besoin de savoir comment est cable ton interrupteur pour arreter le pont ?
Dans le programme au debut il faut le mettre l'interrupteur a la masse .

Essaye ca .

il faut faire : sur le clavier et dans l'ordre :
-3 pour Reglages
-1 pour pont
Attendre l'initialisation
ensuite tu active ton interrupteur pour lancer le réglage rapide du pont .
Des que tu t'approche du rail , tu arrete l'interrupteur et tu regle en manuel

pour le reglage en manuel : tu tape sur le clavier le nombre de pas que tu veux voir avancer le pont ; les valeurs a rentrées vont de 1 à 98 . La valeur 0 fait faire un bon de 100 pas en arriére si jamais tu dépasse les rails . la valeur 99 fais sortir du réglage ;

Au départ avance progressivement .

J'espere que ca va marché : bon amusement ( une p'tite vidéo si ca marche du premier coup)

Code:
#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 **************************
arrière 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_J'espère       = 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

SYMBOL Menu_INIT=0    ;defini un symbole menu_init pour la const 0  
SYMBOL Menu_ETAL=1   ;idem pour 1 etc
SYMBOL Menu_EXPL=2
SYMBOL Menu_PONT=3
SYMBOL Menu_AIGU=4
SYMBOL Menu_REGL=5
SYMBOL Menu_ROTO=6

'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
			' on effectue la tache pour amener a la voie 1
			' GOSUB changement de voie
			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,"Ajout de pas: ")
			
			dir = cw	' 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,206,"_?")
			do
				gosub clavier		' on va lire le clavier
				select case nombre
					case = 0
						dir = ccw	' 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
						return
					else
						dir = cw	' 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   

erreur:
serout B.7,N2400_16,(254,128,"    ERREUR    ")
serout B.7,N2400_16,(254,192,"  DE SAISIE   ")
pause 2000
return
 
Top