12 bits, ce n'est pas 13 bits! Il faut maîtriser ses gammes de valeurs


Il est important de maîtriser ses types et les valeurs qu'elles peuvent contenir.

Il est courant de dire qu'un type 8 bits peut contenir 256 valeurs, ce qui est vrai.
Mais attention, et cela est extrêmement important, les valeurs vont de 0 à 255.

En explorant la représentation binaire (ce que l'on peu faire avec MicroPython), nous voyons:
  • 0b00000000 -> valeur 0
  • 0b11111111 -> valeur 255 (pas 256)

Pourquoi est-ce important?

Je suis récemment tombé sur un bug très gênant provoqué par ce type de problème. Bug apparût dans un pilote MicroPython que j'ai récemment testé.
Il s'agit d'une contrôleur PWM qui accepte des valeurs sur 12 bits (soit 4096 valeurs possibles, de 0 à 4095) pour indiquer le cycle utile de ce signal PWM entre 0 et 100%.
Donc, en explorant les valeurs possibles nous avons:
  • 0b000000000000 --> valeur 0 --> signal toujours à 0 volts. Cycle utile 0%.
  • 0b111111111111 --> valeur 4095 --> signal toujours à 3.3 volts. Cycle utile 100%.
Une erreur toute bête... utiliser la valeur 4096 comme valeur maximale (au lieu de 4095).
Observons la représentation binaire de 4096 est 0b1000000000000 sous MicroPython (qui ajoute un 13ième bit).
Nous avons donc les 12 premiers bits à 0 (en rouge) et un 13ième bit à 1 (en bleu).

Mais mon contrôleur PWM, lui, n'a besoin que de 12 bits... c'est donc la partie rouge qui est expédiée... que des zéros!!!
Donc la valeur 12 bits vraiment communiquée au contrôleur est 0 (au lieu de 4095).
Par conséquent, le cycle utile est NULL là où nous espérions un cycle utile de 100%.
Donc tout reste à l'arrêt.

Quel bug pour un simple bit!


Aucun commentaire