Go Down

Topic: Pouvez vous m'éclairer sur ce code ? (Read 514 times) previous topic - next topic

scrat27

Bonjour,

Pouvez vous m'éclairer sur ce bout de code, car je ne comprend pas ces deux lignes :
Code: [Select]

  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 :
Code: [Select]

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();

bigben99

#1
Feb 19, 2015, 10:23 am Last Edit: Feb 19, 2015, 10:26 am by bigben99
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

Poogahzi

#2
Feb 19, 2015, 10:39 am Last Edit: Feb 19, 2015, 10:40 am by Poogahzi
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).

Code: [Select]
frequencyH=frequencyB>>8;

récupère les 8 bits d'en haut dans un octet.

Code: [Select]
frequencyL=frequencyB&0xFF;

ne garde que les 8 bits du bas dans un octet.

Code: [Select]

  Wire.send(frequencyH);
  Wire.send(frequencyL);


envoie les deux octets.

cf. http://arduino.cc/en/Reference/WireSend

scrat27

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.

Go Up