La leçon
4.1 La logique
RAS 1 de 12 du domaine 4 · Numérique et microcontrôleurs
Binaire, hexadécimal, portes, tables de vérité.
Comprendre
Le capteur de température du pack répond par deux octets sur le bus I²C : 0xFF puis 0x80. Lus d’une façon, c’est −0,5 °C, le pack dehors en novembre. Lus d’une autre, c’est 255,5 °C. Les bits sont les mêmes ; ce qui change, c’est la convention qu’on leur applique, et le capteur ne la transmet pas.
La plus vieille convention est le binaire. Leibniz publie en 1703 son « Explication de l’arithmétique binaire », qui compte avec les seuls caractères 0 et 1. Il n’a aucune machine en vue ; il y reconnaît, par les lettres du jésuite Bouvet, les hexagrammes du Yi Jing. En 1854, George Boole publie Les Lois de la pensée, une algèbre où les variables ne valent que 0 ou 1 ; Jevons, dix ans plus tard, lui donne la règle qui nous sert, x + x = x, le « ou » de deux vérités est une vérité. Peirce voit dès 1886 qu’un circuit électrique pourrait la calculer. Personne ne le fait pendant cinquante ans.
Puis un étudiant de maîtrise, Claude Shannon, au MIT en 1937, et Nakashima au Japon et Shestakov en URSS chacun de leur côté, remarquent que les relais d’un central téléphonique obéissent à cette algèbre : deux contacts en série font un ET, deux en parallèle font un OU, un contact au repos fait un NON. Les portes du RAS sont ces contacts, gravés dans le silicium.
Bien des ordinateurs des années 1950 ont des mots de 36 bits, qui se coupent par trois, d’où l’octal. En 1964, IBM annonce le System/360 et fixe l’adresse à l’octet de huit bits. Huit ne se coupe pas par trois ; il se coupe en deux quartets, et chaque quartet s’écrit d’un seul chiffre, de 0 à F. L’hexadécimal est le raccourci du binaire par paquets de quatre : 0xFF, deux quartets pleins, 255.
Un compteur kilométrique qui recule passe de 000000 à 999999 ; un octet qui recule de zéro affiche 0xFF. C’est le complément à deux, que von Neumann propose en 1945 : le bit de poids fort, à gauche, pèse −128 au lieu de +128. Alors 0xFF vaut 255 lu sans signe et −1 lu avec ; 0x80 vaut 128 ou −128. Sur 12 bits signés, le compte va de −2048 à 2047. Le TMP102 livre sa température sur 12 bits signés, 0,0625 °C par pas : −0,5 °C, c’est −8 pas, 0xFF8, calé à gauche dans deux octets, 0xFF 0x80. Lus sans signe, 4088 pas, 255,5 °C.
Deux autres conventions vivent dans les mêmes huit bits. Le BCD, où chaque quartet est un chiffre décimal : le registre des secondes d’une horloge DS3231 dit 0x59 pour 59 secondes, parce que l’afficheur lit en décimal ; en binaire, 0x59 ferait 89. L’ASCII, normalisé en 1963, où 0x41 est la lettre A et 0x30 le caractère « 0 », qui n’est pas zéro. Trois lectures de 0x59 : 89, 59, ou la lettre Y.
Dans le code, on touche les bits un à un avec un masque. PORTB |= (1 << 3) met le bit 3 à 1 et laisse les sept autres ; PORTB &= ~(1 << 3) l’efface, les sept autres intacts ; (x >> 4) & 0x0F descend le quartet haut, les bits 7 à 4, à la place des bits 3 à 0, et coupe le reste. Un masque dit quels bits il touche ; il suffit de l’écrire en binaire.
L’erreur classique a deux visages. Le signe lu de travers : −0,5 °C devient 255,5 °C. Et les deux octets dans le mauvais ordre : le TMP102 envoie l’octet de poids fort d’abord, un BMS qui parle SMBus envoie le faible d’abord, et un pack à 25 °C, 0x19 0x00, lu à l’envers donne 0x0019, soit 0,06 °C. Danny Cohen a nommé cette querelle en 1980, les gros-boutiens et les petits-boutiens, d’après la guerre de l’œuf chez Swift.
Ce que la source n’a pas
Les masques dans du code. Kuphaldt écrit pour des portes en boîtier ; sur une puce nue, les portes sont dans les instructions, et |=, &= ~ et >> touchent un registre sans déranger ses voisins.
Les registres de capteurs sur I²C. Le TMP102 sur 12 bits signés, le LM75 de Texas Instruments sur 9 bits par pas de 0,5 °C (celui de NXP en a 11), l’horloge en BCD, le BMS qui livre la tension du pack en millivolts sur deux octets : chacun a sa convention, et seule la fiche la dit.
L’ordre des octets. Rien chez Kuphaldt ; c’est la première chose à vérifier quand deux octets font un nombre.
Voir
À venir : la roue des 256 valeurs d’un octet, de 0x00 à 0xFF, avec deux graduations côte à côte, sans signe de 0 à 255 et en complément à deux de −128 à 127, et le cran où le compteur recule de zéro à 0xFF. Dessous, un même octet, 0x59, lu trois fois : binaire, BCD, ASCII.
Les cibles
- Convertir et lire une adresse. Seize conversions sans faute entre décimal, binaire et hexadécimal, et l’adresse du registre de configuration d’un TMP102,
0x01, et celle de la puce sur le bus,0x48, dans les trois bases. - Les portes et le XOR. Les six tables de vérité de mémoire, puis un OU exclusif monté avec quatre NON-ET d’un 74HC00 et vérifié ligne par ligne.
- Le masque. Trois lignes de code données ; pour chacune, le masque écrit en binaire et les bits qu’il met, efface ou lit.
- Le bit de poids fort. Pourquoi il pèse −128 dans un entier signé sur 8 bits ;
0x80et0xFFlus des deux façons. - Trois conventions, trois octets. Une température de TMP102 en complément à deux, les secondes d’un DS3231 en BCD, un caractère reçu sur l’UART en ASCII, à la main, puis au programme.
- Diagnostic. Un capteur qui renvoie 255,5 °C ou 0,06 °C : les deux hypothèses, le signe et l’ordre des octets, et la relecture qui tranche.
Les idées fausses
« Le binaire est une autre sorte de nombre. »
Kuphaldt, chapitre 2 : un nombre est un nombre, quelle que soit sa graphie.0xFF, 255 et11111111sont le même nombre. Ce qui change la valeur, c’est la lecture signée ou non, pas la base.« Le bit de signe est un drapeau ; on l’enlève et on lit le reste. »
C’est la notation signe et grandeur, que les processeurs n’emploient pas. En complément à deux, le bit de gauche a un poids, −128, qui s’additionne aux autres :0xFFfait −128 + 127 = −1, pas −127.« Un dépassement se voit. »
127 + 1 fait −128 dans un octet signé, sans erreur ni message ; le compteur fait le tour en silence. Kuphaldt le montre dans « Overflow ».
Le mot
Bit
Le mot est de John Tukey, statisticien aux Bell Labs, dans une note du 9 janvier 1947 : il contracte binary digit, « chiffre binaire », et le mot anglais veut aussi dire « petit morceau ». Claude Shannon le fait imprimer en 1948, dans « A Mathematical Theory of Communication », en créditant Tukey. Le français a proposé « élément binaire » ; l’usage a gardé bit. En anglais, bit, le même mot.
Lire
Kuphaldt, Lessons in Electric Circuits, volume IV (Digital), chapitre 1 : Numeration systems, « Decimal versus binary numeration » et « Octal and hexadecimal numeration », pourquoi l’hexadécimal a gagné sur l’octal. Chapitre 2 : Binary arithmetic, « Negative binary numbers », « Overflow », et « Bit groupings » pour le quartet, le nibble. Chapitre 3 : Logic gates, « The NAND gate », « The Exclusive-OR gate » et « Gate universality ». Chapitre 7 : Boolean algebra, « Introduction », qui raconte Boole et Shannon, et « Boolean arithmetic », où 1 + 1 = 1. Il date le mémoire de Shannon de 1938, sa publication ; il a été écrit en 1937.
Passerelles
- Histoire
- Leibniz en 1703, Boole en 1854, Shannon en 1937 : trois idées sans machine, puis une machine qui les prend toutes, Claude Shannon.
- Mathématiques
- Une base est un choix d’écriture ; le binaire est la plus courte en symboles et la plus longue en chiffres, Système binaire.
- Philosophie
- Boole voulait écrire les lois de l’esprit comme des équations ; ce qu’il a écrit est devenu le plan des circuits, Les Lois de la pensée.
- Littérature
- Les gros-boutiens et les petits-boutiens de Lilliput se battaient pour un œuf ; les nôtres, pour l’ordre de deux octets, Boutisme.
Ce que ça débloque
Et ensuite ?
- 4.2 Les circuits logiques : la bascule garde un bit d’un coup d’horloge au suivant, et le compteur en fait des nombres.
- 4.3 Les interfaces : comment les octets du TMP102 voyagent sur I²C, et pourquoi le bus veut des résistances de rappel.
- 1.2 Les grandeurs : les préfixes par mille ; ici le kilo vaut 1 024, et c’est la seule fois.
- Une question à écrire, « Le capteur qui lit 255,5 °C » : deux octets, deux hypothèses, une relecture.