scrat27
February 19, 2015, 9:08am
1
Bonjour,
Pouvez vous m'éclairer sur ce bout de code, car je ne comprend pas ces deux lignes :
frequencyH=frequencyB>>8;
frequencyL=frequencyB&0XFF;
Je vous met le code général pour le contexte, et je n'ai pas de problème avec, mais j'aimerai comprendre ce que font ces deux lignes :
frequency=87.5; //starting frequency
frequencyB=4*(frequency*1000000+225000)/32768; //calculating PLL word
frequencyH=frequencyB>>8;
frequencyL=frequencyB&0XFF;
delay(100);
Wire.beginTransmission(0x60); //writing TEA5767
Wire.send(frequencyH);
Wire.send(frequencyL);
Wire.send(0xB0);
Wire.send(0x10);
Wire.send(0x00);
Wire.endTransmission();
Pour la première : Décalage de bits
ex :
a = b00101000
b = a>>3
résultat : b = 00000101
b = a>>5
résultat : b = 00000001
Pour la seconde : Opération ET bit à bit
ex :
a = b00001010
b = b00001100
a & b = b00001000
En fait ces deux lignes coupent une valeur sur 16 bits en 2 valeurs de 8 bits, afin de les transmettre octet par octet avec Wire.send(...);
frequencyB est la valeur 16 bits à transmettre. frequencyH (H pour high, bits de poids fort), frequencyL (L pour low, bits de poids faible).
frequencyH=frequencyB>>8;
récupère les 8 bits d'en haut dans un octet.
frequencyL=frequencyB&0xFF;
ne garde que les 8 bits du bas dans un octet.
Wire.send(frequencyH);
Wire.send(frequencyL);
envoie les deux octets.
cf. http://arduino.cc/en/Reference/WireSend
scrat27
February 19, 2015, 9:50am
4
Merci beaucoup pour vos réponses.
Je me doutais que ces deux lignes coupaient la valeur calculée de la fréquence en deux octets (en lisant la doc du circuit) mais je ne comprenait pas le mécanisme.