Problème arduino et registre 16 bits
Répondre à la discussion
Affichage des résultats 1 à 12 sur 12

Problème arduino et registre 16 bits



  1. #1
    LeaderRaccoon

    Problème arduino et registre 16 bits


    ------

    Bonjour,

    Voilà mon problème est simple.

    Lorsque j'écris dans un registre 16 bits, ie OCR1AH et OCR1AL pour le timer 1 de la carte léonardo, si je le fais dans le setup() seul le registre Low est écrit alors que si je le fais dans le loop() les deux sont biens écris.

    Code utilisé:

    Setup(){
    OCR1AL = xx;
    OCR1AH = xx;
    }

    Seul OCR1AL est pris en compte.

    Loop(){
    OCR1AH = xx;
    OCR1AL = xx;
    }

    Les deux registres sont modifiés.

    Ma question, qu'est ce que j'ai loupé pour pas que le même code fonctionne en loop et pas en setup?

    -----

  2. #2
    Picooz

    Re : Problème arduino et registre 16 bits

    Il n'y a pas de différence entre les opérations dans le loop et dans le setup, le main() est écrit comme ça :

    Code:
    #include <WProgram.h>
    
    int main(void)
    {
         init();
    
         setup();
       
         for (;;)
               loop();
           
         return 0;
    }
    Par contre, je lis, ligne 118 de la doc : The high byte (OCRnxH) has to be written first.
    Dans ton code, ça ne marche pas quand tu commences par le low byte (dans ton setup) mais ça marche quand tu commences par le High Byte (dans ton loop)
    Je pense que ça vient d'ici.
    Dernière modification par Picooz ; 13/04/2015 à 20h49.

  3. #3
    LeaderRaccoon

    Re : Problème arduino et registre 16 bits

    Bien vu.
    Mais j'ai tenté les deux ordres d'écriture, en vain.
    Peu importe l'ordre dans le loop, les deux registres sont écrit alors que dans le setup, peu importe l'ordre seul le low passe.

  4. #4
    jiherve

    Re : Problème arduino et registre 16 bits

    Bonsoir
    dans la boucle une écriture du LSB suivra toujours une écriture du MSB quelque soit l'ordre des instructions, réfléchis un peu.
    Et comment sais tu que ton initialisation ne fonctionne pas(MSB suivi par LSB), comme la boucle est exécutée dans la foulée c'est elle qui aura le dernier mot.
    C'est le drame avec les softeux vous oubliez presque toujours le facteur temps.
    JR
    Dernière modification par jiherve ; 13/04/2015 à 21h03.
    l'électronique c'est pas du vaudou!

  5. A voir en vidéo sur Futura
  6. #5
    LeaderRaccoon

    Re : Problème arduino et registre 16 bits

    J'écris, bien évidemment pas, les registres dans la boucle loop et setup en même temps.
    J'ai jute testé le même code dans les deux emplacements possible et observer que je n'avais pas le même comportement, ce qui ne m'arrange pas du tout.

  7. #6
    jiherve

    Re : Problème arduino et registre 16 bits

    Re
    Donnes ton code complet avec les balises code '#' prevues à cet effet.
    JR
    l'électronique c'est pas du vaudou!

  8. #7
    LeaderRaccoon

    Cool Re : Problème arduino et registre 16 bits

    Une partie du code pour les registres OCR1A comme cités en exemple.

    Code:
    #define const uint8_t* OCR1AH = 0x89;
    #define const uint8_t* OCR1AL = 0x88;
    
    void setup() {
    OCR1AH = 1; OCRIAL = 2;
    } void loop(){ }

  9. #8
    jiherve

    Re : Problème arduino et registre 16 bits

    Re
    OCR1AH est un pointeur donc pour modifier la valeur pointée ne faut il pas écrire *OCR1AH = 1 ?
    JR
    l'électronique c'est pas du vaudou!

  10. #9
    LeaderRaccoon

    Re : Problème arduino et registre 16 bits

    Si tu veux changer la variable pointée oui, mais dans mon cas c'est la valeur de la variable pointée qui m’intéresse.

  11. #10
    PA5CAL

    Re : Problème arduino et registre 16 bits

    Bonsoir
    Citation Envoyé par LeaderRaccoon Voir le message
    Une partie du code pour les registres OCR1A comme cités en exemple.

    Code:
    #define const uint8_t* OCR1AH = 0x89;
    #define const uint8_t* OCR1AL = 0x88;
    
    void setup() {
    OCR1AH = 1; OCRIAL = 2;
    } void loop(){ }
    1) l'utilisation du #define n'a pas de sens : "#define const uint8_t* OCR1AH = 0x89;" demande au précompilateur de rechercher les occurrences du mot "const" dans le programme, et de les remplacer par le texte "uint8_t* OCR1AH = 0x89;"

    2) comme le fait remarquer jiherve, dans le principe, pour modifier l'adresse pointée par un pointeur, il faut mettre une "*" avant le nom de ce pointeur au moment de l'assignation

    3) dans ce code, c'est OCRIAL (avec un i majuscule) qui est écrit, au lieu de OCR1AL (avec le chiffre 1)

    4) normalement, OCR1AH et OCR1AL sont déjà définis dans l'environnement de développement. OCR1A l'est également, et le compilateur doit savoir écrire tout seul dans ce registre 16 bits (comme il convient de le faire, le MSB avant le LSB). Il suffit d'écrire :

    Code:
      int val = 0x1234;
    
      //....
    
      OCR1A = val;

  12. #11
    PA5CAL

    Re : Problème arduino et registre 16 bits

    J'ai oublié des mots. Il faut lire:

    2) comme le fait remarquer jiherve, dans le principe, pour modifier le contenu à l'adresse pointée par un pointeur, il faut mettre une "*" avant le nom de ce pointeur au moment de l'assignation

  13. #12
    LeaderRaccoon

    Re : Problème arduino et registre 16 bits

    Bien merci, grace à Pascal je viens de réaliser que je voyais trop compliqué.
    Effectivement si le nom des registres est bien adressé directement pourquoi le refaire.

Discussions similaires

  1. Utiliser les bits d'un registre
    Par invite88c4773b dans le forum Électronique
    Réponses: 3
    Dernier message: 18/08/2011, 02h02
  2. Registre 8 bits
    Par f_el_119 dans le forum Électronique
    Réponses: 28
    Dernier message: 08/04/2011, 22h22
  3. Registre 8 Bits à l'envers
    Par petitnul12 dans le forum Électronique
    Réponses: 3
    Dernier message: 06/02/2011, 13h13
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...