Plus facile à lire avec un fond crème, une teinte, plus de contraste ou un texte plus grand ? Choisissez vos couleurs et votre texte, une fois pour toutes les pages.

Leçon gratuite

Lire et modifier les bits d’un registre

Après cette leçon: Je peux lire un registre en binaire et dire ce que fait la mise à 1, l’effacement ou la bascule d’un bit.

Leçon de 55 min2 commandesLab de systèmes embarqués : registres, broches, PWM et interruptions sur une puce simulée

Un registre commande le matériel

Un registre est une petite case de mémoire de la puce, large de 8 bits, que le programme lit et écrit pour commander le matériel. Changer un seul de ses bits sans toucher aux sept autres est le geste de base de tout système embarqué.

Dans un lave-linge, un registre dit quelle lampe est allumée, un autre si la porte est fermée. Aucun écran, aucun clavier : seulement des nombres que l’on lit et que l’on écrit.

À la fin de cette leçon

Remarque

Je peux lire un registre en binaire et dire ce que fait la mise à 1, l’effacement ou la bascule d’un bit.

Mots-clés

MotCe que ça veut direExemple
Registreune petite case de mémoire dans la puce, ici de 8 bits
Bitun chiffre binaire, 0 ou 11
Masqueun nombre qui choisit les bits à changer0b00000100
Mettre à 1forcer un bit à 1 sans toucher aux autres
Effacerforcer un bit à 0 sans toucher aux autres
Basculerpasser un bit de 0 à 1, ou de 1 à 0

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Chaque bit d’un registre a son sens

Un registre de 8 bits contient un nombre de 0 à 255. On l’écrit en binaire, car chaque bit commande une chose précise : une broche, un voyant, un mode.

Les bits se numérotent de la droite vers la gauche, du bit 0 au bit 7. Attention : cette puce est un simulateur d’une puce inventée. Une vraie puce a d’autres registres, d’autres noms et beaucoup plus de règles. Seules les idées sont communes.

Exemple : un registre lu bit par bit

Bit76543210
Valeur du registre PORT00001010
Poids du bit1286432168421
Bit à 1 ?nonnonnonnonouinonouinon

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Les scripts du labo parlent anglais

Le labo contient un seul conteneur, jupyter, avec la puce simulée dans mcu.py. Le terminal atteint son Python avec docker exec jupyter, qui lance une commande à l’intérieur.

Les scripts du dossier steps affichent des mots anglais, comme registers after reset. Les nombres et les colonnes se lisent pareil : le nom du registre, le nombre en binaire, en hexadécimal, puis en décimal.

Afficher les sept registres

Commande
docker exec jupyter python3 steps/registers.py

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Un masque change un seul bit

Écrire un nombre dans un registre remplace les 8 bits d’un coup. Pour en changer un seul, on lit le registre, on applique un masque, puis on réécrit.

Le masque du bit 2 vaut 1 << 2, soit 0b00000100. Un OU (|) met à 1. Un ET avec le contraire du masque (& ~) efface. Un OU exclusif (^) bascule.

Exemple : trois opérations sur PORT

OpérationÉcritureAvantAprès
Mettre le bit 0 à 1port | (1 << 0)0b000010100b00001011
Effacer le bit 1port & ~(1 << 1)0b000010110b00001001
Basculer le bit 3port ^ (1 << 3)0b000010010b00000001
Basculer le bit 3 encoreport ^ (1 << 3)0b000000010b00001001

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Changer des bits de PORT

Commande
docker exec jupyter python3 steps/bits.py

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Essayer les masques en Python

Code: python
# Un registre de 8 bits, ici un volet roulant : le bit 0 monte, le bit 1 descend.
port = 0b00001010
port = port | (1 << 0)      # mettre le bit 0 à 1
print("après mise à 1 :", format(port, "08b"))
port = port & ~(1 << 1)     # effacer le bit 1
print("après effacement :", format(port, "08b"))
port = port ^ (1 << 3)      # basculer le bit 3
print("après bascule :", format(port, "08b"))
# Changez le numéro du bit dans la première ligne, puis relancez.

Une erreur fréquente

Attention

On croit souvent qu’écrire 1 dans un registre ne change que le bit 0. En réalité on remplace l’octet entier : les sept autres bits passent à 0. Pour changer un seul bit, lisez le registre, appliquez un masque, puis réécrivez le résultat.

Lire un bit ou quelques bits

Pour lire le bit n, on décale le registre de n places vers la droite et on garde le dernier bit : (valeur >> n) & 1. On obtient 0 ou 1.

Pour garder les quatre bits de droite, on utilise un ET avec 0b00001111, écrit aussi 0x0F. Les autres bits tombent à 0.

À propos de ce labo et de sa source: Lab de systèmes embarqués : registres, broches, PWM et interruptions sur une puce simulée

Vous enseignez à une classe ? Proposez ce module à vos étudiants avec un guide de l'enseignant, des devoirs corrigés et un laboratoire pour chaque étudiant.