"Naviguer" dans les octets

Bonjour à tous,
J'ouvre un nouveau topic. Je souhaite lire le byte 0b10101010 bit par bit.
La méthode que j'utilise est de recourir à un masque 0x80 (10000000) que décale sur la droite à chaque interruption de 2 secondes par exemple. Quand le DccBitShift est à 0, on sort.
je m'attends à lire bit par bit l'octet 0b10101010 mais je n'obtiens que des 1.
Auriez-vous la solution?
merci bcp!!


void dccInterrupt() {
  DccBitShift=0x80;
  DccBit=0b10101010&DccBitShift;
  DccBitShift>>=1;
  Serial.print(DccBit);
  if (!DccBitShift) {
    return;
  }
}





void setup() {
Serial.begin(115200);
FlexiTimer2::set(2000, 1/1000, dccInterrupt);
FlexiTimer2::start();
}

void loop() {}

Utiliser bitRead

DccBitShift est remis à 0x80 a chaque début de la fonction d'interruption. Celà efface le décalage. Du coup c'est toujours le même but qui est lu

Merci. Le bitread est plus optimal?

c'est une macro

#define bitRead(value, bit) (((value) >> (bit)) & 0x01)

donc ça fait un décalage à droite et ensuite le masque sur le premier bit qui est constant.

L'avantage de cette approche c'est que ça donne 0 ou 1 et ça fonctionne avec plusieurs types de différentes longueurs, comme byte, unsigned int, unsigned long int et unsigned long long int de la même manière sinon il faut que le masque soit de la bonne longueur aussi on a un bit au milieu donc une valeur nulle ou non nulle (mais pas forcément 1).


sinon concernant

même remarque que dans l'autre post... 1/1000 c'est 0 pas 0,001 parce que le calcul se fait en entier.

il faut écrire 1.0 / 1000 si vous voulez obtenir un nombre à virgule

oui !! merci

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.