positionnement avec un moteur pas à pas

PieM

Senior Member
votre variable transmise est dat (w22) soit les byte 44 et 45
par convention on décide que b44 concerne les bobine droites et b45 les bobines gauches
(donc par exemple aiguillage 3 cablé sur port2 et sur port 12 du pcf)

si on veut mettre la bobine 5 à droite il faut donc mettre le bit 4 de dat(car on part de 0) à 0
si on veut mettre la bobine 5 à gauche il faut donc mettre le bit 4 de b45 à 0 donc c'est le bit 12 de dat.

donc si N = 5 à droite il suffit d'écrire
adr_bit = N-1
puis clearbit dat , adr_bit
et le hi2cout

et si N = 5 à gauche il suffit d'écrire
adr_bit = N-1 + 8 (donc +7)
puis clearbit dat , adr_bit
et le hi2cout

à suivre...
ne pas s'inquiéter car tout ça va se faire tout seul dans une macro!
 

PieM

Senior Member
on a dit qu'il fallait aussi memoriser cet état dans la variable d'état de votre groupe d'aiguillage correspondant au pcf.
si on convient de dire que 1 c'est à droite

setbit byte_état, adr_bit si on a commandé à droite
clearbit byte_état, adr_bit si on a commandé à gauche

là aussi il faut automatiser la chose : byte_état va représenter autant de variables que de pcf.
guère possible de dire:
if adr_pcf = xx then: w xx = ....

Une méthode permet d'adresser des mémoires par index:
b0 est une variable en RAM qu'on peut adresser adresser autrement
si vous ecrivez poke 0, 124, c'est exactement pareil que d'écrire b0 = 124

l'avantage c'est qu'on dispose sur un X2 de 200 mémoires dont seules les 54 premières sont adressable par les noms bx
l'inconvénient est qu'on ne peut pas faire de calcul directement dessus.
donc il faut appeler la variable par un peek, la mettre dans une variable temporaire, faire le calcul, puis l'actualiser par un poke.
(On ferait pareil pour un mémorisation en EEprom)

si on décide de stocker toute nos valeurs d'état à partir de l'adresse 100 par exemple,
pour la mettre à jour:
adr_mem = 100 + adr_pcf
peek, adr_mem, var_temp
clearbit var_temp , adr_bit
(ou setbit var_temp , adr_bit)
poke, adr_mem, var_temp


à suivre. c'est bientôt fini !
 

zeltron

Senior Member
ok ok quel suspense!
setbit byte_état, adr_bit si on a commandé à droite
clearbit byte_état, adr_bit si on a commandé à gauche
ça c'est aussi pour les visus leds setbit pour l'anode diode 1 et clearbit pour la cathode diode 2 non?
 

PieM

Senior Member
ok ok quel suspense!
setbit byte_état, adr_bit si on a commandé à droite
clearbit byte_état, adr_bit si on a commandé à gauche
ça c'est aussi pour les visus leds setbit pour l'anode diode 1 et clearbit pour la cathode diode 2 non?
ben oui !...
 

PieM

Senior Member
bon, à tester car j'ai fait ça un peu sans filet:


Code:
[color=Navy]#MACRO [/color][color=Black]act_aiguille [/color][color=Blue]([/color][color=Black]N,sens[/color][color=Blue])[/color][color=Green]'commmande de l'aiguille N à droite ou à gauche
   
   [/color][color=Black]adr_pcf [/color][color=DarkCyan]= [/color][color=Black]N[/color][color=DarkCyan]/[/color][color=Navy]8 [/color][color=DarkCyan]+ [/color][color=Navy]$20 [/color][color=DarkCyan]<<[/color][color=Navy]1
   [/color][color=Black]adr_bit [/color][color=DarkCyan]= [/color][color=Black]N[/color][color=DarkCyan]//[/color][color=Navy]8 [/color][color=DarkCyan]-[/color][color=Navy]1 
   [/color][color=Black]adr_mem [/color][color=DarkCyan]= [/color][color=Navy]100 [/color][color=DarkCyan]+ [/color][color=Black]adr_pcf [/color][color=Green]'calcul de l'adresse memoire en RAM
   
   [/color][color=Blue]peek [/color][color=Black]adr_mem, var_temp [/color][color=Green]'on va chercher le byte d'état
   [/color][color=Blue]if [/color][color=Black]sens [/color][color=DarkCyan]= [/color][color=Black]droite [/color][color=Blue]then  
      setbit [/color][color=Black]var_temp , adr_bit [/color][color=Green]'on met à 1 (droite) le bon bit adr_bit
   [/color][color=Blue]else
      clearbit [/color][color=Black]var_temp , adr_bit [/color][color=Green]'on met à 0 (gauche) le bon bit adr_bit
      [/color][color=Black]adr_bit [/color][color=DarkCyan]= [/color][color=Black]adr_bit [/color][color=DarkCyan]+ [/color][color=Navy]7 [/color][color=Green]'et on change l'adresse du bit de cde pour etre dans b45 
   [/color][color=Blue]endif
   poke [/color][color=Black]adr_mem, var_temp [/color][color=Green]' on enregistre le nouvel état dans la variable du byte d'état
   [/color][color=Blue]clearbit [/color][color=Black]dat,adr_bit [/color][color=Green]'on met à 0 le bit de dat pour la cde. Il sera dans b44 ou b45 selon le sens.
   [/color][color=Blue]hi2cout [/color][color=Black]adr_pcf, [/color][color=Blue]([/color][color=Purple]b44[/color][color=Black],[/color][color=Purple]b45[/color][color=Blue]) [/color][color=Green]' commande la bobine N a droite ou à gauche
   [/color][color=Blue]pause [/color][color=Black]pause_aig
   [/color][color=Blue]hi2cout [/color][color=Black]adr_pcf, [/color][color=Blue]([/color][color=Navy]$FF[/color][color=Black],[/color][color=Navy]$FF[/color][color=Blue]) [/color][color=Green]'RAZ cde bobine[/color]
[color=Navy]#ENDMACRO[/color]
Donc cette macro fait , en principe , tout ce que j'ai expliqué plus haut.

Il faut la mettre sous la macro existante.
il faut definir 3 variables nouvelles:
adr_pcf (byte)
adr_bit (byte)
adr_mem (byte)

et deux constantes :
droite = 1
gauche = 0

vous aurez des variables existantes qui ne servent plus.

pour commander un aiguillage: le 3 à gauche par ex...

act_aiguille (3, gauche)
nota: le 3 peut être une variable

faudra voir ce que vous voulez afficher avec vos leds liées aux aiguillages car on va sans doute pouvoir l'ajouter facilement dans la même commande.
 

zeltron

Senior Member
ok merci je vais tester ça demain, merci
pour l'affichage des leds c'est la dirertion droite/gauche
et le temps de commutation c'est important afin de voir que l'aiguillage ne reste pas commandé à la suite d'un bug imprévu
car sinon y(a plus que l'odeur de l'aiguillage mais c'est trop tard et à 60 euros l'aiguillage....
 

PapyJP

Senior Member
... pour l'affichage des leds c'est la dirertion droite/gauche ....
Comprends pas ! Rassurez-moi !
A l'échelle HO, une aiguille est droite OU gauche MAIS PAS LES DEUX !.
A l' échelle "Z" c' est possible ?
On n' arréte pas le progrés ...
 

zeltron

Senior Member
non non ce n'est pas possible c'est l'un ou l'autre
mais il faut bien 2 leds pour voir l'état car c'est penible de regarder l'état visuel sur l'aiguillage
et il peut être positionné dans un tunnel...

j'ai modifie le prog en consequence je dois encore faire une erreur
car N ne passe pas à l'utilisation que ce soit en chiffre ou variable
voici le text
View attachment AIG.txt
 

PieM

Senior Member
Dans la commande act_aiguille (N, droit), N est la valeur que vous avez sélectionnée ici, avec le clavier.

Il faut donc écrire act_aiguille (nombre, droit) et dans la macro, le N sera remplacé par nombre.
Ou alors puisque vous avez écrit avant que N= nombre, il faut que N soit défini comme une variable byte.

Autre chose : il faut ajouter en début de macro, c'est le mieux, l'initialisation systématique de dat à la valeur de repos cacd dat = $FFFF
Code:
[color=Navy]#MACRO [/color][color=Black]act_aiguille[/color][color=Blue]([/color][color=Black]N,[/color][color=Purple]sens[/color][color=Blue])

   [/color][color=Purple]dat [/color][color=DarkCyan]= [/color][color=Navy]$FFFF 
   [/color][color=Purple]adr_pcf [/color][color=DarkCyan]= [/color][color=Black]N[/color][color=DarkCyan]/[/color][color=Navy]8 [/color][color=DarkCyan]+ [/color][color=Navy]$20 [/color][color=DarkCyan]<<[/color][color=Navy]1
   [/color][color=Purple]adr_bit [/color][color=DarkCyan]= [/color][color=Black]N[/color][color=DarkCyan]//[/color][color=Navy]8[/color][color=DarkCyan]-[/color][color=Navy]1 
   [/color][color=Purple]adr_mem [/color][color=DarkCyan]= [/color][color=Navy]100 [/color][color=DarkCyan]+ [/color][color=Purple]adr_pcf [/color][color=Green]'calcul de l'adresse memoire en RAM
   [/color][color=Purple]bit0 [/color][color=DarkCyan]= [/color][color=Purple]sens
   [/color][color=Blue]peek [/color][color=Purple]adr_mem[/color][color=Black], [/color][color=Purple]var_temp [/color][color=Green]'on va chercher le byte d'?tat
   [/color][color=Blue]if [/color][color=Purple]bit0 [/color][color=DarkCyan]= [/color][color=Navy]1 [/color][color=Blue]then 
      setbit [/color][color=Purple]var_temp [/color][color=Black], [/color][color=Purple]adr_bit [/color][color=Green]'on met ? 1 (droite) le bon bit adr_bit
   [/color][color=Blue]else
      clearbit [/color][color=Purple]var_temp [/color][color=Black], [/color][color=Purple]adr_bit [/color][color=Green]'on met ? 0 (gauche) le bon bit adr_bit
      [/color][color=Purple]adr_bit [/color][color=DarkCyan]= [/color][color=Purple]adr_bit [/color][color=DarkCyan]+ [/color][color=Navy]7 [/color][color=Green]'et on change l'adresse du bit de cde pour etre dans b45 
   [/color][color=Blue]endif
   poke [/color][color=Purple]adr_mem[/color][color=Black], [/color][color=Purple]var_temp [/color][color=Green]' on enregistre le nouvel ?tat dans la variable du byte d'?tat
   [/color][color=Blue]clearbit [/color][color=Purple]dat[/color][color=Black],[/color][color=Purple]adr_bit [/color][color=Green]'on met ? 0 le bit de dat pour la cde. Il sera dans b44 ou b45 selon le sens.
   [/color][color=Blue]hi2cout [/color][color=Purple]adr_pcf[/color][color=Black], [/color][color=Blue]([/color][color=Purple]b44[/color][color=Black],[/color][color=Purple]b45[/color][color=Blue]) [/color][color=Green]' commande la bobine N a droite ou ? gauche
   [/color][color=Blue]pause pause_aig
   hi2cout [/color][color=Purple]adr_pcf[/color][color=Black], [/color][color=Blue]([/color][color=Navy]$FF[/color][color=Black],[/color][color=Navy]$FF[/color][color=Blue]) [/color][color=Green]'RAZ cde bobine[/color]
[color=Navy]#ENDMACRO[/color]

de plus,
case < 7:N = nombre
gosub commande_aig

pourquoi limiter à 7 ?

et le temps de commutation c'est important afin de voir que l'aiguillage ne reste pas commandé à la suite d'un bug imprévu
mais le temps de commutation ne sera pas visualisé, à moins de mettre une led en // des bobines ( ou une led reliée via une diode à chaque bobine)
 
Last edited:

zeltron

Senior Member
de plus,
case < 7:N = nombre
gosub commande_aig

pourquoi limiter à 7 ?
C'est le programme du 1er picaxe il ne s'occupe que de 12 bobines (celle du dépot)
les autres aiguillages seront commandé par l'autre picaxe
je discocie ce programme car pour cette partie réseau il n'y a que du séquentiel
l'autre picaxe lui va s'occuper des itineraires les trains sur cette parties vont se retrouver à tourner pendant que sur l'autre picaxe le pont peux tourner aussi
donc je prefere diviser pour eviter le lapin (j'ai peur du lapin_garou )



mais le temps de commutation ne sera pas visualisé, à moins de mettre une led en // des bobines ( ou une led reliée via une diode à chaque bobine)
c'etait bien mon intention ok ça ajouter 10mA de plus en conso mais ç'est trop utile pour s'en passe

Ou alors puisque vous avez écrit avant que N= nombre, il faut que N soit défini comme une variable byte.
j'avais fait cette technique mais ensuite N était refusé dans le sous programme commande aig

et maintenant je viens de tester avec nombre dans la macro et le sous programme
et c'est idem nombre est refusé
 
Last edited:

alainav1

Senior Member
Bonjour,
je ne connaissais pas la possiblilité d' inclure des macro
#MACRO act_aiguille(N,sens)
....
.....

ENDmacro

je n'ai pas vu (ou mal cherché cette info sur le descriptif du basic)
cette fonction est elle disponible sut tous les picaxe ?
cordalement
Alain
 

PieM

Senior Member
j'avais fait cette technique mais ensuite N était refusé dans le sous programme commande aig

et maintenant je viens de tester avec nombre dans la macro et le sous programme
et c'est idem nombre est refusé
Oui il y avait une erreur de syntaxe et un petit pb dans la macro:
recopiez exactement le prog que je vous donne en 571

et la commande est act_aiguille(xxxxx) sans espace entre aiguille et la (

alainav1 said:
je ne connaissais pas la possiblilité d' inclure des macro
C'est dispo pour tous les Picaxes puisque c'est géré par le préprocesseur de PE6.
Il y a un peu de doc là http://www.picaxe.com/docs/pe6.pdf

par exemple pour mettre tous les aiguillages de 5 à 12 à droite, il suffit de faire
for i= 5 to 12
act_aiguille(i, droite)
next

chaque aiguille sera mise en place et la position sera inscrite dans la mémoire d'état qui en plus va servir pour commander les leds....

Par contre si on écrit :
act_aiguille(5, droite)
act_aiguille(6, droite)
act_aiguille(7, droite)
....
le préprocesseur va remplacer chaque appel de macro par la macro elle même.

ça tiens donc plus de place en mémoire, par contre c'est plus rapide en exécution que de faire appel à des gosub.
c'est un choix à faire.
 
Last edited:

zeltron

Senior Member
la verification passe
ça va être le bonheur ce truc!
mais pour l'instant y'a comme une arête dans la macro...
je vous livre le code c'est peut être moi qui à encore fait des bétises
View attachment AIG.txt
et pour le descriptif du bug une video va suivre c'est plus simple qu'une longue explication
vous verrez en particulier apres un 1er démarrage correcte du programme
un redemarrage provoque une alimentation de presque tous les relais 1à8...
 

PieM

Senior Member
au départ vous faites:
let dat = 65535 ; charge data %11111111_11111111
hi2cout (b44,b45);envoi de la data sur bus i2c
let dat = 0 ; charge data avec la valeur %0000000000000000
hi2cout (b44,b45) ; envoi de la donnee data

let dat = 65535 ; charge data %11111111_11111111
hi2cout (b44,b45);envoi de la data sur bus i2c

comprends pas ... le hi2cout(0,0) va tout activer. d'ailleurs au 1er démarrage tous les relais s'allument furtivement....

oop's
gourance : dans la macro, c'est
adr_bit = adr_bit + 8
et non +7 !

Je pense à un truc pour la visu de la commutation:
sur la ligne générale d'alim des bobines, une R de petite valeur (ou deux diodes en série)
un optocoupleur alimenté par la ddp aux bornes
et en sortie une led qui va s'allumer à chaque commutation de bobine.... ou ramener ça sur un picaxe qui déclenche une sirène et un extincteur en appelant le 112.
 
Last edited:

zeltron

Senior Member
comprends pas ... le hi2cout(0,0) va tout activer. d'ailleurs au 1er démarrage tous les relais s'allument furtivement....

bé vi mais je fais ça pour initialiser la carte pcf c'est obligatoire non? ou alors j'ai mal compris?

ok je met ça dans un coin de ma memoire pour la visu led et l'oto pourrait aussi alimenter en 230 v le siege de l'operateur
car regarder les trains c'est soporifique!

je viens de tester la modif à 8 mais point de vue essais visuellement c'est idem que la vidéo
 
Last edited:

PieM

Senior Member
bé vi mais je fais ça pour initialiser la carte pcf c'est obligatoire non? ou alors j'ai mal compris?
pas lu ça moi !

ok je met ça dans un coin de ma memoire pour la visu led et l'oto pourrait aussi alimenter en 230 v le siege de l'operateur
car regarder les trains c'est soporifique!
mettez une vache échelle Z pour regarder passer les trains.

je viens de tester la modif à 8 mais point de vue essais visuellement c'est idem que la vidéo
moi quand je commande act_aiguille(2,gauche), j'ai bien le 2éme bit de b45 à 0 et tous les autres à 1 y compris b44
2015-02-21 001.jpg

De toute façon vous devez avoir un pb de câblage car vous avez systématiquement 7 relais actionnés. Les 16 relais representent bien les 16 bobines de 8 aiguillages ?
 
Last edited:

zeltron

Senior Member
non je ne pense pas avoir un pb de cablage la version précédente de mon programme (certe un peu lourd)
fonctionne nickel
je commande bien chaque aiguillages désiré et seulement 1

"pas lu ça moi"
moi j'ai lu la phrase ci dessous et j'ai interprété ça avec cette programmation d'initialisation
et comme ça marchait ensuite j'ai déduit que c'était la bonne commande....

l'adresse du 8575 est la même que le 8574.
voir #499
par contre sur un 8575, il faut envoyer les deux octets représentant les ports 0 à 7 et 10 à 17.
ce n'est qu'après que les sorties sont mises à jour.
Les 16 relais representent bien les 16 bobines de 8 aiguillages ?
oui je ne vous fais pas une vidéo de l'ancien programme mais vous pouvez me croire
 
Last edited:

PieM

Senior Member
Alors expliquez moi pourquoi vous avez 7 relais systématiquement actionnés quelque soit l'ordre que vous envoyez ....
si vous envoyez 11111101 11111111 vous êtes bien d'accord que vous devriez n'avoir qu'un relais actionné ?

c'est ce qu'on envoie quand on fait act_aiguille(2,gauche)
et
11111111 11111101 quand on fait act_aiguille(2,droite)
c'est ce que je vous montrais sur la copie d'écran.

faites un sertxd de b44 et b45 pour savoir quelles valeurs sont envoyées par i2c
sur la vidéo quand vous tapez 1 gauche, ça s'allume sur le même coté que 1 droite !!

quant à
par contre sur un 8575, il faut envoyer les deux octets représentant les ports 0 à 7 et 10 à 17.
j'ai dit ça pour signaler que si on envoyait qu'un seul octet, les sorties n'étaient pas mises à jour seulement avec 8 bits. Il faut deux octets (ici b44 et b45) pour que les sorties s'activent.
donc vous pouvez virer les 6 lignes de l'initialisation.

vous pouvez laisser par sécurité un hi2cout ( $FF,$FF) mais ça ne sert que pour le premier pcf8575.
 

zeltron

Senior Member
alors je suis d'accord avec vous à 100%
Mais je n'ai pas la prétention de pouvoir vous expliquer pourquoi c'est comme ça
moi ce qui m'etonne le plus ce n'est pas que ça marche pas ça j'ai l'habitude
c'est le bug au redemarrage que je trouve limite xfiles!

je viens de filmer l'ancien programme et vous allez voir qu'il tourne parfaitement
donc oubliez le cablage

vous allez juste remarquer que quand je demande l'aiguillage 1 c'est le relais 2 qui s'allume
tout est décalé de 1
mais c'est moi qui le demande dans le programme à cause de l'initialisation de tout les aiguillages
à droite qui commence par le relais 2... n'ayant pas réuci à modifier dans la boucle le responsable de ce petit défaut de programme j'ai fait avec... le relais 2 deviendra l'aiguillage 1 m'en fou
c'est juste ensuite une question de cablage des aiguillages

ok pour virer les 6 lignes d'utilisations de toute façon ayant à cabler un arret d'urgence je n'aurai pas activé la connexion au démarrage
et vi j'ai plus l'habitude du hard que du soft
vidéo à suivre le temps que youtube travaille...
 

PieM

Senior Member
je me répète mais faites un sertxd de b44 et b45 pour savoir quelles valeurs sont envoyées par i2c
Sinon on ne va jamais s'en sortir !
Ce n'est pas la vidéo de l'ancien programme qui va permettre de résoudre le problème.

Je ne sais pas comment est cablé votre pcf
le programme donné suppose que sur le pcf,
l'aiguillage 1 droit est sur port0, le gauche sur le port10
.........................................................................
l'aiguillage 8 droit est sur port7, le gauche sur le port17
 
Last edited:

zeltron

Senior Member
avec sertxd pour aiguillage 1 a droite FF et gauche BF parfois DF....
le pcf est cablé par l'intermediare d'un connecteur directement enfiché sur la carte relais
sans aucune inversion
p00 correspond a k1
p01 k2
p02 k3
p03 k4 etc
c'est dans l'ordre
le cablage n'explique pas pourquoi tout les relais d'un port se retrouvent alimentés en même temps
 
Last edited:

PieM

Senior Member
avec sertxd pour aiguillage 1 a droite FF et gauche BF parfois DF....
alors c'est n'importe quoi !

avec la macro que je vous ai donnée je n'ai pas du tout ce résultat... sourtout une valeur qui varie !

le pcf est cablé par l'intermediare d'un connecteur directement enfiché sur la carte relais
sans aucune inversion
ben oui mais ça ne me dit pas dans quel ordre on est ...
 

zeltron

Senior Member
pour l'ordre je ne sais pas vous repondre plus que cité ci dessus
le relais 1 et sur le bit 0 le
le 8 sur le bit 7
le relais 9 sur le bit 0 port 2
le relais 16 sur le bit 15
de toute façon quelque soit le relais ou aiguillage qui s'active j'adapterai le câblage en consequence
la video en #587 permet de s'affranchir du câblage c'est déjà ça....
j'aimerai bien pouvoir vous aider plus mais...
 

PieM

Senior Member
j'aimerai bien pouvoir vous aider plus mais...
Donc à priori les connexions sont OK. On va y arriver ...

j'ai gardé uniquement le début du programme pour tester. En simulation ça marche très bien. Merci de le tester en réel.
il n'y a qu'une boucle qui actionne les 8 à droite puis les 8 à gauche.
me dire ce qui se passe.

Code:
[color=Navy]#picaxe [/color][color=Black]40X2[/color]
[color=Navy]#no_data[/color][color=Green]'permet de ne pas ecraser la memoire pendant une reprogrammation

'*********** E/S ********************************[/color]
[color=Purple]dirsB [/color][color=DarkCyan]= [/color][color=Navy]%11100000       [/color][color=Green]' positionne B.5 et B.6 b7 en sorties

'entrees ------------------------------[/color]
[color=Blue]symbol [/color][color=Purple]FC_opto [/color][color=DarkCyan]=  [/color][color=Purple]pinB.4   [/color][color=Green]'Fin de course opto[/color]
[color=Blue]symbol [/color][color=Purple]Stop_rota [/color][color=DarkCyan]=  [/color][color=Purple]pinB.3   [/color][color=Green]'arret moteur pas ? pas
'sorties ------------------------------[/color]
[color=Blue]symbol [/color][color=Purple]dir     [/color][color=DarkCyan]=  [/color][color=Purple]pinB.5   [/color][color=Green]'sortie direction[/color]
[color=Blue]symbol pas     [/color][color=DarkCyan]=  [/color][color=Blue]B.6      [/color][color=Green]'sortie pas

'*********** variables **************************[/color]
[color=Blue]symbol [/color][color=Purple]touche        [/color][color=DarkCyan]= [/color][color=Purple]b2[/color]
[color=Blue]Symbol [/color][color=Purple]nombre        [/color][color=DarkCyan]= [/color][color=Purple]b3[/color]
[color=Blue]Symbol [/color][color=Purple]Compteur      [/color][color=DarkCyan]= [/color][color=Purple]b4[/color]
[color=Blue]Symbol [/color][color=Purple]LaVoie     [/color][color=DarkCyan]= [/color][color=Purple]b6 [/color][color=Green]' La Voie actuellement s?lectionn?e[/color]
[color=Blue]Symbol [/color][color=Purple]N          [/color][color=DarkCyan]= [/color][color=Purple]b7  [/color][color=Green]' L'aiguille actuellement choisie[/color]
[color=Blue]Symbol [/color][color=Purple]boucle     [/color][color=DarkCyan]= [/color][color=Purple]b8[/color]
[color=Green]'Symbol Etat_Aig     = b9[/color]
[color=Blue]Symbol [/color][color=Purple]adr_pcf       [/color][color=DarkCyan]= [/color][color=Purple]b10[/color]
[color=Blue]Symbol [/color][color=Purple]adr_bit       [/color][color=DarkCyan]= [/color][color=Purple]b11[/color]
[color=Blue]Symbol [/color][color=Purple]adr_mem       [/color][color=DarkCyan]= [/color][color=Purple]b12[/color]

[color=Green]'reserve de mot      w21 b43 b42[/color]
[color=Blue]symbol [/color][color=Purple]dat        [/color][color=DarkCyan]= [/color][color=Purple]w22 [/color][color=Green]'variable pour i2c b45 b44[/color]
[color=Blue]symbol [/color][color=Purple]Nb_de_pas     [/color][color=DarkCyan]= [/color][color=Purple]w23 [/color][color=Green]'nombre de pas ?  b47 b46[/color]
[color=Blue]symbol [/color][color=Purple]Pos_cible     [/color][color=DarkCyan]= [/color][color=Purple]w24 [/color][color=Green]'position cible pont b49 b48[/color]
[color=Blue]symbol [/color][color=Purple]Pos_actuelle  [/color][color=DarkCyan]= [/color][color=Purple]w25 [/color][color=Green]'position courante b51 b50[/color]
[color=Blue]symbol [/color][color=Purple]var_temp      [/color][color=DarkCyan]= [/color][color=Purple]w26 [/color][color=Green]'variable temporaire b53 b52[/color]
[color=Blue]Symbol [/color][color=Purple]addition      [/color][color=DarkCyan]= [/color][color=Purple]w27 [/color][color=Green]'b55 b54

'*********** constantes **************************[/color]
[color=Blue]symbol CW [/color][color=DarkCyan]= [/color][color=Navy]1              [/color][color=Green]'sens horaire[/color]
[color=Blue]symbol CCW [/color][color=DarkCyan]= [/color][color=Navy]0             [/color][color=Green]'sens anti horaire (arbitraire)[/color]
[color=Blue]symbol Vit_lente  [/color][color=DarkCyan]=  [/color][color=Navy]100   [/color][color=Green]'predefini vitesse lente[/color]
[color=Blue]symbol Vit_moy    [/color][color=DarkCyan]=  [/color][color=Navy]40[/color]
[color=Blue]symbol Vit_rapide [/color][color=DarkCyan]=  [/color][color=Navy]10    [/color][color=Green]'et vitesse rapide[/color]
[color=Blue]symbol pause_aig  [/color][color=DarkCyan]=  [/color][color=Navy]1700  [/color][color=Green]'temps de commutation des aiguillages[/color]
[color=Blue]symbol [/color][color=Purple]Sens [/color][color=DarkCyan]= [/color][color=Purple]bit0[/color]
[color=Blue]symbol droite [/color][color=DarkCyan]= [/color][color=Navy]1[/color]
[color=Blue]symbol gauche [/color][color=DarkCyan]= [/color][color=Navy]0[/color]

[color=Green]'*********** Macros ******************************
'definition macro avec parametres; Nb de pas, sens, periode entre pas.[/color]
[color=Gray]{[/color]
[color=Navy]#MACRO [/color][color=Black]PaP[/color][color=Blue]([/color][color=Black]Nb,[/color][color=Purple]Sens[/color][color=Black],Per[/color][color=Blue])
   [/color][color=Purple]dir [/color][color=DarkCyan]= [/color][color=Purple]Sens        [/color][color=Green]'affecte 1 ou 0 ? dir donc ? B.5
   [/color][color=Blue]for [/color][color=Purple]var_temp [/color][color=DarkCyan]= [/color][color=Navy]0 [/color][color=Blue]to [/color][color=Black]Nb [/color][color=Green]'envoie Nb pulses au circuit
      [/color][color=Blue]pulsout pas[/color][color=Black],[/color][color=Navy]1        [/color][color=Green]'driver
      [/color][color=Blue]pause [/color][color=Black]Per   [/color][color=Green]' pause en X fois 5?s
   [/color][color=Blue]next
   [/color][color=Purple]Pos_actuelle [/color][color=DarkCyan]= [/color][color=Purple]sens [/color][color=DarkCyan]* [/color][color=Navy]2 [/color][color=DarkCyan]* [/color][color=Black]Nb [/color][color=DarkCyan]+ [/color][color=Purple]Pos_actuelle [/color][color=DarkCyan]- [/color][color=Black]Nb [/color][color=Green]'actualisation position du pont
   'si sens =1 on ajoute Nb pas ? Pos_actuelle sinon on lui retranche Nb pas ;-)[/color]
[color=Navy]#ENDMACRO[/color]
[color=Gray]}[/color]

[color=Green]'commmande de l'aiguille N ? droite ou ? gauche[/color]
[color=Gray]{[/color]
[color=Navy]#MACRO [/color][color=Black]act_aiguille[/color][color=Blue]([/color][color=Purple]N[/color][color=Black],[/color][color=Purple]sens[/color][color=Blue])

   [/color][color=Purple]dat [/color][color=DarkCyan]= [/color][color=Navy]$FFFF 
   [/color][color=Purple]adr_pcf [/color][color=DarkCyan]= [/color][color=Purple]N[/color][color=DarkCyan]/[/color][color=Navy]8 [/color][color=DarkCyan]+ [/color][color=Navy]$20 [/color][color=DarkCyan]<<[/color][color=Navy]1
   [/color][color=Purple]adr_bit [/color][color=DarkCyan]= [/color][color=Purple]N[/color][color=DarkCyan]//[/color][color=Navy]8 [/color][color=DarkCyan]- [/color][color=Navy]1 [/color][color=DarkCyan]max [/color][color=Navy]7
   [/color][color=Purple]adr_mem [/color][color=DarkCyan]= [/color][color=Navy]100 [/color][color=DarkCyan]+ [/color][color=Purple]adr_pcf [/color][color=Green]'calcul de l'adresse memoire en RAM
   [/color][color=Purple]bit0 [/color][color=DarkCyan]= [/color][color=Purple]sens
   [/color][color=Blue]peek [/color][color=Purple]adr_mem[/color][color=Black], [/color][color=Purple]var_temp [/color][color=Green]'on va chercher le byte d'?tat
   [/color][color=Blue]if [/color][color=Purple]bit0 [/color][color=DarkCyan]= [/color][color=Navy]1 [/color][color=Blue]then 
      setbit [/color][color=Purple]var_temp [/color][color=Black], [/color][color=Purple]adr_bit [/color][color=Green]'on met ? 1 (droite) le bon bit adr_bit
   [/color][color=Blue]else
      clearbit [/color][color=Purple]var_temp [/color][color=Black], [/color][color=Purple]adr_bit [/color][color=Green]'on met ? 0 (gauche) le bon bit adr_bit
      [/color][color=Purple]adr_bit [/color][color=DarkCyan]= [/color][color=Purple]adr_bit [/color][color=DarkCyan]+ [/color][color=Navy]8 [/color][color=Green]'et on change l'adresse du bit de cde pour etre dans b45 
   [/color][color=Blue]endif
   poke [/color][color=Purple]adr_mem[/color][color=Black], [/color][color=Purple]var_temp [/color][color=Green]' on enregistre le nouvel ?tat dans la variable du byte d'?tat
   [/color][color=Blue]clearbit [/color][color=Purple]dat[/color][color=Black],[/color][color=Purple]adr_bit [/color][color=Green]'on met a 0 le bit de dat pour la cde. Il sera dans b44 ou b45 selon le sens.
   [/color][color=Blue]hi2cout [/color][color=Purple]adr_pcf[/color][color=Black], [/color][color=Blue]([/color][color=Purple]b44[/color][color=Black],[/color][color=Purple]b45[/color][color=Blue]) [/color][color=Green]' commande la bobine N a droite ou ? gauche
   [/color][color=Blue]pause pause_aig
   hi2cout [/color][color=Purple]adr_pcf[/color][color=Black], [/color][color=Blue]([/color][color=Navy]$FF[/color][color=Black],[/color][color=Navy]$FF[/color][color=Blue]) [/color][color=Green]'RAZ cde bobine[/color]
[color=Navy]#ENDMACRO[/color]

[color=Gray]}[/color]
[color=Blue]hi2csetup i2cmaster[/color][color=Black], [/color][color=Navy]%01000000[/color][color=Black], [/color][color=Blue]i2cfast[/color][color=Black], [/color][color=Blue]i2cbyte 
do
   for [/color][color=Purple]b13[/color][color=DarkCyan]= [/color][color=Navy]1 [/color][color=Blue]to [/color][color=Navy]8
   [/color][color=Black]act_aiguille[/color][color=Blue]([/color][color=Purple]b13[/color][color=Black],[/color][color=Blue]droite)
   next
   pause [/color][color=Navy]3000
   [/color][color=Blue]for [/color][color=Purple]b13[/color][color=DarkCyan]= [/color][color=Navy]1 [/color][color=Blue]to [/color][color=Navy]8
   [/color][color=Black]act_aiguille[/color][color=Blue]([/color][color=Purple]b13[/color][color=Black],[/color][color=Blue]gauche)
   next
loop[/color]
 
Last edited:

PieM

Senior Member
nous retrouvons le même bug
Vous n'avez chargé que le petit programme que je viens de donner ?
Si oui, il faut voir un exorciste, car je suis certain qu'on envoie bien les bonnes valeurs dans b44 et b45 !

amusez vous à faire une simulation et regardez les valeurs dans la fenetre des variables ...
vérifiez au multimètre les sorties du pcf .
 

PieM

Senior Member
OUI! ce film m'a fait flipper je veux pas de ça chez moi!
n'y aurait-il pas le moyen de decomposer cette macro...
ça ne sert à rien de la décomposer: elle écrit les bonnes valeurs dans b44 et b45, qui sont envoyées au pcf.

donc si le pcf ne mets pas les bonnes valeurs sur ses sorties, c'est qu'il y a un pb à ce niveau

remplacez la boucle do loop par celle ci:

Code:
[color=Blue]hi2csetup i2cmaster[/color][color=Black], [/color][color=Navy]%01000000[/color][color=Black], [/color][color=Blue]i2cfast[/color][color=Black], [/color][color=Blue]i2cbyte 
do
hi2cout [/color][color=Navy]%01000000[/color][color=Black], [/color][color=Blue]([/color][color=Navy]$FF[/color][color=Black],[/color][color=Navy]$00[/color][color=Blue])
pause [/color][color=Navy]1000[/color]
[color=Blue]hi2cout [/color][color=Navy]%01000000[/color][color=Black], [/color][color=Blue]([/color][color=Navy]$00[/color][color=Black],[/color][color=Navy]$FF[/color][color=Blue])
pause [/color][color=Navy]1000[/color]
[color=Blue]loop[/color]
vous devez avoir tous les relais actionnés d'un coté puis de l'autre.

Oh! vous êtes en 16 MHz ! Alors l'initialisation c'est hi2csetup i2cmaster, %01000000, i2cfast_16, i2cbyte !

Et tant qu'à faire, restez en mode slow; le mode fast ne vous fait gagner que 15% sur le temps d'exécution de la commande.
donc
hi2csetup i2cmaster, %01000000, i2cslow_16, i2cbyte !
 
Last edited:

zeltron

Senior Member
ok vais faire ça
pendant ce temps j'ai fait les incantations suivantes
séparé les alims 5v j'avais remarqué que la carte sainsmart disposée de sa regulation 5v
je m'en servais pour la carte picaxe
j'ai viré ça c'est idem
j'ai remplacé la carte sainsmart c'est idem
j'ai remplacé la pcf c'est idem
 

zeltron

Senior Member
j'ai testé cette nouvelle boucle et le modifs ascociées le bug est toujours présent y'a qu'un port qui clignote tous les relais en même temps
l'autre est toujours bugé de la même façon que la vidéo
 

zeltron

Senior Member
j'ai testé les sorties pcf au voltmetre c'est exactement les images des relais sauf evidemment
avec tension inversé pour les relais...
 

zeltron

Senior Member
eh comment dire dans le bout du val d'oise, pres de mantes la jolie (78)
il faut décomposer les instructions
je sais que vous avez les bonnes valeurs mais visiblement la théorie est différente de la pratique...
 
Top