MCU - 2 - Principes Généraux Des Microcontrôleurs
MCU - 2 - Principes Généraux Des Microcontrôleurs
MCU - 2 - Principes Généraux Des Microcontrôleurs
L’unité centrale de traitement (CPU) d’un microcontrôleur contient plusieurs parties qui sont cruciales pour
réaliser toutes les instructions possibles, incluant l’unité arithmétique et logique (ALU), les registres, le
compteur ordinal, le décodeur d’instruction, et la mémoire.
Figure 2.2: CPU à architecture von Neumann caractérisée par une mémoire
unique pour le programme et les données.
Le Microcontrôleur ATmega328P
Le microcontrôleur ATmega328P utilise l’architecture Harvard, ce qui signifie que le programme et les
données sont stockées dans des mémoires différentes. Un schéma bloc de la CPU du ATmega328P CPU est
montré dans Figure 2.3. (Noter que presque toutes les interconnexions sont des bus mais elles ne sont pas
symbolisées ainsi pour la clarté).
2.2 Calculateur à Jeu d’Instructions Réduit (Reduced Instruction Set Computing - RISC)
Les ordinateurs des années 1980s commençaient à utiliser toute sorte d’instructions imaginable, qui ne
sont pas toutes utilisées, ce qui conduisit à des codes d’instruction et des CPU très compliqués. A contrario,
les processeurs RISC (Reduced instruction set computing) utilise seulement un nombre limité d’instructions et
ils ont des tailles d’instruction fixes ; la plupart des instructions du ATmega328P sont sur 16 bits (certaines sont
sur 32 bits).
Les processeurs utilisant le RISC sont, généralement, caractérisés par beaucoup de registres, car les
données ne peuvent pas être traitées directement en mémoire (la donnée doit être, en premier, chargées
dans un registre). Les processeurs RISC ont un petit jeu d’instruction, ce qui ne pose pas de problème quant
on utilise un langage de programmation évolué comme le C (mais, peut rendre de codage en assembleur plus
fastidieux). La plupart des instructions RISC peuvent s’exécuter en un cycle d’horloge.
2.3 Instructions Machine
Les instructions constituent la base de tout calcul numérique. Un bout de donnée binaire, appelé une
instruction, contient l’information sur l’opération spécifique à mener. Il y a des instructions arithmétiques
telles que l’addition et la soustraction, les opérations de branchement comme le saut vers une autre partie du
code, les opérations de transfert de données comme le chargement et le copiage d’une donnée d’une place à
une autre dans la mémoire, les instructions sur bit comme l’effacement et le décalage d’une donnée, et les
instructions de contrôle comme la mise en veille ou la remise à zéro (resetting) de la minuterie « chien de
garde » (watchdog timer). En plus de contenir l’information sur l’opération (appelé code opération ou opcode),
l’instruction contient aussi l’information sur quelles données à manipuler (appelée opérande ou opérandes).
Chacune de ces instructions est ensuite analysée de manière matérielle par le décodeur d’instruction, qui
achemine alors les commandes appropriées et les signaux de données vers l’unité arithmétique et logique
(ALU).
En général, pour un ensemble de n différents codes opératoires (opcodes), il doit y avoir un nombre à
log (𝑛) bits pour le stocker. L’ensemble d’instructions des microcontrôleurs AVR 8-bit, qui est utilisé pour
ATmega328P, a approximativement 130 instructions uniques. Donc, log (130) = 8, ce qui signifie que 8 bits
sont nécessaires dans chaque instruction sur 16-bit pour spécifier l’opération à accomplir. Ceci ne laisse que
8 bits pour le(s) opérande(s). Il y a 32 registres à usage général qui peuvent être utilisés pour stocker
temporairement les données et il existe plusieurs instructions qui nécessitent les contenus de deux de ces
registres. Dans ce cas 8 bits ne suffisent pas à adresser proprement ces deux registres (nécessitant chacun 2
bits d’adresse).
Figure 2.3: Schéma bloc de l’UAL du microcontrôleur ATmega328P
Pour surpasser cette limitation, le jeu d’instruction AVR utilise le concept d’instructions de longueur
variable, ou codes « opératoires extensible » ou expanding opcodes. Les instructions ayant des opérandes
multiples ou très longues sont conçues pour avoir des opcodes courts alors que celles ayant moins
d’opérandes ou pas du tout sont conçues avec des opcodes longs. Il existe 32 registres à usage général (GP
registers), et ATmega328P a en plus 32ko de mémoire programme et 2ko de mémoire de données, devant
être adressées. De plus, il existe d’autres registres spéciaux comme le registre d’état et le registre de pile qui
peuvent être affectés par les instructions machine.
Pour mettre en lumière l’usage des opcodes extensibles, considérer les instructions suivantes qui couvrent
toute la gamme de celles ayant un long opcode à celles ayant un court opcode.
• L’instruction CLI est utilisée pour effacer le drapeau d’interruptions globales (GIF) dans le
registre d’état et le registre de contrôle SREG. Puisque cette instruction ne nécessite pas
d’opérandes, tous les 16 bits de l’instruction sont utilisés pour stocker l’opcode.
• L’instruction NEG convertit le contenu d’un registre GP en complément à 2. Puisqu’il y a 32
registres GP, 2 bits sont donc nécessaires pour l’opérande, laissant les 11 bits restants pour
l’opcode.
• La plupart des instructions ont deux registres GP comme opérandes. Par exemple, l’instruction
ADD va additionner les contenus de deux registres GP. Alors, 10 bits sont nécessaires pour
adresser les deux registres, laissant 6 bits pour l’opcode.
• Quelques instructions nécessitent des opérandes très longs. Pour pouvoir adresser proprement
jusqu’à 4 Mo de mémoire, il est nécessaire d’utiliser 22 bits de données pour l’opérande. Pour
cela, une instruction 32 bits est utilisée. Dont 22 bits dédiés pour l’adressage de la mémoire et
les 10 autres bits pour l’opcode.
Alors que l’étalement des opcodes permet une plus grande flexibilité dans les opérandes, il rend aussi plus
difficile le décodage de l’instruction. Ceci est dû aux faites qu’il n’y a plus de position et de longueur fixe pour
chaque opcode dans chaque instruction.
2.4 Décodeur d’instructions
Le décodeur d’instructions traduit une instruction en signaux de commande et d’adressage appropriés.
Cela est accompli en utilisant des portes logiques combinatoires ou une ROM. Par exemple, l’instruction ADD
(sans retenue) nécessite deux registres GP comme opérandes (dont un est désigné comme registre de
destination où sera stocké le résultat). Le décodeur d’instructions va adresser ces deux registres et achemine
leurs contenus à l’additionneur matériel dans l’UAL, puis réachemine la solution vers le registre de destination.
2.2 Unité Arithmétique et Logique (UAL ou ALU)
L’UAL contient tout le matériel nécessaire à la réalisation d’opérations arithmétiques et logique. Alors que
les conceptions de la plupart des UAL sont propriétaires, l’inspection du jeu d’instructions offre une bonne
idée sur type de matériel qui doit être inclus dans l’UAL. Par exemple, l’ALU AVR doit contenir, au moins, un
additionneur, des portes logiques comme AND, OR, XOR, et NOT, et d’autre matériel similaire.
2.6 Les Registres
Les registres sont omniprésents dans la conception du microcontrôleur. Les registres à usage général
(General purpose registers) contiennent des données qu’on peut traiter immédiatement, et permettent de
stocker des données avec un accès facile à l’UAL avant de stocker les résultats en mémoire. Les registres
d’adresse mémoire ou les registres pointeurs dictent au microcontrôleur où regarder dans les données
programme pour trouver la prochaine instruction à exécuter. Le registre d’état (SREG sur ATmega328P) stocke
l’information relative à la plus récente opération qui vient d’être exécuter par le microcontrôleur. Les registres
d’entrées/sorties (E/S) et les registres d’E/S étendus (parfois appelés registres périphériques) stocke
l’information relative à l’opération sur les broches d’E/S et leurs fonctionnalités périphériques. Parmi ceux-ci,
DDRxn, PORTxn, et PINxn. De plus, il y a un registre de pointeur de pile qui est utilisé pour sauvegarder
momentanément les adresses mémoire.
Architectures des Registres
Il y a quatre types d’architectures pour les registres : entrée-série/sortie-série (serial-in/serial-out ou SISO),
entrée-parallèle/sortie-parallèle (parallel-in/parallel-out ou PIPO), et entrée-parallèle/sortie-série (parallel-
in/serial-out ou PISO). Ils sont définis par leur taille, qui dépend du nombre de bascules (flip-flops) qu’ils
contiennent, et ultimement définissent le nombre de bits de donnée qui peuvent y être stockés. La donnée
peut être chargée soit de manière série ou en parallèle. Une opération de décalage peut être ajoutée aux
registres pour accroitre leurs fonctionnalités, au prix d’un supplément d’électronique.
a) Registres à Entrée-Série/Sortie-Série (SISO)
Les registres à entrée-série/sortie-série ou SISO (Serial-in /serial-out) peuvent être utilisés pour la mise en
mémoire tampon de données, le stockage temporaire de données lors des transferts entre leurs sources et
leurs destinations. Une donnée série est envoyée à l’entrée de la première bascule logique, et à chaque cycle
d’horloge, elle est décalée vers les bascules suivantes. Les registres à entrée série prennent plus de temps
pour transmettre la donnée. Enfin, les registres à entrée série nécessite plus de temps que les registres à entée
parallèle pour transmettre une donnée d’un bout à l’autre. Un schéma d’un registre SISO à 4-bit est illustré
dans Figure 2.4.
Modes Description
Standby 𝑊𝐿 = 𝐿𝑂𝑊, mosfets are OFF (open switches)
𝑄 and 𝑄 will not change and are floating
Write WL = HIGH, mosfets are ON (closed switches)
BL and BL are asserted
Q = BL, 𝑄 = 𝐵𝐿
Read 𝑊𝐿 = 𝐻𝐼𝐺𝐻, mosfets are ON (closed switches) read
data from BL and 𝐵𝐿
Table 2.1: Modes de fonctionnement de la SRAM.
b) DRAM
Caractéristiques de la DRAM
C’est un type de mémoire volatile utilisée dans les
• Utilisation d’un transistor et d’un
ordinateurs pour son faible volume et son faible coût. Un
condensateur ;
schéma d’une mémoire DRAM est donné dans Figure 2.10, • Plus lente que la SRAM
avec les modes de fonctionnement décrits dans Tableau • Moins chère que la SRAM
2.2. Si le condensateur n’est pas rafraîchi en continu, il se • Moins encombrante que la SRAM
déchargera et la mémoire sera perdue. • Consomme moins d’énergie que la SRAM
• Nécessite un rafraîchissement permanant.
Modes Description
Write WL = HIGH, mosfets are ON (closed switches)
BL is asserted, must wait for cap to charge or discharge
Read WL = HIGH, mosfets are ON (closed switches) charge
stored on cap goes to BL value must be re-written after
every read
Tableau 2.2: Modes de fonctionnement d’une mémoire DRAM.
Un sous ensemble de mémoire DRAM appelée RAM pseudo-statique (PSRAM) utilise des cellules similaires à
celles de la DRAM, mais inclut une circuiterie permettant un autorafraîchissement, ce qui signifie un usage
simplifié comme une SRAM.
Mémoire Non-Volatile
La mémoire non-volatile est utilisée pour un stockage plus permanant car les données persistent même après
la mise hors tension. Au fil des années, la mémoire non-volatile a pris différentes formes : cartes perforées ;
cylindres de cire ; disques optiques (CD et DVD) ; disques magnétiques ; bandes magnétiques ; et mémoires à
semiconducteurs. Puisque la mémoire non-volatile ne nécessite pas d’alimentation électrique pour maintenir
les données stockées, elle est utilisée pour stocker le micrologiciel (firmware) sur les ordinateurs, et les
instructions de programme et les constantes dans les microcontrôleurs. Elle est souvent appelée mémoire à
lecture seule (read-only memory - ROM), du fait que durant le fonctionnement normal, elle est effectivement
à lecture seule. Ecrire dans une ROM nécessite une tension plus élevée que ce qui est nécessaire pour
l’opération de lecture.
Les premiers types de ROM incluent les ROM à masque, qui étaient fabriquées, sous forme de masques
semiconducteurs, dans une chambre blanche à la manière des circuits intégrés. Cela signifie que tous les bits
mémoire sont câblés physiquement sur la puce et ne peuvent plus être altérés (effacés ou réécrits). Les ROM
à maque sont par conséquent inadaptées pour de petits projets qui nécessiteraient un éventuel débogage ou
pour les systèmes embarqués qui nécessiteraient une mise à jour du firmware ou toute autre modification du
contenu mémoire.
a) EPROM
C’est une mémoire ROM programmable électriquement. Ce genre de circuits contient généralement une
fenêtre en quartz au-dessus de la micropuce ; une exposition à la lumière UV pendant une longue durée de
temps efface la mémoire et positionne tous ces bits à 1. Un programmateur externe est utilisé pour
programmer toutes les données désirées sur la mémoire. L’EPROM a l’avantage d’être réinscriptible, mais
souffre de la nécessité de son extraction physique du circuit pour son effacement et sa reprogrammation. De
plus, la fenêtre en quartz est chère à fabriquer et les circuits EPROM peuvent être plus chers que d’autres
types de mémoire. Cependant, elles constituaient une amélioration par rapport aux circuits à programmation
unique (one-time-programmable - PROM), qui comme leur nom l’indique, ne peuvent être programmés
qu’une seule fois et ne peuvent plus être ni effacés ni reprogrammés.
b) Mémoire Flash
Cette mémoire est utilisée comme mémoire programme dans le
microcontrôleur ATmega328P. elle utilise des transistors à grille flottante,
comme ce celui montré dans Figure 2.11 à architecture "NOR". La broche CG
(control gate) signifie la « grille de commande », et c’est où les signaux de
commande sont appliqués. La broche FG (floating gate) signifie la « grille
flottante », et c’est par là où des électrons sont injectés ou retirés pour stocker
la donnée. La broche S est la source, qui est généralement la connexion au
potentiel bas (la masse) du transistor. La broche D est le drain, qui est
généralement la connexion au potentiel haut du transistor.
Figure 2.11: Schéma d’une
cellule à grille flottante.
Les modes de fonctionnement d’une cellule à grille-flottante sont décrits dans Tableau 2.3.
Mode Description
La mémoire Flash est une sous-catégorie des mémoires effaçable et programmable électriquement ou
EEPROM (Electrically Erasable Programmable ROM). De nos jours, il y a une légère différence entre les
architectures EEPROM et Flash. Cependant, le ATmega328P contient à la fois une mémoire EEPROM et une
mémoire Flash comme espace de stockage non-volatile. La mémoire Flash est là où résident les données
programme et le bootloader optionnel. L’EEPROM sur ATmega328P est utilisée pour le stockage de données
réinscriptibles mais qui ne changent pas fréquemment, comme les mots de passe ou les constantes physiques
et mathématique. Un bit fusible sur le ATmega328P peut être configuré pour prévenir la perte des données
inscrites en EEPROM durant l’effacement du microcontrôleur, ce qui offre une propriété supplémentaire pour
le microcontrôleur.
2.9 Processus & Timing d’exécution d’une Instruction
C’est le processus par lequel le microcontrôleur exécute chaque instruction. De cette façon, la CPU n’est autre
qu’une machine d’états finis compliquée. Le diagramme d’état est donné dans Figure 2.12.
Etape 1. La prochaine instruction, indiquée par l’adresse stockée dans le compteur de programme (PC),
est lue à partir de la mémoire ;
Etape 2. L’instruction est traduite (décodée) en un ensemble de commandes ou de signaux pour chaque
composante du microprocesseur ;
Etape 3. Le compteur programme s’incrémente pour pointer sur la prochaine case mémoire ;
Etape 4. Les données sont chargées à partir de la mémoire (ou des périphériques d’entrée/sortie) dans
le(s) registre(s), leurs emplacements sont toujours inscrits dans le code instruction comme des
opérandes ;
Etape 5. Si l’UAL est nécessaire pour exécuter une opération, le processeur instruit le matériel pour la
réaliser ;
Etape 6. Le résultat est réécrit dans un emplacement mémoire, un registre, ou même sur périphérique ;
Etape 7. Saut arrière vers l’étape 1.
Le microcontrôleur ATmega328P utilise le concept du pipelining pour accélérer le traitement par la CPU. Cela
est permis par son architecture Harvard, qui permet à la CPU de chercher (fetch) la prochaine instruction à
partir de la mémoire pendant l’exécution de l’instruction courante. Ceci est appelé recherche (fetch)
instruction parallèle comme décrit dans Figure 2.13.