jalonnage MAX 3219

JRTEC

Senior Member
bonjour

je suis en train de realiser un montage pour un jalonnage d un collegue , un peu dans le meme principe que celui ci : https://picaxeforum.co.uk/threads/initiation-picaxe-pour-systeme-de-jalonnage.20817/ mais avec un simple affichage MAx3219 et sans autre fonction que le comptage du passage

mais en mauvais coupieur , lors que je suis " semoir en haut " , le systeme me fait defilerles chiffre de passage alors que je voudrais qui s arrete et attende un changement d etat

et le systeme ne soccupe pas de ma tempo de pilotage des relais sur ma maquette

un petit coup de pouce svp pour m aider a comprendre

Rich (BB code):
;Afficheur driver MAX7219 jalonnage balou 15 M
;Matrice de leds 8x8
;JR 24/09/2018
;Format des registres MAX 7219 sur 16 bits:
;|------------------------------w13------------------------------|                                                               |
;|-----------b27-----------------|------------b26 ---------------|
;|-X-|-X-|-X-|-X-|--ADRESSE------|----------DONNEES--------------| 
;|D15|D14|D13|D12|D11|D10|D09|D08|D07|D06|D05|D04|D03|D02|D01|D00|

  
#picaxe 14M2
    setfreq m32  
    symbol    ledbloq   = B.0  ;Sortie led ARRET COMPTAGE
    symbol    DIN       = B.1   ;Entrée Data In de l'afficheur
    symbol    LOAD      = B.2   ;Entrée Load de l'afficheur
    symbol    CLK       = B.3   ;Entrée CLK de l'afficheur
    symbol    manu      =pinB.4   ;Entrée +1
    symbol    arretcompt=pinB.5   ;Entrée bloquage de comptage
    symbol    pasjalon  = C.0   ;mise en place de pas de jalonnage
    symbol    jalonn    = C.1   ;mise en place jalonnage
    symbol    ledjalo   = C.2   ;sortiie led jalonnage
    symbol    Semoir    =pinC.3   ;Entrée  cpateur relevage
    symbol    Ledverte  = C.4   ;sortiie led semis
    symbol    LEN    = 4    ;durée impulsion
      symbol    col    = b2   ;n° de colonne du chiffre, dans le registre b27=col+1; w13= (b27;b26)
    symbol    cpt   = b3   ;compteur
  
    '***** Nomination des variables *********************
symbol sauve=bit0            'Mémorisation sauvegarde
symbol jal=bit1            'Position jalonnage pour affichage
symbol acompte=bit2        'mémo passage par arretcompte
symbol passe=b4            'nombre total de passages
symbol rang=b5            'numéro de rang 0 à 3 pour goto calculé
symbol passage=b6            'numéro de passage de 1 à 4     
symbol tempoM=w8            'valeur temporisation moteur 
 
 
 
   '***** Lecture paramètres mémorisés en EEPROM  ****************
 
Read 50,passage, passe,TempoM
if passage=3 then
    jal=1
endif

     TempoM=32000    'tempomoteur à 4 secondes par défaut





    low DIN
    low LOAD
    low CLK
;******** initialisation 7219 *******
    b27=$09  'mode décodage
    b26=%00000000  'pas de décodage code B mais segments
    gosub shiftt

    b27=$0b  'limite scanner = Nbre de digits
    b26=$07    '$04=5 digits ,$03=4 digits,, etc...
    gosub shiftt

    b27=$0c  'shutdown mode
    b26=$01  '=normal (afficheur actif)
    gosub shiftt    

    b27=$0a  'luminosité
    b26=$04  '=croissante de 0 à 15, ici c'est 4
    gosub shiftt
    
    b27=$0f  'display test
    b26=$00  '=normal
    gosub shiftt
   
  
  
   
   
    '***** DEBUT PROGRAMME PERSO ************************


  
    pause 20000        'pause de 2.5 s à la mise sous tension
  
DO  
      


    gosub arretcompte    'Arret des comptages surface et semoir
  
    gosub mouvSemoir    'surveillance position semoir (pas d'odomètre si HAUT)
  

  
   
LOOP   
   
   
   
'***** Mouvement semoir et incrémentation à l'abaissement **********
    'Lorsque le semoir est levé, on peut
    '                - incrémenter les passages (si pas sur arretcompte)
    '                - Mettre sur arretcompte
MouvSemoir:    '
    if Semoir=1 then        'semoir levé  
        pause 20000        'antirebonds
        low Ledverte    'extinction voyant semoir bas VERT
        gosub increm    'incrémentation passage
              
        Do    'Boucle attente tant que semoir haut          
            gosub plusun    'possibilité d'incrémenter semoir levé          
            gosub arretcompte    'posibilité arret comptages                                      
        Loop while semoir=1
      
    endif    'le semoir est abaissé      
  
    high Ledverte            'allumage voyant semoir bas           
  
    return  
          
'***** Pousoir enclenchement. Arret comptages auto des passages et surface) ******
'            Mais on peut:
'                    - incrémenter manuellement
'                    - RAZ de la distance parcourue donc de la surface  
'                    - Régler la temporisation du moteur
arretcompte:
    If arretcompt=1 then      
        pause 10        'antirebonds      
        gosub plusun    '+1 reste accessible
      
        high ledbloq    'allumage voyant Arret ROUGE  
        if sauve=0 then        'l'affichage a changé
          
            if semoir=0 then: high ledverte:endif 'on rallume ledverte (éteinte par pinsB ds écriture LCD)
        endif
        'acompte=1        'mémo passage dans arretcompte      
        goto arretcompte     'temps que arretcompte =1
              
    endif
  
    low ledbloq        'extinction voyant
  
    return  
      
'***** Action sur Incréméntation manuelle ************************  
plusun:  
    if manu=1 then        'incrément manuelle
        pause 1000
        Do: Loop while manu=1 'attente relachement
        gosub increm                  
    endif
  
  
  
'      
  
  
    '***** Incrémentation et positionnement jalonnage ***********
'***** chaque passage est confirmé en jalonnage ou non jalonnage ******

increm:  
    on rang goto pas1, pas2, pas3, pas4, pas5
  
pas1:    'ArretJalonnage
    high pasjalon:pause tempoM:low pasjalon
    low ledjalo
    for col=0 to 7
    lookup col ,(0,0,0,0,%00111110,0,0,0),b26                  
    gosub shiftt1
    next
    goto sortie

pas2:'ArretJalonnage
    high pasjalon:pause tempoM:low pasjalon
    low ledjalo
    for col=0 to 7
    lookup col ,(0,0,0,%00111010,%00101010,%00101110,0,0),b26
    gosub shiftt1
    next
    goto sortie  
  
pas3:    'jalonnage  
    high jalonn:pause tempoM:low jalonn
    high ledjalo
    for col=0 to 7
    lookup col ,(0,%11111111,0,%00100010,%00101010,%00111110,0,%11111111),b26
    gosub shiftt1
    next
    goto sortie
  
pas4: 'ArretJalonnage
    high pasjalon :pause tempoM:low pasjalon
    low ledjalo
    for col=0 to 7                  
    lookup col ,(0,0,0,%00001110,%00001000,%00111110,0,0),b26  
    gosub shiftt1
    next
    goto sortie
  
pas5: 'ArretJalonnage
    high pasjalon:pause tempoM:low pasjalon
    low ledjalo
    for col=0 to 7
    lookup col ,(0,0,0,%00101110,%00101010,%00111010,0,0),b26
    gosub shiftt1
    next
    goto sortie  
  
  
  
  
  

sortie:
    inc passe        'incrémentation du nombre de passes
    rang=passe//5    'calcul du rang dans le cycle 0 à 4
    passage=rang+1    'numéro de passage de 1 à 5
    return
  
  
  
  
  


;******** Sous programme affichage *************************
  ;Format du registre sur 16 bits:

;|------------------------------w13------------------------------|                                                               |
;|-----------b27-----------------|------------b26 ---------------|
;|-X-|-X-|-X-|-X-|--ADRESSE------|----------DONNEES--------------| 
;|D15|D14|D13|D12|D11|D10|D09|D08|D07|D06|D05|D04|D03|D02|D01|D00|
;Ex: chiffre 5 dans digit 2
;|-X-|-X-|-X-|-X-| 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 |

;La broche DIN va prendre successivementla valeur de chaque bit de w13, scanné de gauche à droire
shiftt1:
    b27=col+1                    ;le n° de col commence à 1 et pour lookup, c'est 0
shiftt:  
    for cpt=1 to 16            ;test des 16 bits de w13
        w12=w13 & $8000        ;w13 = b27,b26 & %1000 0000 0000 0000: on ne garde que le 1er bit à gauche de w12 
        low DIN                ; broche DIN à 0 à priori
        if w12=0 then saut     ;w12 contient la valeur (0 ou 1) à transmettre
        high DIN            ;;on ne passe ici que si w12 <> 0, alors DIN =1 (évidemment)
saut:    pulsout CLK,LEN     ; envoi 1 pulse horloge pour valider DIN
        w13=w13*2             ; on décale w13 vers la gauche pour examiner le bit suivant
    next cpt
      pulsout LOAD,LEN    ;chargement du registre terminé, un pulse sur load valide le registre (commande ou affichage)
      return
 

Attachments

Last edited:

JRTEC

Senior Member
bonjour et merci

dans mon recopiage il y ale terme " while" ( tant dis que : le semoir est e, haut ) , j ai regarde dans les manuel Picaxe je ne retrouve pas cette fonctin

c est peut etre elle qui me pose probleme , ce qui est etrange c est que sur les softs precedent ce probleme ne s est jamais posé

Par contre j ai trouve pour le pilotage des relais erreur de montage sur ma maquette
 
Last edited:

PieM

Senior Member
DO
{code}
LOOP

DO WHILE/UNTIL condition
{code}
LOOP

DO
{code}
LOOP WHILE/UNTIL condition
 

PieM

Senior Member
Bonjour,

Rich (BB code):
MouvSemoir: '
if Semoir=1 then 'semoir levé
pause 20000 'antirebonds
low Ledverte 'extinction voyant semoir bas VERT
gosub increm 'incrémentation passage

Il me semble évident qu'avec ça, tu vas systématiquement sur l'incrémentation passage!
Dans ton programme tu devrais avoir une alternative:
Soit ton semoir est levé, et tu peux faire certaines actions en fonction des entrées, soit ton semoir est baissé, et tu peux faire certaines actions.

Mais je laisse Michel qui connait par coeur ton système... ;)
 

JRTEC

Senior Member
Bonjour,

Rich (BB code):
MouvSemoir: '
if Semoir=1 then 'semoir levé
pause 20000 'antirebonds
low Ledverte 'extinction voyant semoir bas VERT
gosub increm 'incrémentation passage

Il me semble évident qu'avec ça, tu vas systématiquement sur l'incrémentation passage!
Dans ton programme tu devrais avoir une alternative:
Soit ton semoir est levé, et tu peux faire certaines actions en fonction des entrées, soit ton semoir est baissé, et tu peux faire certaines actions.

Mais je laisse Michel qui connait par coeur ton système... ;)
d accord cependant si semoir= 0 on passe bien a la suite non ?

Rich (BB code):
MouvSemoir:    '
    if Semoir=1 then        'semoir levé  
        pause 20000        'antirebonds
        low Ledverte    'extinction voyant semoir bas VERT
        gosub increm    'incrémentation passage
              
        Do    'Boucle attente tant que semoir haut          
            gosub plusun    'possibilité d'incrémenter semoir levé          
            gosub arretcompte    'posibilité arret comptages                                      
        Loop while semoir=1
      
    endif    'le semoir est abaissé
 

PieM

Senior Member
d accord cependant si semoir= 0 on passe bien a la suite non ?
Oui mais la suite c'est un return a ton programme, donc à Mouvsemoir
Et il est bizarre d'avoir un programme qui boucle tout pendant que semoir est en haut.
Rien d'autre ne doit se passer durant ce temps en dehors de plusun et arrêtcompte?
Il y a un aussi un if semoir=0 .... goto :mad: arretcompte qui ne me semble pas logique dans arretcompte:
si on est dans ce sous programme c'est qu'on a quitté MouvSemoir:, donc que semoir est à 0.

L'ideal serait que tu refasse un petit organigramme de ce que tu souhaites, avec une alternative:
ce qui est possible de faire semoir levé
ce qui est possible de faire semoir baissé
 

JRTEC

Senior Member
merci pour votre reponse ,

ce que je desire

Quand le semoir est en haut : si cela vuiens d arriver ' d etre en haut ) on ajoute un passage ( dou l e renvoir vers incementation ) , puis controle voir si il y a bloquage du comptage ( bouton pressé ) et si on desire change le passage ( plusun ) , surveillance en bloucle de ces 2 fonctions, mais il doit attendre que le semoir soit a nouveau baisse puis releve pour incrementer autolatiquement le passage , et d un seul pas

Quand au semoir=0 dans arretcompte , il est juste la pour informe l utilisateur pas la led verte que le semoir est en bas et n a pas d autre but
 

MGU

Senior Member
Bonjour,
>Mais je laisse Michel qui connait par coeur ton système... ;)
09/2012...4 ans déjà...largement le temps d'oublier

Bref, j'ai jeté un œil. J'ai un peu nettoyé. Le gros problème est qu'il manquait le return à la fin du sous programme "plusin", et donc on passe directement à "increm".

PE6 écrit inc en noir et rem en vert, j'ai remplacé increm par incremen

Voici le fichier à essayer:
Code:
;Afficheur driver MAX7219 jalonnage balou 15 M
;Matrice de leds 8x8
;JR 24/09/2018
;Format des registres MAX 7219 sur 16 bits:
;|------------------------------w13------------------------------| |
;|-----------b27-----------------|------------b26 ---------------|
;|-X-|-X-|-X-|-X-|--ADRESSE------|----------DONNEES--------------|
;|D15|D14|D13|D12|D11|D10|D09|D08|D07|D06|D05|D04|D03|D02|D01|D00|

#picaxe 14M2
setfreq m32
symbol ledbloq = B.0 ;Sortie led ARRET COMPTAGE
symbol DIN = B.1 ;Entrée Data In de l'afficheur
symbol LOAD = B.2 ;Entrée Load de l'afficheur
symbol CLK = B.3 ;Entrée CLK de l'afficheur
symbol manu =pinB.4 ;Entrée +1
symbol arretcompt=pinB.5 ;Entrée bloquage de comptage
symbol pasjalon = C.0 ;mise en place de pas de jalonnage
symbol jalonn = C.1 ;mise en place jalonnage
symbol ledjalo = C.2 ;sortiie led jalonnage
symbol Semoir =pinC.3 ;Entrée cpateur relevage
symbol Ledverte = C.4 ;sortiie led semis
symbol LEN = 4 ;durée impulsion
symbol col = b2 ;n° de colonne du chiffre, dans le registre b27=col+1; w13= (b27;b26)
symbol cpt = b3 ;compteur

'***** Nomination des variables *********************
symbol sauve=bit0 'Mémorisation sauvegarde
symbol jal=bit1 'Position jalonnage pour affichage
symbol acompte=bit2 'mémo passage par arretcompte
symbol passe=b4 'nombre total de passages
symbol rang=b5 'numéro de rang 0 à 3 pour goto calculé
symbol passage=b6 'numéro de passage de 1 à 4
symbol tempoM=w8 'valeur temporisation moteur

'***** Lecture paramètres mémorisés en EEPROM ****************
    Read 50,passage, passe,TempoM
    if passage=3 then
    jal=1
    endif
    TempoM=32000 'tempomoteur à 4 secondes par défaut
   
    low DIN
    low LOAD
    low CLK
    ;******** initialisation 7219 *******
    b27=$09 'mode décodage
    b26=%00000000 'pas de décodage code B mais segments
    gosub shiftt

    b27=$0b 'limite scanner = Nbre de digits
    b26=$07 '$04=5 digits ,$03=4 digits,, etc...
    gosub shiftt

    b27=$0c 'shutdown mode
    b26=$01 '=normal (afficheur actif)
    gosub shiftt

    b27=$0a 'luminosité
    b26=$04 '=croissante de 0 à 15, ici c'est 4
    gosub shiftt

    b27=$0f 'display test
    b26=$00 '=normal
    gosub shiftt

    '***** DEBUT PROGRAMME PERSO ************************
    pause 20000 'pause de 2.5 s à la mise sous tension
  
'***** Mouvement semoir et incrémentation à l'abaissement **********
'Lorsque le semoir est levé, on peut
' - incrémenter les passages (si pas sur arretcompte)
' - Mettre sur arretcompte
; *******boucle principale *****************
    Do       
        if Semoir=1 then 'semoir levé
            pause 200 'antirebonds
            low Ledverte 'extinction voyant semoir bas VERT
            gosub incremen         'incrémentation passage   
            Do                         'Boucle attente tant que semoir haut
                gosub plusun         'possibilité d'incrémenter semoir levé
                gosub arretcompte 'posibilité arret comptages
            Loop while semoir=1    ;on sort si semoir=0
        endif                         'le semoir est abaissé 
        high Ledverte 'allumage voyant semoir bas
    loop

'***** Pousoir enclenchement. Arret comptages auto des passages et surface) ******
' Mais on peut:
' - incrémenter manuellement
' - RAZ de la distance parcourue donc de la surface
' - Régler la temporisation du moteur
arretcompte:        ;poussoir à enclenchement
    Do while arretcompt=1    'temps que arretcompte =1
        pause 10 'antirebonds
        gosub plusun '+1 reste accessible
        high ledbloq 'allumage voyant Arret ROUGE 
    loop 
    low ledbloq 'extinction voyant
    return

'***** Action sur Incréméntation manuelle ************************
plusun:
    if manu=1 then 'incrément manuelle
        pause 1000
        Do: Loop while manu=1 'attente relachement
        gosub incremen
    endif
    return
'***** Incrémentation et positionnement jalonnage ***********
'***** chaque passage est confirmé en jalonnage ou non jalonnage ******
incremen:
    on rang goto pas1, pas2, pas3, pas4, pas5

pas1: 'ArretJalonnage
    high pasjalon:pause tempoM:low pasjalon
    low ledjalo
    for col=0 to 7
    lookup col ,(0,0,0,0,%00111110,0,0,0),b26
    gosub shiftt1
    next
    goto sortie

pas2:'ArretJalonnage
    high pasjalon:pause tempoM:low pasjalon
    low ledjalo
    for col=0 to 7
    lookup col ,(0,0,0,%00111010,%00101010,%00101110,0,0),b26
    gosub shiftt1
    next
    goto sortie

pas3: 'jalonnage
    high jalonn:pause tempoM:low jalonn
    high ledjalo
    for col=0 to 7
    lookup col ,(0,%11111111,0,%00100010,%00101010,%00111110,0,%11111111),b26
    gosub shiftt1
    next
    goto sortie

pas4: 'ArretJalonnage
    high pasjalon :pause tempoM:low pasjalon
    low ledjalo
    for col=0 to 7
    lookup col ,(0,0,0,%00001110,%00001000,%00111110,0,0),b26
    gosub shiftt1
    next
    goto sortie

pas5: 'ArretJalonnage
    high pasjalon:pause tempoM:low pasjalon
    low ledjalo
    for col=0 to 7
    lookup col ,(0,0,0,%00101110,%00101010,%00111010,0,0),b26
    gosub shiftt1
    next
    goto sortie

sortie:
    inc passe 'incrémentation du nombre de passes
    rang=passe//5 'calcul du rang dans le cycle 0 à 4
    passage=rang+1 'numéro de passage de 1 à 5
    return
;******** Sous programme affichage *************************
;Format du registre sur 16 bits:
;|------------------------------w13------------------------------| |
;|-----------b27-----------------|------------b26 ---------------|
;|-X-|-X-|-X-|-X-|--ADRESSE------|----------DONNEES--------------|
;|D15|D14|D13|D12|D11|D10|D09|D08|D07|D06|D05|D04|D03|D02|D01|D00|
;Ex: chiffre 5 dans digit 2
;|-X-|-X-|-X-|-X-| 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 |

;La broche DIN va prendre successivementla valeur de chaque bit de w13, scanné de gauche à droire
shiftt1:
    b27=col+1 ;le n° de col commence à 1 et pour lookup, c'est 0
shiftt:
    for cpt=1 to 16 ;test des 16 bits de w13
        w12=w13 & $8000 ;w13 = b27,b26 & %1000 0000 0000 0000: on ne garde que le 1er bit à gauche de w12
        low DIN ; broche DIN à 0 à priori
        if w12=0 then saut ;w12 contient la valeur (0 ou 1) à transmettre
        high DIN ;;on ne passe ici que si w12 <> 0, alors DIN =1 (évidemment)
    saut: pulsout CLK,LEN ; envoi 1 pulse horloge pour valider DIN
        w13=w13*2 ; on décale w13 vers la gauche pour examiner le bit suivant
    next cpt
    pulsout LOAD,LEN ;chargement du registre terminé, un pulse sur load valide le registre (commande ou affichage)
    return
MM
 
Last edited:

JRTEC

Senior Member
et ben merci beaucoup

ce retrun je l avais supprimer car lors de la simulation PE stopper dessus

on vois les chefs !!

par contre un truc que j ai jamais reussi a resoudre
il y a toujours eu dans ces programmes de jalonnage un decalage entre le passage et l action : ce que je veux dire : dans le cas present lorsque l affichage affiche 2 est exite le relais de jalonnage et lorsque 3 est affcihe alors que cela devrait jalonner , la c est le relais de non jalonnage qui est exité
 
Last edited:

MGU

Senior Member
Probablement un problème d'initialisation entre "passage", "rang","passe".
pour le on ...goto, rang est numéroté de 0 à 4
pour l'affichage, c'est de 1 à 5

Mais il n'y a plus de sauvegarde, le read ne sert plus à rien, ni jal, ni passage...

MM
 

BESQUEUT

Senior Member
SI ça marche, tant mieux.
Mais si vous souhaiter "fiabiliser" votre programme, le rendre plus lisible, moins facétieux à la moindre modification,...
quelques règles simples s'imposent :
- supprimer tous les GOTO (et IF THEN saut)
- utiliser des sous-programmes pour les blocs de code identiques,
- utiliser des macros pour les blocs de codes semblables,
- définir des symboles explicites pour toutes les variables,
- suppression des commentaires inutiles car le code est devenu évident.

Je reste à votre disposition pour étudier cette démarche si vous la trouvez utile.
Cordialement
 
Last edited:

BESQUEUT

Senior Member
Petit exemple, à moins que vous ne soyez partisan du "pourquoi faire simple quand on peut faire compliqué ?"
Code:
        low DIN ; broche DIN à 0 à priori
        if w12=0 then saut ;w12 contient la valeur (0 ou 1) à transmettre
        high DIN ;;on ne passe ici que si w12 <> 0, alors DIN =1 (évidemment)
    saut: pulsout CLK,LEN ; envoi 1 pulse horloge pour valider DIN
Code:
if w12=0 then
     low DIN
else
     high DIN
endif
 
Last edited:

MGU

Senior Member
Bonjour,

Oui, c'est bizarre. C'est le code proposé par picaxe pour remplacer le shifft et j'ai essayé un if/else/endif, mais c'est moins rapide, je suis revenu à l'étiquette
Je suis preneur de toute amélioration. Lorsque les premières lignes de ce code ont été écrites, les macros n'existaient pas sur picaxes.
Il serait écrit différemment aujourd'hui.

MM
 

BESQUEUT

Senior Member
Bonjour,

Oui, c'est bizarre. C'est le code proposé par picaxe pour remplacer le shifft et j'ai essayé un if/else/endif, mais c'est moins rapide, je suis revenu à l'étiquette
Je suis preneur de toute amélioration. Lorsque les premières lignes de ce code ont été écrites, les macros n'existaient pas sur picaxes.
Il serait écrit différemment aujourd'hui.

MM
Ah OK, c'est pour optimiser la vitesse.
Dans ce cas, avez vous tenté bêtement : DIN=w12 ?
En tout cas, ça marche en simulation :
Code:
#simspeed 100
#picaxe 14M2
symbol DIN = pinB.1
low b.1


do
    w12=0
    DIN=w12
    w12=1
    DIN=W12
loop
Je viens d'approfondir, mais ça n'est pas si simple. En effet, contrairement à ce que vous écrivez w12 ne vaut pas 0 ou 1 mais 0 ou $8000.
Si on écrivait les bits dans l'autre sens, on pourrait même écrire :
DIN=w13
sachant qu'une pin ne vaut que zéro ou 1, et que dans le cas, il prends le bit de poids le plus faible.

Si on tiens à garder les bits dans cet ordre, la formule est un poil plus tordue, mais devrait néanmoins être bien plus rapide que l'usine à gaz précédente :
Code:
do 
    w13=%1111000011110000 
    DIN=w13 & $8000 /$8000
    w13=%0000111100001111
    DIN=w13 & $8000 /$8000
loop
 
Last edited:

BESQUEUT

Senior Member
Pour les GOTO dans incremen, je verrais bien un truc du genre :
Code:
#macro SST(A0,A1,A2,A3,A4,A5,A6,A7)
    for col=0 to 7
    lookup col ,(A0,A1,A2,A3,A4,A5,A6,A7),b26
    gosub shiftt1
    next
#endmacro

incremen:
    on rang gosub pas1, pas2, pas3, pas4, pas5

    inc passe
    rang=passe//5 'calcul du rang dans le cycle 0 à 4
    passage=rang+1 'numéro de passage de 1 à 5
Return
 
 
 
pas1:
    gosub ArretJalonnage
    SST(0,0,0,0,%00111110,0,0,0)
    return

pas2:
    gosub ArretJalonnage
    SST(0,0,0,%00111010,%00101010,%00101110,0,0)
    return

pas3:
    gosub Jalonnage
    SST(0,%11111111,0,%00100010,%00101010,%00111110,0,%11111111)
    return
 
pas4:
    gosub ArretJalonnage
    SST(0,0,0,%00001110,%00001000,%00111110,0,0)
    return
 

pas5:
    gosub ArretJalonnage
    SST(0,0,0,%00101110,%00101010,%00111010,0,0)
    return 


Jalonnage:
    high jalonn:pause tempoM:low jalonn
    high ledjalo
Return
 
ArretJalonnage:
    high pasjalon:pause tempoM:low pasjalon
    low ledjalo
Return
Du coup, j'ai pu supprimer quasiment tous les commentaires, mais à mon sens ce n'est pas moins lisible...
 
Last edited:

BESQUEUT

Senior Member
par contre un truc que j ai jamais reussi a resoudre
il y a toujours eu dans ces programmes de jalonnage un decalage entre le passage et l action : ce que je veux dire : dans le cas present lorsque l affichage affiche 2 est exite le relais de jalonnage et lorsque 3 est affcihe alors que cela devrait jalonner , la c est le relais de non jalonnage qui est exité
C'est pas bêtement une led et/ou un relais en logique négative ?
 

MGU

Senior Member
Ah OK, c'est pour optimiser la vitesse.
Dans ce cas, avez vous tenté bêtement : DIN=w12 ?
En tout cas, ça marche en simulation :
Code:
#simspeed 100
#picaxe 14M2
symbol DIN = pinB.1
low b.1


do
    w12=0
    DIN=w12
    w12=1
    DIN=W12
loop
Je viens d'approfondir, mais ça n'est pas si simple. En effet, contrairement à ce que vous écrivez w12 ne vaut pas 0 ou 1 mais 0 ou $8000.
Si on écrivait les bits dans l'autre sens, on pourrait même écrire :
DIN=w13
sachant qu'une pin ne vaut que zéro ou 1, et que dans le cas, il prends le bit de poids le plus faible.

Si on tiens à garder les bits dans cet ordre, la formule est un poil plus tordue, mais devrait néanmoins être bien plus rapide que l'usine à gaz précédente :
Code:
do
    w13=%1111000011110000
    DIN=w13 & $8000 /$8000
    w13=%0000111100001111
    DIN=w13 & $8000 /$8000
loop
Le but de ces bouts de code proposé par "picaxe" est de remplacer les fonctions SPI (poids faible, poids fort) pour la série M2. Le code proposé dans la doc n'est pas très élégant, mais simple, on test "0" ou "autre chose", c'est sans doute le but. Je n'ai pas cherché à l'époque à faire mieux.
Et les macros pour écrire le texte, c'est mieux ,merci

Si JRTEC est par ici, il pourra tester.

MM
 

BESQUEUT

Senior Member
Le but de ces bouts de code proposé par "picaxe" est de remplacer les fonctions SPI (poids faible, poids fort) pour la série M2. Le code proposé dans la doc n'est pas très élégant, mais simple, on test "0" ou "autre chose", c'est sans doute le but. Je n'ai pas cherché à l'époque à faire mieux.
Et les macros pour écrire le texte, c'est mieux ,merci

Si JRTEC est par ici, il pourra tester.

MM
Boh ...
DIN=w13 & $8000 /$8000
C'est simple aussi, non ????
 

BESQUEUT

Senior Member
Le but de ces bouts de code proposé par "picaxe" est de remplacer les fonctions SPI (poids faible, poids fort) pour la série M2. Le code proposé dans la doc n'est pas très élégant, mais simple, on test "0" ou "autre chose", c'est sans doute le but. Je n'ai pas cherché à l'époque à faire mieux.
Et les macros pour écrire le texte, c'est mieux ,merci

Si JRTEC est par ici, il pourra tester.

MM
Sinon, il y a une solution radicale, probablement encore plus performante, même si ça devrait prendre un peu plus de code (mais tant que ça passe on s'en fout !)
DIN=bit15
pulsout ...
DIN=bit14
pulsout ...
DIN=bit13
pulsout ...
...
OUI : j'ai vu : bit0 et bit1 sont utilisés pour autre chose...
Dans ce cas, il faut utiliser w1 au lieu de w0.
Mais j'aime bien utiliser w0 pour traiter les bits.
Du coup, il me semble plus logique de mettre ailleurs jal et acompte.
A vous de voir...
 

BESQUEUT

Senior Member
Et les macros pour écrire le texte, c'est mieux ,merci
Ah c'est du texte tout ce binaire ? J'ai pas vérifié, mais si ce sont des caractères ASCII, ça serait-y pas plus lisible d'écrire
'A' plutôt que %01000001 ?

Bizarre : pouvez vous me dire ce que contient chaque texte ?
J'ai l'impression que c'est de l'ASCII mais avec les bits à l'envers, ce qui rejoindrait le fait que les bits sont également émis à l'envers...
 

MGU

Senior Member
Ah c'est du texte tout ce binaire ? J'ai pas vérifié, mais si ce sont des caractères ASCII, ça serait-y pas plus lisible d'écrire
'A' plutôt que %01000001 ?

Bizarre : pouvez vous me dire ce que contient chaque texte ?
J'ai l'impression que c'est de l'ASCII mais avec les bits à l'envers, ce qui rejoindrait le fait que les bits sont également émis à l'envers...
J'ai pas vérifié, mais probablement des chiffres de 1 à 5 . C'est sur un afficheur matriciel 8 x 8 piloté par MAX7219. Donc 8 octets. On peut remplacer le binaire par du décimal, pour faire court.

MM
 

BESQUEUT

Senior Member
J'ai pas vérifié, mais probablement des chiffres de 1 à 5 . C'est sur un afficheur matriciel 8 x 8 piloté par MAX7219. Donc 8 octets. On peut remplacer le binaire par du décimal, pour faire court.

MM
Ak OK : je comprends l’intérêt du binaire : en écrivant les 1 en colonne, on voir apparaître les chiffres.
Du coup, difficile de faire plus lisible.
 

BESQUEUT

Senior Member
Oui, quand on y réfléchit, mais pour un primo débutant genre collégien, c'est peut être moins évident.

MM
Ah ben sinon, on peut faire DIN=w13,
en lisant les bits dans l'autre sens. Plus simple, je connais pas...
En tout cas, question vitesse ça doit être mieux,
mais pas autant qu'en utilisant directement les variables bit (post #20)
 
Top