IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Incompréhension analyse des bits d'un byte


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    bricoleur
    Inscrit en
    Octobre 2014
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : bricoleur
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 406
    Par défaut Incompréhension analyse des bits d'un byte
    Bonjour à tous
    Je tente en vain de stocker l'état des bits d'un octet dans un tableau de booleen:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    byte memRel = 0b11011011;   //mémoire d'état des relais
    bool etatRel[8];            //etat des relais actifs
    Puis je tente de stocker l'état des mes bits dans le tableau de booleen:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    //*****************lecture etat**************************
    void lectureEtat(){
      if(memRel != 0b11111111){           //0b11111111 tous les relais carte seraient OFF
        for(int i=0;i<8;i++){
          etatRel[i]= (memRel & (1<<i) == 0)? true: false ;
        }
      } 
    }
    mais lorsque je lis mon tableau pour y affecter 'F' ou 'O':
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if (PCF8574Ok) {
           char tempo [10]= {""};
           for (int j = 0; j < 8; j++) {
               tempo[j] = (etatRel[j]) ? 'O' : 'F';
           }
           tempo[8]= 'Z'; tempo[9]='\0';     
           Serial1.print(tempo);       
     }
    j'obtiens FFFFFFFF au lieu de FFOFFOFF

    Où est la bétise?

  2. #2
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    sans doute dans la priorité des opérateurs

    essayez de modifier dans lectureEtat() la boucle avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      for (int i = 0; i < 8; i++) {
        etatRel[i] = (memRel & (1 << i)) != 0 ; // notez l'ajout de parenthèses
      }
    mais le plus simple plutôt que de créer un tableau qui va manger 8 octets et d'utiliser bitRead() quand vous voulez lire l'état ou bitWrite() quand vous voulez forcer un état sur un bit particulier. Comme cela tout tient sur un seul octet

    https://reference.arduino.cc/referen...bytes/bitread/
    https://reference.arduino.cc/referen...ytes/bitwrite/

  3. #3
    Membre éclairé
    Homme Profil pro
    bricoleur
    Inscrit en
    Octobre 2014
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : bricoleur
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 406
    Par défaut
    Merci pour cette réponse qui a solutionné mon problème. J'ai écrit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if(memRel != 0b11111111){           //0b11111111 tous les relais carte sont OFF
        for(int i=0;i<8;i++){
          etatRel[i]= ((memRel & (1<<i)) == 0)? true: false ;
        }
      }
    J'avais bien pensé utiliser bitRead() et bitWrite() mais je n'ai pas trouvé la syntaxe. Dans l'aide Arduino, il n'y a pas d'exemple d'utilisation. Ou bien j'ai mal cherché.
    Cordialement
    Michel

  4. #4
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    oui votre écriture fonctionne aussi

    comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((memRel & (1<<i)) == 0)
    est déjà une valeur de vérité (le résultat de la comparaison est true ou false) vous pourriez utiliser directement cette valeur au lieu de prendre l'opérateur ternaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if(memRel != 0b11111111){           //0b11111111 tous les relais carte sont OFF
        for(int i=0;i<8;i++){
          etatRel[i]= (memRel & (1<<i)) == 0 ;
        }
      }
    avec bitRead vous auriez écrit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      for(int i=0;i<8;i++){
        etatRel[i]= bitRead(memRel, i) == 0;
      }
    ==> on dit dans quelle variable on veut lire puis quel N° de bit

  5. #5
    Membre éclairé
    Homme Profil pro
    bricoleur
    Inscrit en
    Octobre 2014
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : bricoleur
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 406
    Par défaut
    Parfait, j'ai tout compris.
    Si j'ose abuser de vos compétences, j'ai encore un petit problème de compréhension.
    J'ai:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    const char *rls= "Relais";
    char buf1[16];
    sprintf(buf1,"%s N %c ONZ%c", rls,car[3],'\0');
    Serial1.print(buf1);
    Avec car[3]=1 par exemple. Et 'Z' le caractère de fin de message.
    Mon problème: en réception je vois que
    "R N 1 ON"
    .
    "elais" n'apparaît pas.
    Pourquoi le %s ne prend que le premier caractère.
    Ce n'est pas vraiment facile le C pour ne pas utiliuser l'objet String.

  6. #6
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    ça ne devrait pas être le cas sauf si vous avez un dépassement mémoire quelque part.

    Il n'y a pas besoin de mettre le caractère nul à la fin, sprintf() le fait pour vous.
    il vaut mieux aussi utiliser la version snprintf() qui prend en paramètre la taille du buffer pour éviter tout dépassement mémoire

    essayez ce bout de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    const char *rls = "Relais";
    char buf1[16];
     
    void setup() {
      char car[] = "00010000"; // un '1' à l'index 3
     
      Serial.begin(115200);
      snprintf(buf1, sizeof buf1, "%s N %c ONZ", rls, car[3]);
      Serial.print(buf1);
    }
     
    void loop() {}
    vous devriez bien voir Relais N 1 ONZ

  7. #7
    Membre éclairé
    Homme Profil pro
    bricoleur
    Inscrit en
    Octobre 2014
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : bricoleur
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 406
    Par défaut
    Merci bien. C'est résolu. Le problème venait du côté de la réception! Toujours avec ces fameux HC12.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Analyse des performances du taux d'erreur par bits / DVB-S
    Par level_set dans le forum Simulink
    Réponses: 0
    Dernier message: 16/05/2021, 11h36
  2. Accéder facilement à chaque bit d'un byte
    Par bobby-b dans le forum Langage
    Réponses: 6
    Dernier message: 10/07/2004, 14h07
  3. opérations sur les bits d'un byte
    Par petitours dans le forum C++Builder
    Réponses: 4
    Dernier message: 10/02/2004, 20h42
  4. Travailler avec des bits
    Par Vulvulune dans le forum Langage
    Réponses: 5
    Dernier message: 02/03/2003, 19h09
  5. Question : ordre des bits ?
    Par Choupi dans le forum C
    Réponses: 3
    Dernier message: 11/02/2003, 06h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo