Chrono Agility : nouveau

ddaweb

New Member
Illustration de l'utilisation des masques...
ATTENTION : non testé, c'est juste pour expliquer le principe...
Bien vu, vous venez d'attirer mon attention sur un petit cas particulier qui peut survenir :
en règle générale, tout ce qui ne fait pas partie du parcours doit être retiré et les barrières non connectées sont au repos automatiquement (cela ne posait donc pas de problème pour ma vérification) ...
Le cas particulier : retirer une barrière du parcours en la laissant connectée, cela entre dans votre concept -> 99.9% de chance d'être occultée : l'affichage le signalera du coup.

Je regarde à intégrer ce concept ce soir ou ce WE.
Comme j'ai la vérification des interrupteurs de configuration juste avant la vérification des barrières, cela peut s'initialiser là.
 

BESQUEUT

Senior Member
Bien vu, vous venez d'attirer mon attention sur un petit cas particulier qui peut survenir :
Ou bien on accepte de configurer physiquement la barrière de départ sur la prise départ, la barrière d'arrivée sur la prise d'arrivée, ou une seule barrière sur une des prises, et dans ce cas on n'a pas besoin des interrupteurs.
Je viens d'installer un portail automatique qui fonctionne comme ça : à la mise sous tension ou au reset, il considère que toutes les entrées (barrières photo, contacts de sécurité, fins de course,...) sont dans l'état "Libre". Peu importe que ce soit un niveau haut ou bas, branché ou pas, ... Il prends note, et dans la suite c'est le changement d'état qui est pris en compte. Du coup l'installation est triviale : on branche ce qu'on a et on met sous tension. Point final : zéro configuration...

Ou bien on admet que les barrières peuvent être branchées (ou pas...) dans tous les cas possibles, (indépendamment de ce qui sera réellement utilisé) et que la configuration se fait par soft, et dans ce cas il faut traiter TOUS les cas... Voir posts #184 et #190

Si vous reprenez le code, quelques remarques générales :
A priori symbol mode_chrono=w6 consomme un word pour rien... Inutile de mémoriser le mode de fonctionnement : il faut juste donner la bonne valeur aux variables qui seront utilisées dans les tests par la suite. Dans la phase de configuration, on a tous le temps pour calculer ces variables si nécessaire. Par contre dans les boucles, le test doit être le plus simple possible.
Assez souvent on arrive en panne de variables bien avant de saturer la mémoire programme ; du coup la plupart des Picaxiens adoptent les règles suivantes :
- on utilise les bits tant que c'est possible, les Bytes idem et les Words en dernier recours.
- on n'utilise pas b0,b1 et w0 pour pouvoir utiliser au moins les 16 premiers bits
- si on risque d'avoir besoin de beaucoup de bits, on n'utilise pas non plus b2,b3 et w1
- on alloue les Bytes de b4 vers b55
- on alloue les Words de w27 vers w2

Dans votre cas, on pourrait utiliser d'autres formes de mémoires pour les temps mémorisés, surtout si on a besoin de plus de temps en mémoire et/ou si on est short petrol sur le nombre de variables directes. (ce n'et pas encore le cas...)

On évite d'utiliser une pin comme mémoire. A la place on utilise une variable bit.
Le danger avec la lecture d'une pin, c'est que son niveau peut être forcé électriquement, indépendamment de la valeur qu'on lui a attribué par soft. La recherche du bug est alors très difficile... (mais c'est rare et c'est vrai que ça économise une ligne à chaque mise à jour). Pour le Chronomètre, il faudra qu'il ait exactement les mêmes sorties que le Communiquant, même si la LED n'est pas connectée. Si ça ne tenais que de moi, je mettrais exactement les mêmes LEDs ce qui permet de visualiser que les 2 Picaxes travaillent bien en parallèle.
 
Last edited:

ddaweb

New Member
@BESQUEUT
Merci pour les explications sur les bit, byte et word : j'avais compris la signification des word et byte, mais les bit je ne les avais pas remis dans les mémoires du picaxe ... c'est en fait W0 et W1, donc les 4 premier bytes.
J'utilise maintenant plusieurs bytes au lieu de word, mais au départ, sans les connaissance acquises entre-temps, je suis parti du chrono pour le Belge et j'ai continué la numérotation déjà présente ... j'ai donc commencé les bytes dans l'autre sens, depuis w27.
Je peux donc actuellement utiliser les bit0 à 7 vu que b0 est libre (b1 à b5 pour l'affichage du temps) ... intéressent !
En effet le mode_chrono pourrait être un byte et non un word ... il est utilisé par la suite, il me semble donc utile.
D'autres word pourraient également être un byte ou peut-être même un bit.

Concernant les mémoires de temps, je ne penses vraiment pas utilise d'aller à un nombre supérieur ... 8 c'est déjà pas mal pour le peu de fois que c'est utilisé ... uniquement en cas de problème ou si le juge veux voir les derniers temps des chiens pour attribuer le temps de parcours (je ne trouve pas cela normal, il devrait être en mesure de le déterminer ... mais bon il sont maîtres sur le terrain).
Juste pour votre information, il y a 2 temps : le TPS (Temps de Parcours Standard, c'est le temps à partir duquel des pénalités de dépassement sont données) ET le TPM (Temps de Parcours Maximum, ce temps dépassé, le chien est éliminé ... il est maintenant 1.5 x TPS)

Malheureusement il n'y a pas de connexion pour chaque barrière : j'ai fait un câble d’interfaçage avec l'ancien chrono ... j'en parle dans un des posts.
 

BESQUEUT

Senior Member
@BESQUEUT
Merci pour les explications sur les bit, byte et word : j'avais compris la signification des word et byte, mais les bit je ne les avais pas remis dans les mémoires du picaxe ... c'est en fait W0 et W1, donc les 4 premier bytes.
J'utilise maintenant plusieurs bytes au lieu de word, mais au départ, sans les connaissance acquises entre-temps, je suis parti du chrono pour le Belge et j'ai continué la numérotation déjà présente ... j'ai donc commencé les bytes dans l'autre sens, depuis w27.
Je peux donc actuellement utiliser les bit0 à 7 vu que b0 est libre (b1 à b5 pour l'affichage du temps) ... intéressent !
En effet le mode_chrono pourrait être un byte et non un word ... il est utilisé par la suite, il me semble donc utile.
D'autres word pourraient également être un byte ou peut-être même un bit.

Concernant les mémoires de temps, je ne penses vraiment pas utilise d'aller à un nombre supérieur ... 8 c'est déjà pas mal pour le peu de fois que c'est utilisé ... uniquement en cas de problème ou si le juge veux voir les derniers temps des chiens pour attribuer le temps de parcours (je ne trouve pas cela normal, il devrait être en mesure de le déterminer ... mais bon il sont maîtres sur le terrain).
Juste pour votre information, il y a 2 temps : le TPS (Temps de Parcours Standard, c'est le temps à partir duquel des pénalités de dépassement sont données) ET le TPM (Temps de Parcours Maximum, ce temps dépassé, le chien est éliminé ... il est maintenant 1.5 x TPS)

Malheureusement il n'y a pas de connexion pour chaque barrière : j'ai fait un câble d’interfaçage avec l'ancien chrono ... j'en parle dans un des posts.
Oui, à part les bits qui sont fixés, le reste est juste une habitude. Ça évite de se marcher sur les pieds entre les Bytes et les Words...
Et en plus on peut facilement changer sans conséquences dans le code.
Je persiste à penser que mode_chrono ne sert à rien, mais il faudrait votre programme pour savoir ce que vous en faites...
Sinon, le travail sur les masques de bits ça vous va ?
 

ddaweb

New Member
Je suis occupé de travailler dessus, je parviens à obtenir les barrières occultées (avec filtre sur toutes les barrières utilisée), mais je n'ai pas encore testé tous les cas de figure, uniquement 1 -> 2 ... trop tard pour le faire, c'est après une bonne nuit de sommeil.
Votre code me donne toujours "Vérifier barrière 2".
Pour l'instant, je ne vois pas l'utilité de b_start et b_stop ... seul le b_all me sert.
Code:
        ;================ Choix du sens des barrieres + commande led
        if mode_chrono=99 or led_nbr<>choix_nbr or choix_sens<>led_sens then {    '---------- choix du mode de fonctionnement
            ;led_status=0
            if choix_sens=1 and choix_nbr=1 and mode_chrono<>12 then                '---------- barrieres 1 -> 2
                led_sens=1 : led_nbr=1
                mode_chrono=12 : i_start =%00000101 : i_stop =%00000110 : barriere_stop=2    'Mode chrono, interruptions et barriere stop
                b_start=%00000001 : b_stop=%00000010 : b_all=%00000011                'fonctionnalite des barrieres
                hi2cout 1,(mode_chrono)                                        'ecriture du 'mode_chrono' dans l?esclave (horloge)
            else if choix_sens=0 and choix_nbr=1 and mode_chrono<>21 then            '---------- barrieres 2 -> 1
                led_sens=0 : led_nbr=1
                mode_chrono=21 : i_start =%00000110 : i_stop =%00000101 : barriere_stop=1    'Mode chrono, interruptions et barriere stop
                b_start=%00000010 : b_stop=%00000001 : b_all=%00000011                'fonctionnalite des barrieres
                hi2cout 1,(mode_chrono)                                        'ecriture du 'mode_chrono' dans l?esclave (horloge)
            else if choix_sens=1 and choix_nbr=0 and mode_chrono<>11 then            '---------- barrieres 1 seule
                led_sens=1 : led_nbr=0
                mode_chrono=11 : i_start =%00000101 : i_stop =%00000101 : barriere_stop=1    'Mode chrono, interruptions et barriere stop
                b_start=%00000001 : b_stop=%00000001 : b_all=%00000001                'fonctionnalite des barrieres
                hi2cout 1,(mode_chrono)                                        'ecriture du 'mode_chrono' dans l?esclave (horloge)
            else if choix_sens=0 and choix_nbr=0 and mode_chrono<>22 then            '---------- barrieres 2 seule
                led_sens=0 : led_nbr=0
                mode_chrono=22 : i_start =%00000110 : i_stop =%00000110 : barriere_stop=2    'Mode chrono, interruptions et barriere stop
                b_start=%00000010 : b_stop=%00000010 : b_all=%00000010                'fonctionnalite des barrieres
                hi2cout 1,(mode_chrono)                                        'ecriture du 'mode_chrono' dans l?esclave (horloge)
            end if
        }
        endif
        ;================ Affichage mode de fonctionnement -> affichage 1ere ligne
        hserout LCD,(254,1)                                'raz affichage LCD
        select case mode_chrono {                               '---------- mode du chrono -> affichage 1ere ligne
            case 11: hserout LCD,(254,128,"Mode  :  1 seule")
            case 21: hserout LCD,(254,128,"Mode  :  2 -> 1 ")
            case 22: hserout LCD,(254,128,"Mode  :  2 seule")
            else   : hserout LCD,(254,128,"Mode  :  1 -> 2 ")
            }
        endselect
        ;================ verification barriere en alarme -> affichage 2me ligne
        DO
            let b0 = pinsB and b_all    'cf pg 114 manuel 2 FR -> donne etat reel des barrieres : 3=repos - 2=barriere1 - 1=barriere2 - 0=2 barrires
            if b0=%00000010 then
                    hserout LCD,(254,192,"VERIF BARRIERE 1")
            else if b0=%00000001 then
                  hserout LCD,(254,192,"VERIF BARRIERE 2")
            else if b0=%00000000 then
                hserout LCD,(254,192,"VERIF BARRIERES ")
            endif
        LOOP UNTIL b0=%00000011
Je vous mettrez le code complet, j'ai 2-3 petites chose à modifier pour diminuer la longueur des hserout et supprimer des GOSUB qui semble gourmand en temps.
 

BESQUEUT

Senior Member
Chtites remarques en première approche :
Pour l'instant, je ne vois pas l'utilité de b_start et b_stop ... seul le b_all me sert.
Moi non plus. C'est pour le principe, au cas où...

;led_status=0
if choix_sens=UnversDeux and choix_nbr=Deux and mode_chrono<>12 then '---------- barrieres 1 -> 2
led_sens=Allumee : led_nbr=Allumee
mode_chrono=12 : i_start =%00000101 : i_stop =%00000110 : barriere_stop=2
b_start=%00000001 : b_stop=%00000010 : b_all=%00000011 'fonctionnalite des barrieres
hi2cout 1,(mode_chrono) 'ecriture du 'mode_chrono' dans l?esclave (horloge)
hserout LCD,(254,128,"Mode : 1 -> 2 ")




Ça ne sert à rien d'envoyer le mode au Chronomètre : si ce dernier doit lire un port I2C, le chronométrage sera affecté.
J'ai écris N fois que la seule synchronisation possible est que les entrés des 2 Picaxes soient identiques et qu'ils utilisent des codes semblables.
mode_chrono ne sert à rien
b0 = pinsB NAND b_all
Les barrières sont en logique négative : Niveau haut au repos,..
J'ai montré comment utiliser des symbols pour éviter toute confusion et changer facilement de logique si nécessaire.
 
Last edited:

ddaweb

New Member
Ce n'était pas pour l'ensemble du code, encore moins pour le chrono : je testais uniquement votre code qui est très intéressant.
J'ai donc mit tout le code y afférant ... pour le reste, il faudra encore retravailler le code évidemment.

Si je comprend bien le manuel :
Même méthode, mais en masquant certains bits
Let b1= pins & %11000000If
b1= %11000000 then gosub adresse
Le let b0 = pinsB and b_all n'affichera que l'état instantané des barrières, le reste étant masqué ! ... c'est bien le cas d'ailleurs
En mettant nand, ce sera le reste qui sera affiché et les barrières masquées ?

Hier il était très tard (enfin ce matin tôt pour moi), je n'ai rien approfondi, mais je sais que mon code n'est pas correct pour tous les cas, cela j'en suis bien conscient ... je cherchais à utiliser votre méthode et la comprendre pour afficher ce qu'il faut.

Edit : je viens de jeter un coup d'oeil rapide pour le mode_chrono : en effet, je pourrais m'en passer, c'est historique quand le code était dans une boucle, maintenant il est linéaire et l'affichage du mode pourrait se faire directement, sans le case.
Le b_stop pourrait par contre m'être utile ! : j'avais posé la question à ce sujet, pouvoir vérifier l'état de la barrière stop, maintenant j'ai la réponse.
 
Last edited:

BESQUEUT

Senior Member
En mettant nand, ce sera le reste qui sera affiché et les barrières masquées ?
le NAND est le complément à 1 du AND
C'est uniquement pour tenir compte de la logique négative, mais il manquait un masque pour tenir compte des bits utiles :
b13=Barrieres NAND B_ALL AND B_ALL
Voici la table de vérité :
Rich (BB code):
Voir post #200
choix_nbrchoix_sensB_STARTB_STOPB_ALLbarriere1barriere2pinBANDNANDNAND AND B_ALLDécMessage
Un (=0)Une(=0)%00000001%00000001%00000001Occultee(=0)Occultee(=0)%00000000%00000000%11111111%01
1​
Barrière 1
Deux(=1)DeuxVersUn(=0)%00000001%00000010%00000011Occultee(=0)Occultee(=0)%00000000%00000000%11111111%11
3​
Les deux
Un (=0)Deux(=1)%00000010%00000010%00000010Occultee(=0)Occultee(=0)%00000000%00000000%11111111%10
2​
Barrière 2
Deux(=1)DeuxVersUn(=1)%00000010%00000001%00000011Occultee(=0)Occultee(=0)%00000000%00000000%11111111%11
3​
Les deux
choix_nbrchoix_sensB_STARTB_STOPB_ALLbarriere1barriere2pinBANDNANDNAND AND B_ALLDécMessage
Un (=0)Une(=0)%00000001%00000001%00000001Libre(=1)Occultee(=0)%00000001%00000001%11111110%00
0​
Tout va bien
Deux(=1)DeuxVersUn(=0)%00000001%00000010%00000011Libre(=1)Occultee(=0)%00000001%00000001%11111110%10
2​
Barrière 2
Un (=0)Deux(=1)%00000010%00000010%00000010Libre(=1)Occultee(=0)%00000001%00000010%11111101%10
2​
Barrière 2
Deux(=1)DeuxVersUn(=1)%00000010%00000001%00000011Libre(=1)Occultee(=0)%00000001%00000010%11111111%10
2​
Barrière 2
choix_nbrchoix_sensB_STARTB_STOPB_ALLbarriere1barriere2pinBANDNANDNAND AND B_ALLDécMessage
Un (=0)Une(=0)%00000001%00000001%00000001Occultee(=0)Libre(=1)%00000010%00000000%11111111%01
1​
Barrière 1
Deux(=1)DeuxVersUn(=0)%00000001%00000010%00000011Occultee(=0)Libre(=1)%00000010%00000001%11111111%01
1​
Barrière 1
Un (=0)Deux(=1)%00000010%00000010%00000010Occultee(=0)Libre(=1)%00000010%00000010%11111101%00
0​
Tout va bien
Deux(=1)DeuxVersUn(=1)%00000010%00000001%00000011Occultee(=0)Libre(=1)%00000010%00000010%11111101%01
1​
Barrière 1
choix_nbrchoix_sensB_STARTB_STOPB_ALLbarriere1barriere2pinBANDNANDNAND AND B_ALLDécMessage
Un (=0)Une(=0)%00000001%00000001%00000001Libre(=1)Libre(=1)%00000011%00000001%11111110%00
0​
Tout va bien
Deux(=1)DeuxVersUn(=0)%00000001%00000010%00000011Libre(=1)Libre(=1)%00000011%00000011%11111100%00
0​
Tout va bien
Un (=0)Deux(=1)%00000010%00000010%00000010Libre(=1)Libre(=1)%00000011%00000010%11111101%00
0​
Tout va bien
Deux(=1)DeuxVersUn(=1)%00000010%00000001%00000011Libre(=1)Libre(=1)%00000011%00000011%11111100%00
0​
Tout va bien
 
Last edited:

BESQUEUT

Senior Member
Et un programme pour tester ça dans le simulateur :
Rich (BB code):
#no_data
#simspeed 2

symbol choix_nbr=b0
symbol choix_sens=b1

symbol Barrieres =b3

symbol B_START=b4
symbol B_STOP=b5
symbol B_ALL=b6

symbol Une=0
symbol Deux=1
symbol UneVersDeux=1
symbol DeuxversUne=0

for choix_nbr=0 to 1
      for choix_sens =0 to 1
            sertxd("Choix_nbr choix_sens B_ALL : Barrieres > AND NAND Defaut dec",13,10)
            for Barrieres=0 to %11
                  
                  if choix_nbr=Une then
                        if choix_sens=Une then
                              B_START=%00000001
                              B_STOP =%00000001
                        else
                              B_START=%00000010
                              B_STOP =%00000010
                        endif

                  else
                        if choix_sens=UneVersDeux then
                              B_START=%00000001
                              B_STOP =%00000010
                        else
                              B_START=%00000010
                              B_STOP =%00000001
                        endif
                  endif
                  B_ALL=B_START OR B_STOP

                  b11=Barrieres AND B_ALL
                  b12=Barrieres NAND B_ALL
                  b13=Barrieres NAND B_ALL AND B_ALL
                  sertxd(Choix_nbr," ",choix_sens," ",B_ALL," : ", Barrieres," > ",b11,b12,b13,"=",#b13,13,10)
      next barrieres
      sertxd(13,10)
      next Choix_sens
next choix_nbr
Qui donne :
Choix_nbr choix_sens B_ALL : Barrieres > AND NAND Defaut dec
[00] [00] [01] : [00] > [00][FF][01]=1
[00] [00] [01] : [01] > [01][FE][00]=0
[00] [00] [01] : [02] > [00][FF][01]=1
[00] [00] [01] : [03] > [01][FE][00]=0

Choix_nbr choix_sens B_ALL : Barrieres > AND NAND Defaut dec
[00] [01] [02] : [00] > [00][FF][02]=2
[00] [01] [02] : [01] > [00][FF][02]=2
[00] [01] [02] : [02] > [02][FD][00]=0
[00] [01] [02] : [03] > [02][FD][00]=0

Choix_nbr choix_sens B_ALL : Barrieres > AND NAND Defaut dec
[01] [00] [03] : [00] > [00][FF][03]=3
[01] [00] [03] : [01] > [01][FE][02]=2
[01] [00] [03] : [02] > [02][FD][01]=1
[01] [00] [03] : [03] > [03][FC][00]=0

Choix_nbr choix_sens B_ALL : Barrieres > AND NAND Defaut dec
[01] [01] [03] : [00] > [00][FF][03]=3
[01] [01] [03] : [01] > [01][FE][02]=2
[01] [01] [03] : [02] > [02][FD][01]=1
[01] [01] [03] : [03] > [03][FC][00]=0

A noter que le code "Tout va bien" a volontairement été choisi pour que ça fasse zéro...
et les autres numéros 1 et 2 correspondent aux numéros des barrières en défaut...
 
Last edited:

ddaweb

New Member
Avez-vous testé sur le picaxe ce que vous dites ?
Je viens de le faire avec le nand et j'obtiens 255 si les barrières sont occultées et autrement "255 - la valeur binaire" des barrières au repos ... je l'avais déjà remarqué hier, sans vraiment chercher vu l'heure tardive
Avec le and , c'est : 3=repos - 2=barriere1 - 1=barriere2 - 0=2 barrires (donc la valeur binaire de l'état physique des barrières) ... le code devient alors (fonctionne très bien suivant le mode programmé) :
Code:
        do
            let b0 = pinsB and b_all    'donne l'etat instantanné des barrieres en fonction du mode de fonctionnement

            if b_all=%00000011 then
                if b0=%00000010 then
                        hserout LCD,(254,192,"VERIF BARRIERE 1")
                else if b0=%00000001 then
                      hserout LCD,(254,192,"VERIF BARRIERE 2")
                else if b0=%00000000 then
                    hserout LCD,(254,192,"VERIF BARRIERES ")
                endif
            else if  b0=%00000000 then
                hserout LCD,(254,192,"VERIF BARRIERE  ")
            endif
        loop until b0=b_all
J'ai mit else if au lieu de else vu qu'il rentre au moins une fois dans la boucle , il y a un bref affichage du else
J'aurais également pu travailler avec le nombre, mais le binaire est pour moi plus explicite.

Edit : je viens de modifier le dernier
else if afin de ne pas avoir un bref affichage que je n'avais pas vu durant mes premiers tests
 
Last edited:

BESQUEUT

Senior Member
Avez-vous testé sur le picaxe ce que vous dites ?
Je viens de le faire avec le nand et j'obtiens 255 si les barrières sont occultées et autrement "255 - la valeur binaire" des barrières au repos ... je l'avais déjà remarqué hier, sans vraiment chercher vu l'heure tardive
Relire #208 : il manquait un filtre pour ne garder que les 2 bits correspondant aux barrières :
Barrieres NAND B_ALL AND B_ALL
J'ai posté en #200 le code qui va bien, mais vous avez raison, il manquait un test pour éviter cet affichage intempestif :
Code:
DO
    defaut=B_ALL NAND Barrieres AND B_ALL
    if defaut=%11 then
        "Vérifier les Barrieres"
    else if defaut>0
        "Vérifier Barriere " , #Defaut
    endif

LOOP UNTIL Defaut=0
En relisant le manuel, je crois avoir trouvé la commande qui va bien :
Defaut=B_ALL ANDNOT Barrieres
Pas testé, mais ça à l'air de le faire...
 
Last edited:

ddaweb

New Member
Relire #208 : il manquait un filtre pour ne garder que les 2 bits correspondant aux barrières :
Barrieres NAND B_ALL AND B_ALL
J'ai posté en #200 le code qui va bien, mais vous avez raison, il manquait un test pour éviter cet affichage intempestif :
Code:
DO
    defaut=B_ALL NAND Barrieres AND B_ALL
    if defaut=%11 then
        "Vérifier les Barrieres"
    else if defaut>0
        "Vérifier Barriere " , #Defaut
    endif

LOOP UNTIL Defaut=0
En relisant le manuel, je crois avoir trouvé la commande qui va bien :
Defaut=B_ALL ANDNOT Barrieres
Pas testé, mais ça à l'air de le faire...
Les 2 solutions fonctionnent ;)

le code final utilisé :
Code:
        do
            let defaut_barriere=B_ALL andnot barrieres
            if defaut_barriere=%11 then
                hserout LCD,(254,192,"VERIF BARRIERES ")
            else if defaut_barriere>0 then
                hserout LCD,(254,192,"VERIF BARRIERE ", #defaut_barriere)
            endif

        loop until defaut_barriere=0
J'ai loupé le #208 ... je crois que j'écrivais à ce moment là :confused:
Le texte est limité à 16 caractères/ligne sur le LCD.

Bon, maintenant je m'occupe de supprimer les lignes inutiles, utiliser les symbol, diminuer les transmissions hserout (pour le temps, j'initialise directement les '..' des dixièmes et centième ... plus que les secondes à afficher) + ne plus faire de gosub ... et d'autres idées à tester.
 
Last edited:

ddaweb

New Member
Re bonsoir,
J'ai enfin mit le quartz de 16Mhz sur le communiquant, mais je n'ai plus aucun affichage correct au LCD, et le série ne fonctionne plus correctement non plus (problème de vitesse probablement vu les caractères affichés).
Par contre, le communiquant fonctionnait trop rapidement .... j'ai ajusté settimer et c'est déjà nettement mieux.

J'ai essayé plusieurs paramètres :
- setfreq em16 et setfreq em64
- hsersetup B2400_16, %10 et hsersetup B2400_64, %10
Pour le settimer 61536 : ne n'ai pas 100% compris le calcul, c'est ce que je crois être une valeur correcte, mais sans affichage ou série, pas facile de vérifier. Après recalcul : 63036

Les paramètres d'origine sans quartz :
- setfreq M16
- hsersetup B2400_16, %10
- settimer 64917

Quelqu'un a une idée des paramètres ?, je n'ai encore rien trouvé durant mes recherches.

NB : c'est un afficheur AXE 133Y - série
 
Last edited:

BESQUEUT

Senior Member
Re bonsoir,
J'ai enfin mit le quartz de 16Mhz sur le communiquant, mais je n'ai plus aucun affichage correct au LCD, et le série ne fonctionne plus correctement non plus (problème de vitesse probablement vu les caractères affichés).
Par contre, le communiquant fonctionnait trop rapidement .... j'ai ajusté settimer et c'est déjà nettement mieux.

J'ai essayé plusieurs paramètres :
- setfreq em16 et setfreq em64
- hsersetup B2400_16, %10 et hsersetup B2400_64, %10
Pour le settimer 61536 : ne n'ai pas 100% compris le calcul, c'est ce que je crois être une valeur correcte, mais sans affichage ou série, pas facile de vérifier.

Les paramètres d'origine sans quartz :
- setfreq M16
- hsersetup B2400_16, %10
- settimer 64917

Quelqu'un a une idée des paramètres ?, je n'ai encore rien trouvé durant mes recherches.

NB : c'est un afficheur AXE 133Y - série
Est ce que ça marche toujours avec les paramètres d'origine ?
Le setfreq correct est em64
Mais il me semble que si le quartz n'oscille pas correctement, le PIC revient automatiquement a sa fréquence de base. A tester
 

ddaweb

New Member
Oui j'ai bien mit em64.
Durant un affichage lisible, pour une pause de 30000 sur l'horloge à pulses, j'obtiens 29.96 - 29,94 sec.
Il fonctionnait car tout allait plus vite, les pauses encore toujours (4x plus vite), je l'ai surtout vu avec le clignotement de la led status qui devait avoir une fréquence de +/- 1 sec.
Avec les paramètres d'origine, le quartz n'était pas actif m16 (holorge interne), emxx (horloge externe).
 

ddaweb

New Member
En fait les caractères d'affichage LCD sont correct, mais les emplacements sont complètement erronés ... ce ne sont pas des signes cabalistiques, comme pour le série :

23041 devrait être 029,9x s
 

ddaweb

New Member
Bah ... après avoir coupé le 5v tout est rentré dans l'ordre pour le LCD, mais pas pour le série (je vais encore essayer plusieurs vitesses) :
Code:
setfreq em64
hsersetup B2400_64, %10
settimer 63036            'encore à ajuster finement
 

BESQUEUT

Senior Member
Bah ... après avoir coupé le 5v tout est rentré dans l'ordre pour le LCD, mais pas pour le série (je vais encore essayer plusieurs vitesses) :
Code:
setfreq em64
hsersetup B2400_64, %10
settimer 63036            'encore à ajuster finement
Je ne comprends pas tout. Le LCD est sur le port série.
Du coup, c'est quoi le série ? Et quelle commande est utilisée ?
 

ddaweb

New Member
Oui, cela porte à confusion, afin de ne pas rester à regarder mon écran, j'utilise un autre port série pour afficher le temps final dans putty durant la phase de reset du chrono (donc hors fonctionnement pour ne pas provoquer des retards) : en utilisant ceci, cela fonctionne -> serout A.4, N19200_64,(b1,b2,b3,",",b4,b5," s",13,10)

J'ai encore un petit problème, par moment, j'ai un temps erroné, mais toujours le même : cela me fait dire que c'est dans mon code le problème ... je regarde à cela et reviens à vous si je ne trouve pas.

Voici les résultats avec un settimer 63041, toujours avec la pause de 30000 sur les pulses ... je ferai des tests plus complet sur plusieurs valeurs de pauses une fois mon soucis trouvé.
C'est tout de même nettement plus stable avec le quartz !!!
 

Attachments

BESQUEUT

Senior Member
Oui, cela porte à confusion, afin de ne pas rester à regarder mon écran, j'utilise un autre port série pour afficher le temps final dans putty durant la phase de reset du chrono (donc hors fonctionnement pour ne pas provoquer des retards) : en utilisant ceci, cela fonctionne -> serout A.4, N19200_64,(b1,b2,b3,",",b4,b5," s",13,10)

J'ai encore un petit problème, par moment, j'ai un temps erroné, mais toujours le même : cela me fait dire que c'est dans mon code le problème ... je regarde à cela et reviens à vous si je ne trouve pas.

Voici les résultats avec un settimer 63041, toujours avec la pause de 30000 sur les pulses ... je ferai des tests plus complet sur plusieurs valeurs de pauses une fois mon soucis trouvé.
C'est tout de même nettement plus stable avec le quartz !!!
OK vous utilisez le port série hardware et un software en plus.
Si vous envoyez la même chose au LCD et sur le port série soft, vous devriez recevoir la même chose...
Mais sans voir le code, impossible de donner un avis...
29,59 est loufoque, mais pas 29,99
 

ddaweb

New Member
Le temps de 29.59 sec., avant de mettre le quartz, c'était +/- 1.1 sec. en moins, aussi une valeur fixe, avec des pauses différentes c'était la même erreur : par moment il doit y avoir un passage non prévu dans une partie de code, je dois juste déterminer où ... la valeur étant toujours +/- identique.
Je mettrai le code complet, ne vous inquiétez pas ... je vais d'abord chercher un peu, mais avec les travaux dans la maison, j'ai un peu moins de temps.
Je vais également mettre un quartz sur le picaxe chrono et voir les 2 temps.

Pour le TX, c'est le même temps que pour le LCD.
 

ddaweb

New Member
Voilà, par acquit de conscience, j'ai également placé un quartz sur le chrono, avec le même settimer que le communiquant.

La surprise est assez grande par des temps hyper similaires pour différentes durées :
- Impulsions : générateur d'impulsions via des pauses (10000 x temps)
- Horloge : ce que vous appelez le chrono
- Chrono : ce que vous appelez le communiquant
C'est pour diminuer la largeur des colonnes que j'ai utilisé ces termes.

23045

Il me reste le problème de la différence de +/- 0.41 sec. qui apparaissent régulièrement ... cette valeur est vraiment trop régulière pour être une dérive.
Qu'en pensez-vous ?
Je regarde encore un peu de mon côté et vous mettrai le code final d'ici peu (trouvé ou pas).

La stabilité des temps est bien présente maintenant, mais quant le problème aura été trouvé, je ferai des tests beaucoup plus complets, avec plus de durées.
J'en viens tout même à me dire que le picaxe horloge ne sera plus vraiment utile ... votre avis là-dessus ?

Voici les codes utilisés pour les impulsions et le chrono :
Code:
Picaxe impulsions :

#no_data
#picaxe 14M2

do
    low b.3    ' START
    pause 50
    high b.3
    pause 3
    pause 59950

    low b.3    ' STOP
    pause 50
    high b.3
    pause 19950
loop

Picaxe chrono :

#no_data
#no_table
' port com : 19200 bauds= 4x 4800
' Interruption soft

#picaxe 28X2            'Type de Picaxe

symbol T1=w25
symbol T2=w26
symbol Temps=w27

setfreq em64
settimer 63041        '64917 sans quartz    ' 0,001 s

setint %00000000,%00000001,B
temps=0

do
    do                    ' attente du START
    loop until temps>0

    T1=temps
    ;sertxd("T1=",#T1,13,10)
    serout A.4, N19200_64,(". ")
    pause 8000                ' 1s ? 16 Mhz
    temps=0

    setint %00000000,%00000001,B

    do                    ' attente du STOP
    loop until temps>0

    T2=temps
    temps=t2-t1+65535+1
    ;sertxd("T1=",#T1," - T2=",#T2," -> chrono=",#temps,13,10)
    serout A.4, N19200_64,("T1=",#T1," - T2=",#T2," -> chrono=",#temps,13,10)
    pause 8000                ' 1s ? 16 Mhz
    temps=0
  
    setint %00000000,%00000001,B
loop

interrupt:
    Temps=Timer
return
 
Last edited:

ddaweb

New Member
J'ai trouvé le problème des 0.41 sec : un variable non remise à 0 et le temps final sur timer au lieu de val_temps (= valeur interruption).

Je mets, comme promis, le code utilisé et les premiers tests, la suite dans les prochains jours :

23047

Durant les boucles START et STOP, l'utilisation de let defaut_barriere=b_stop andnot barrieres donne des différences un peu plus grandes !
Cette fonction a un coup en temps qui est un peu plus aléatoire, sans doute la lecture pinsB.
 

Attachments

Last edited:

ddaweb

New Member
Voici des tests complets sur pas mal de temps et donc des valeurs pertinentes à mon sens :
A titre indicatif, quelques mesures pour des longues durées qui ne seront jamais atteintes : 3, 4 et 5 min.
Les pauses sont pas multiples de 60.000.

23057

23058

Si vous avez des remarques ou commentaires à faire, n'hésitez pas.
Éventuellement un facteur correctif à appliquer ?

Je vais maintenant mettre le quartz dans le chrono définitif, et le refaire une comparaison rapide avec celui de développement.
Le quartz est une très bonne solution ... pas chère de surcroit !

NB : j'espère faire un test réel en concours au août dans un club ami où nous faisons le secrétariat du concours pour les aider.
NB 2 : je vais également faire une comparaison avec le chrono que nous avons ... je mettrai les temps si vous le souhaitez.
 
Last edited:

BESQUEUT

Senior Member
Voici des tests complets sur pas mal de temps et donc des valeurs pertinentes à mon sens :
A titre indicatif, quelques mesures pour des longues durées qui ne seront jamais atteintes : 3, 4 et 5 min.
Les pauses sont pas multiples de 60.000.

View attachment 23057

View attachment 23058

Si vous avez des remarques ou commentaires à faire, n'hésitez pas.
Éventuellement un facteur correctif à appliquer ?

Je vais maintenant mettre le quartz dans le chrono définitif, et le refaire une comparaison rapide avec celui de développement.
Le quartz est une très bonne solution ... pas chère de surcroit !

NB : j'espère faire un test réel en concours au août dans un club ami où nous faisons le secrétariat du concours pour les aider.
NB 2 : je vais également faire une comparaison avec le chrono que nous avons ... je mettrai les temps si vous le souhaitez.
Vu vos résultats, il semble possible d'améliorer encore un peu le communiquant pour qu'il puisse fonctionner seul. En particulier, la remise à zéro du timer est une mauvaise idée.

Sinon, un coefficient K est nécessaire parce qu'on ne peut pas ajuster le timer avec une finesse suffisante.
Par exemple pour T=12000 ms, vous trouvez une moyenne de 11997 ms.
Le correctif est donc de 3ms. La formule à utiliser est :
T= T/2000+1 /2 +T

Avec ce correctif, vos résultats moyens deviennent :

60​
5998​
5999​
7500​
7498​
7500​
9000​
8999​
9001​
12000​
11997​
12000​
15000​
14995​
14999​
18000​
17993​
17998​
24000​
23995​
24001​
 
Last edited:

ddaweb

New Member
Vu vos résultats, il semble possible d'améliorer encore un peu le communiquant pour qu'il puisse fonctionner seul. En particulier, la remise à zéro du timer est une mauvaise idée.

Sinon, un coefficient K est nécessaire parce qu'on ne peut pas ajuster le timer avec une finesse suffisante.
Par exemple pour T=12000 ms, vous trouvez une moyenne de 11997 ms.
Le correctif est donc de 3ms. La formule à utiliser est :
T= T/2000+1 /2 +T

Avec ce correctif, vos résultats moyens deviennent :

60​
5998​
5999​
7500​
7498​
7500​
9000​
8999​
9001​
12000​
11997​
12000​
15000​
14995​
14999​
18000​
17993​
17998​
24000​
23995​
24001​
Merci pour le calcul de ce petit correctif aussi rapidement.

Je vais essayer de mettre mon vieux chrono en // et voir ce que cela donne avant de l'appliquer ou voir si c'est un autre correctif qui serait nécessaire.
Je vais peut-être devoir utiliser une diode RF pour l'isoler du picaxe avec la tension présente, une diode classique donne des retards.

J'ai déjà pensé de retravailler mon code pour faire comme votre chrono, mais ce ne sera peut-être pas facile à mettre en oeuvre dans mon code ... et des tests à refaire ... loool

Mes travaux touchent à leur fin, j'aurai un peu plus de temps ;)

Il faut également tenir compte que les impulsions utilises plusieurs pauses / tranche de 60.000 et sans quartz ... ce n'est pas non plus la meilleure précision.
Le plus important est en dessous de 120 sec. ... le temps max. ne le dépassera que exceptionnellement, mais pas de beaucoup.
 

ddaweb

New Member
J'ai mit le quartz dans le communiquant définitif, avec votre coef. K.
En pilotant les 2 en //, j'obtiens des temps à +0.01 sec. max. de différence pour le définitif par rapport à celui de tests pour les temps jusque 180 sec. ... à 300 sec. : +0.02 sec.

Le communiquant de test en // avec l'ancien chrono donnais une différence de max +0.03 sec. pour des temps jusque 75 sec.
Mais comme je l'ai expliqué, l'ancien donne une tension sur l'entrée et suivant la pression sur le switch au moment de l'impulsion, cela changeait un peu (diminuait entre 0.01 et 0.02 max sur plusieurs tests avec le même temps : pression ferme ... je ne l'ai pas fait tout le temps pour ne pas le casser).
Je n'ai pas mit de diode.

Voici quelques résultats :

VieuxNouveauDiff.
19,72​
19,73​
0,01​
20,45​
20,46​
0,01​
30,29​
30,3​
0,01​
35,55​
35,57​
0,02​
35,91​
35,92​
0,01​
40,24​
40,27​
0,03​
42,32​
42,33​
0,01​
45,13​
45,14​
0,01​
47,33​
47,35​
0,02​
50,86​
50,89​
0,03​
53,06​
53,08​
0,02​
55,51​
55,53​
0,02​
57,02​
57,05​
0,03​
60,24​
60,27​
0,03​
63,07​
63,1​
0,03​
65,17​
65,2​
0,03​
68,99​
69,01​
0,02​
71,34​
71,36​
0,02​
73,73​
73,76​
0,03​

Dois-je tout de même appliquer ce K vu qu'il augmente légèrement le temps ?
 

ddaweb

New Member
J'ai fais des tests en fonctionnement réel durant près de 3h aujourd'hui, aucun déclenchement loupé et pas de faux déclenchement ... ouf
Le booster 5v vers 12v fonctionne très bien et l'alignement des cellules s'est fait sans encombre (rappel : cellules en 12v, ainsi que le signal vers le picaxe).
Toute la signalétique est également correcte sur le boitier des Juges.

Tout de même une erreur de programmation spécifique à un cas particulier : lorsque le chrono est en mode manuel et arrêt par le BP START/STOP :
1. Le chrono ne s'arrête pas
2. Dès que les barrières sont OK (repasse en mode automatique), le chrono s'arrête
3. Il faut refaire une programmation des barrières pour le réinitialiser : il est bloqué, sans doute une mauvaise (ré)initialisation
-> Je dois regarder à cela, mais ne concerne qu'un petit bout de code.

Le retour du mode manuel vers automatique est quand à lui correct (sans action sur le BP START/STOP !).

Le grand jour sera le 25 août en concours ... par sécurité, je prend l'ancien avec ;)

Je n'ai pas posté les tests comparatifs entre la platine de test et le chrono définitif : de temps en temps + 0.01 sec de différence jusqu'à 3 min. ... très équivalent donc et probablement lié au millième : > ou < 5 millièmes : facteur correctif de @BESQUEUT appliqué dans les 2 (il a stabilisé les différences).
Vu que la différence entre le chrono de test et l'ancien était déjà pas mal, je vais valider le chrono définitif tel quel :cool:

Je vais juste faire des trous d'aération dans le boitier (en dessous à droite et en haut du côté gauche où est l'alimentation) car en 220v, l'alimentation 220v-5v chauffe un tout petit peu (pas très excessif, je sais garder, sans problème, mon doigt dessus).

Voilà les dernières nouvelles :p
 

ddaweb

New Member
Le problème est résolu : un SETINT mal placé ;)

Durant mes tests réels, j'ai eu du mal à voir les leds des cellules en plein soleil, j'ai donc ajouté la visualisation des barrières en alarmes sur le boitier des juges : si au moins une barrière est en alarme lorsque le chrono est arrêté, les 2 leds s'allument et celle(s) en alarme clignote(nt) -> led_satus = barrière 1 et led_defaut = barrière 2.

Cela me donne pas la ou les cellules de la barrière active, mais au moins quelle barrière ... et surtout si au repos !

Je ne l'ai pas dit, mais les leds du boitier des juges se voient assez facilement à 40m ... nickel donc :p
 

ddaweb

New Member
Bonjour,

Je regarde à la phase 2 du chrono : l'afficheur extérieur.

Cahier des charges :
- Commande depuis le chrono en 3 fils : 1 sortie de commande (0 v ou +5 v) - TX (envoi du temps final) - 0 V
- Un picaxe avec sont propre timer lorsque la commande "sortie" est activée - à l'arrêt : attente du temps final via RX pour l'afficher (depuis le chrono)
- Affichage du temps au 1/10 max durant le chronométrage - affichage du temps au 1/100 à la réception du temps final
- segments via ruban led de 10 cm (https://www.buyledstrip.com/fr/led-en-bande-5050-60-led-m-bleu-par-50cm.html) et profilé alu avec couvercle pour diffuser la lumière (https://www.buyledstrip.com/fr/profil-en-aluminium-2507-1-metre.html)
- Alimentation dans l'afficheur de 12 v 75 W (min) + DC-DC de 12 à 5 v pour le picaxe

Je me demande quel picaxe utiliser (28x2 avec quartz ?).
Le ULN2004 sera-t-il suffisant pour les segments : +/- 120 mA / segments d'après les infos du site ... plutôt mettre des transistors à la place ?
Le Belge a utilisé 2 rangées de leds, mais je me demande vraiment si, avec le profilé, cela est vraiment nécessaire ? ... +/- 75 lm / 10 cm

Pensez-vous que cela tiendrait la route ?
 

BESQUEUT

Senior Member
Apa 102 : commande directe depuis le picaxe sur une seule broche. Pas besoin de drivers.
5 chiffres = 35 segments
Même avec un 40 X2 ça ne passe pas.
 

ddaweb

New Member
C'est bien facile le Apa 102, mais côté luminosité ? ... cela me semble beaucoup plus faible, côté installation cela semble nettement plus facile.
 

ddaweb

New Member
Je compte faire 2 parties à couper du ruban / segments, donc 6 leds au total -> 10 cm de long / segment.
5 digits de 7 segments = 35 segments.

Attention uln 2003 : 700 mA par chip
Oui c'est pour cela que j'ai pensé piloter avec des transistor style BC547 (un peu short avec 0.1 A) ou 2n2222 TO-92 (0,6 A, le double de prix, 0.3 €) ... +/- 120 mA / segment, on dépasse, même si les 7 seront rarement allumés en même temps (que le chiffre 8).
 

ddaweb

New Member
Une précision sur le cahier des charges : le dernier temps reste affiché jusqu'au départ suivant ... on pourrait envisager de l'éteindre après, disons, 5 à 10 min d'inactivité pour un soucis de chauffe et économie d'énergie (mon côté un peu écolo).
 

BESQUEUT

Senior Member
En intercalant des 74ls47 on se ramène à 4 broches par chiffre et on simplifié le code.

Ça fait pas mal d'électronique.
Sinon, avec les rubans intelligents vous pouvez passer en 96 ou 144 leds/m pour plus de puissance sans rien changer en électronique.
Et en prime c'est en couleurs !
 
Last edited:

ddaweb

New Member
En intercalant des 74ls47 on se ramène à 4 broches par chiffre et on simplifié le code.
Oui en BCD comme le cd4543 utilisé dans le chrono original : http://electromag1.wifeo.com/chrono-agility.php
Ne pas oublier le latch des digits.
Mais alors plus besoin du 40x2.
Le 28x2 si je place un quartz.

Le code est déjà tout prêt pour l'afficheur, reste à y ajouter le mode de fonctionnement : interrupt sur la sortie du chrono qui s'active au démarrage et retombe à l'arrêt, timer interne pour le temps de l'affichage -> TX pour le temps final qui sera alors affiché en 1/100 alors (autrement 1/10 avec le timer interne).
Je ne vais pas occasionner des transmissions qui auront un coût en temps dans le chrono vu que le TX se fera chrono arrêté ... juste une sortie à activer au démarrage et désactiver à l'arrêt.
 

ddaweb

New Member
Je tiens encore à remercier tous ceux qui ont contribué à l'amélioration du code de notre chrono.
Il a fait sont baptême du feu, hier dimanche, durant un concours.

Il a très bien fait son travail, juste un petit problème de blocage du programme de temps en temps lors du réglage des barrières : nouveau parcours ou changement de classe où la hauteur des cellules était modifiée.
Il m'a semblé que l'interruption ne s'initialisait pas correctement une fois que les 2 barrières passaient au repos -> pas moyen de faire déclencher le START alors qu'il signalait que le chrono était prêt : il était donc bien passé dans la boucle d'attente du START vu que seule la led_status clignotait et c'est le seul endroit où c'est le cas (donc pas un blocage complet du Picaxe) !
Durant le concours pas vraiment possible de faire une analyse approfondie, un reset hard et c'était OK ... il est même fort possible que si j'avais fait un appel mémoires, cela aurait également suffit vu qu'à la sortie de cet appel, il réinitialise le chrono et donc les interruptions, mais je n'y ai pas pensé ce dimanche.
Cela semblait se poser dans le cas du réglage du STOP et ensuite du START ... sans certitude.

Une fois qu'il était bien opérationnel : aucun loupé de START ou de STOP lorsque le chien passait bien dans les cellules ... plusieurs sont passés en dessous et 1 au dessus -> pas de déclenchement évidemment.

Il a tourné uniquement sur un PowerBank de 10.000mA bas de gamme (Trust) : à la fin de la journée, il était à +/- 50 % = approximativement 10h en fonctionnement.

Personne n'a de suggestion pour l'afficheur extérieur ?

Edit :
Les conditions de température n'étaient pas idéales : très chaud (32° annoncé, mais le resssnti devait être plus haut car il n'y avait pas de vent) et chrono en plein soleil toute la matinée.
 
Last edited:
Top