Répondre à la discussion
Affichage des résultats 1 à 19 sur 19

Interpretation du code gray par un microcontroleur, problème logiciel ou matériel?



  1. #1
    Canaillou2k5

    Interpretation du code gray par un microcontroleur, problème logiciel ou matériel?


    ------

    Bonjour, j'ai un encodeur type code gray de façon à déterminer le sens de rotation.
    J'utilise deux entrées du micro qui ont des interruptions dédiées (INTO et INT1).

    Pour moi lorsque le sens change, on à la même sortie qui change d'état deux fois de suite, mes interruptions se font sur front montant ou descendant, voici le code:

    Code:
    interrupt[2] void int0() //interruption sur INT 0
        {  
        var_a++; // incrementation de a
        
        if(var_a>=2)sens=1; // si on passe deux fois dans cette boucle on change de sens
        
        var_b=0; // remise à 0 de b
        }
        
    interrupt[3] void int1() //interruption sur INT 1
        {  
        
        var_b++;
                    
        if(var_b>=2)sens=0; // si on passe deux fois dans cette boucle on change de sens
        
        var_a=0;
         
        }
    Si on alterne int0 et int1 les variables incrémentées ne peuvent pas arriver à deux.

    Lorsqu'on change de sens on passe deux fois dans une interruption et là le sens change.

    Mon problème est que lorsque je fait tourner dans le même sens ma variable "sens" change quand même.

    J'ai l'impression que mon micro loupe des interruptions et donc ne remet pas les variables à 0, du coup il change de sens.

    Comment je peut remédier à ça?

    NB: en pièce jointe le schéma de câblage.

    Merci.

    -----
    Images attachées Images attachées
    Dernière modification par Jack ; 06/08/2011 à 21h01. Motif: remplacement balises quote par balises code

  2. Publicité
  3. #2
    DAUDET78

    Re : Interpretation du code gray par un microcontroleur, problème logiciel ou matériel?

    Sans voir ta pièce jointe
    Ton codeur, ce n'est pas un codeur incrémental avec deux sorties en quadrature ?
    J'aime pas le Grec

  4. #3
    MiGaNuTs

    Re : Interpretation du code gray par un microcontroleur, problème logiciel ou matériel?

    Bonjour,

    je comprends pas ton histoire de code gray, j'en vois nulle part ici.
    C'est quoi le rapport avec la choucroute ?


    Il tourne a quelle vitesse ton codeur ? combien d'impulsions par tour ?
    Quelle frequence pour ton microcontroleur ? as tu du temps de cycle de libre ?

    Je comprends pas ta démarche ne fait.

  5. #4
    Canaillou2k5

    Re : Interpretation du code gray par un microcontroleur, problème logiciel ou matériel?

    Je pense que c'est bien ça Daudet. (A droite vous avec la table du gray sur 2 bits, http://en.wikipedia.org/wiki/Gray_code)
    Sa fait deux carré sur chacune des pin décalés de PI/2 en gros.

    Le codeur est tourné à la main en fait^^
    EDIT: le problème vient des rebonds, en un coup ça peut augmenter entre 1 et 30^^

    Le problème c'est que je sait bien programmer un anti-rebond si on place un interrupteur sur une PIN, mais je vois pas comment en faire un dans mon interruption avec "any logical changes".

  6. #5
    DAUDET78

    Re : Interpretation du code gray par un microcontroleur, problème logiciel ou matériel?

    Il faut faire l'algorithme en pièce jointe
    Fichiers attachés Fichiers attachés
    J'aime pas le Grec

  7. A voir en vidéo sur Futura
  8. #6
    Canaillou2k5

    Re : Interpretation du code gray par un microcontroleur, problème logiciel ou matériel?

    Code:
    /*interrupt[14] void encoder()
        {   
        
        if(j==0)
        {
        PIND.2=var_a;
        PIND.3=var_b;
        j=1;
        }
        else
        {
            if(var_a==0 && var_b==0)
            {
                if(PIND.2==0 && PIND.3==1)var++;
                if(PIND.2==1 && PIND.3==0)var--;
                if(PIND.2==0 && PIND.3==0);
            }   
            if(var_a==0 && var_b==1)
            {
                if(PIND.2==1 && PIND.3==1)var++;
                if(PIND.2==0 && PIND.3==0)var--;
                if(PIND.2==0 && PIND.3==1);
            } 
            if(var_a==1 && var_b==1)
            {
                if(PIND.2==1 && PIND.3==0)var++;
                if(PIND.2==0 && PIND.3==1)var--; 
                if(PIND.2==1 && PIND.3==1);
            }
            if(var_a==1 && var_b==0)
            {
                if(PIND.2==0 && PIND.3==0)var++;
                if(PIND.2==1 && PIND.3==1)var--;
                if(PIND.2==1 && PIND.3==0);        
            }
        
        
        j=0;
        }  
        
        update();
        
        }
    Je pense que j'ai mal compris ton document...
    Dernière modification par Jack ; 06/08/2011 à 21h02.

  9. Publicité
  10. #7
    DAUDET78

    Re : Interpretation du code gray par un microcontroleur, problème logiciel ou matériel?

    Et comme je suis 0,0000 en programmation, je ne sais pas lire ton code ! .... mais mon algorithme est bon
    J'aime pas le Grec

  11. #8
    Canaillou2k5

    Re : Interpretation du code gray par un microcontroleur, problème logiciel ou matériel?

    Code:
    if(j==0)
        {
        var_a=PIND.2;
        var_b=PIND.3;
        j=1;
        }
    En fait avec un peut d'ordre ca fonctionne...
    Dernière modification par Jack ; 06/08/2011 à 21h02.

  12. #9
    DAUDET78

    Re : Interpretation du code gray par un microcontroleur, problème logiciel ou matériel?

    - Il faut faire une action en fonction de [PIND.2 et PIND.3 mémorisés] versus [PIND.2 et PIND.3 lu]
    - Il faut mémoriser PIND.2 et PIND.3 à la fin de la gestion de l'interruption (pour la prochaine!)
    J'aime pas le Grec

  13. #10
    Jack
    Modérateur

    Re : Interpretation du code gray par un microcontroleur, problème logiciel ou matériel?

    j'ai fait les modifs pour cette fois, mais merci de mettre des balises code et non pas quote à l'avenir pour visualiser le code source.

  14. #11
    Canaillou2k5

    Re : Interpretation du code gray par un microcontroleur, problème logiciel ou matériel?

    @jack: J'étais dans l'idée que je me citais en fait....merci pour la correction.

    IL y à quelque chose qui ne va pas, c'est que ce n'est pas très fluide, même en mettant ça dans la boucle principale (qui tourne tout le temps) il faut deux crans pour incrémenter ou décrémenter dès fois 3 ou 4 pour changer de sens, mais je sait pas si ça vient de l'algo ou de mon code qui ne suit pas ton algo, j'ai pas encore réfléchi dessus je vais m'y mettre, sinon je pense à ça:
    http://fr.w3support.net/index.php?db=so&id=34735

    J'ai également trouver un système anti rebond avec les interruptions, mais ca permet uniquement un sens de rotation:

    en francais:

    Interruption PIN 1
    {
    -j'active l'interruption PIN0
    -je désactive l'interruption PIN 1 (anti rebond)

    -j'incrémente ma variable
    }
    Interruption PIN 0
    {
    -j'active l'interruption PIN1
    -je désactive l'interruption PIN 0 (anti rebond)

    -j'incrémente ma variable
    }

    Pour le sens inverse, j'ai mit une variable dans chaque interruption, qui valide à nouveau l'interruption pour les deux PINS, mais même avec un bon temps, ca ne fonctionne pas.

    Est-ce que le micro contrôleur garde en mémoire les interruption en "file d'attente"?

    Je pense qu'au moment ou il execute l'ordre "je désactive l'interruption PIN 0" il à déjà pris en mémoire pas mal de rebonds et lorsque je réactive les interruptions il les executes....

  15. #12
    DAUDET78

    Re : Interpretation du code gray par un microcontroleur, problème logiciel ou matériel?

    Le programme doit être entièrement dans une interruption déclenchée par un timer

    Et il est très court à exécuter :

    un "case" en fonction des deux variables stockées (4 choix)
    Et pour chaque choix:
    - lecture du port et stockage dans deux variables
    - un "case" en fonction des deux variables stockées (4 choix)
    - incrémentation ou décrémentation du compteur ou rien
    - fin d'interruption
    J'aime pas le Grec

  16. Publicité
  17. #13
    Canaillou2k5

    Re : Interpretation du code gray par un microcontroleur, problème logiciel ou matériel?

    C'est bon ton algo fonctionne parfaitement, il suffit juste de le suivre correctement.

    Je le met ça peut toujours servir:

    Code:
    unsigned char var_a=0, var_b=0, var=0; //variables globales
     
    void stockage() //stockage des anciennes valeurs
    {
        var_a=PIND.2;
        var_b=PIND.3;
    }
       
    void var_plus()           //fonction incrémenter
    {
        if(var<100)var++; //on incrément si on est en dessous de la valeur maxi. 
        stockage();            //stockage des anciennes valeurs
    }
    void var_moins()       //fonction décrémenter
    {
        if(var>0)var--;      //on incrément si on est au dessus de la valeur mini.
        stockage();           //stockage des anciennes valeurs
    }
        
    interrupt[14] void gray() // interruption sur compteur (toutes les 1,6ms)
    {
    
            if(var_a==0 && var_b==0)
            { 
            
                if(PIND.2==0 && PIND.3==1)var_plus();           //fonction incrémenter
                else if(PIND.2==1 && PIND.3==0)var_moins(); //fonction décrémenter
            }   
            else if(var_a==0 && var_b==1)
            {
                if(PIND.2==1 && PIND.3==1)var_plus();
                else if(PIND.2==0 && PIND.3==0)var_moins();
            } 
            else if(var_a==1 && var_b==1)
            {
                if(PIND.2==1 && PIND.3==0)var_plus();
                else if(PIND.2==0 && PIND.3==1)var_moins();
            }
            else if(var_a==1 && var_b==0)
            {
                if(PIND.2==0 && PIND.3==0)var_plus();
                else if(PIND.2==1 && PIND.3==1)var_moins();      
            }
    
    }
    sujet clos.

  18. #14
    DAUDET78

    Re : Interpretation du code gray par un microcontroleur, problème logiciel ou matériel?

    Tu as vu, je suis nul en programmation

    Je pense que l'exécution serais plus rapide (mais le programme plus long) si on utilisais pas des procédures mais des macro

    Me donnes tu l'autorisation de ré-utilisé ton programme pour en faire (peux être) un truc dans la rubrique projet ?
    J'aime pas le Grec

  19. #15
    Canaillou2k5

    Re : Interpretation du code gray par un microcontroleur, problème logiciel ou matériel?

    Oui c'est pour ça que je l'ai mit.

    Y'a une faute:

    void var_moins() //fonction décrémenter
    {
    if(var>0)var--; //on incrémente si on est au dessus de la valeur mini.
    stockage(); //stockage des anciennes valeurs
    }

  20. #16
    DAUDET78

    Re : Interpretation du code gray par un microcontroleur, problème logiciel ou matériel?

    En fait, ton programme est un peu particulier parce que ton codeur est utilisé comme un bouton analogique. Tu fais varier ta variable entre 0 et 100

    Si on utilise le codeur pour indiquer une position mécanique, on ne limite pas l'excursion, mais à chaque passage du TopZéro, on fait la remise à zéro de la variable
    J'aime pas le Grec

  21. #17
    Canaillou2k5

    Re : Interpretation du code gray par un microcontroleur, problème logiciel ou matériel?

    Ma variable et l'expression en % de la vitesse d'un moteur commander en PWM sur un compteur 8 bit (elle est multiplier par 2,55 après)

    Au début je l'avais fait sur l'ADC. Mais je préfère l'encodeur car c'est des crans et il tourne à l'infini, c'est juste une raison perso...

  22. #18
    DAUDET78

    Re : Interpretation du code gray par un microcontroleur, problème logiciel ou matériel?

    J'aime pas le Grec

  23. Publicité
  24. #19
    Jack
    Modérateur

    Re : Interpretation du code gray par un microcontroleur, problème logiciel ou matériel?

    Citation Envoyé par DAUDET78 Voir le message
    Je pense que l'exécution serais plus rapide (mais le programme plus long) si on utilisais pas des procédures mais des macro
    C'est une très bonne idée.

    Pour rendre le programme plus générique, il serait intéressant de rajouter quelques définitions, par exemple:
    Code:
    #define SIG_A PIND.2
    #define SIG_B PIND.3
    Ainsi
    Code:
            if(var_a==0 && var_b==0)
            {
                 if(PIND.2==0 && PIND.3==1)var_plus();      
                 else if(PIND.2==1 && PIND.3==0)var_moins();
            }
    deviendrait
    Code:
            if(var_a==0 && var_b==0)
            {
                 if(SIG_A==0 &&SIG_B==1)var_plus();          
                 else if(SIG_A==1 && SIG_B==0)var_moins();
              }
    et du coup on deviendrait indépendant du type du µContrôleur

    A+

Discussions similaires

  1. Code Gray
    Par deyni dans le forum Électronique
    Réponses: 3
    Dernier message: 20/02/2011, 11h52
  2. code gray en binaire naturel
    Par cgiles dans le forum Électronique
    Réponses: 1
    Dernier message: 23/10/2010, 19h08
  3. code gray
    Par No1 dans le forum Électronique
    Réponses: 3
    Dernier message: 10/10/2010, 11h20
  4. Code de Gray
    Par hindou90 dans le forum Électronique
    Réponses: 3
    Dernier message: 08/11/2008, 18h28
  5. Code Gray
    Par remix13 dans le forum Électronique
    Réponses: 4
    Dernier message: 23/09/2007, 11h49
Découvrez nos comparatifs produits sur l'informatique et les technologies.