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:
Top