Vous êtes sur la page 1sur 10

Partie II

Introduction aux Microcontrôleurs &


à la Conception Systèmes Embarqués
Pour comprendre les microcontrôleurs, on doit comprendre les calculateurs en premier. C’est quoi un
calculateur ou ordinateur ? Ces dispositifs omniprésents peuvent être très familiers, mais pour comprendre
leur conception de manière plus analytique, leurs composantes doivent être comprises. Un schéma bloc,
montré dans Figure 1.1, détaille les composantes d’un calculateur.

Figure 1.1 : Schéma bloc d’un calculateur, consistant en une mémoire, une unité
centrale de traitement (CPU) des entrées et des sorties.

1.1 Composition d’un Calculateur


Comme illustré dans le schéma block Figure 1.1, un calculateur (ordinateur) est principalement composé
de : une mémoire ; une Unité de Commande (CU) ; une Unité Arithmétique et Logique (ALU) ; des entrées ;
des sorties ; et des bus de lignes. Chacune de ces composantes sera expliquée brièvement dans le présent
chapitre et leurs détails seront fournis dans le Chapitre 5.

Mémoire du Calculateur
La mémoire du calculateur contient toutes les informations nécessaires au démarrage (boot) de ce dernier,
à l’exécution de programmes, et à l’accès aux données. Les instructions qui dictent au calculateur la manière
de démarrer (booter) forment ce qui est appelé « Firmware ». Comme on le verra plus tard, celle-ci est assez
différente en termes d’organisation de la mémoire du microcontrôleur. Cependant, la mémoire joue un rôle
important dans la sauvegarde des instructions de programme et des données variables.
Unité de Commande (Control Unit)
L’Unité de Commande-UC (CU) lit et interprète les instructions du programme. Elle envoi aussi des signaux
de commande à travers le bus de commande (control bus). Ces signaux instruisent le calculateur de lire ou
d’écrire en mémoire, contrôlent le timing du transfert de données, et autrement dit instruit le processeur du
calculateur à suivre les étapes nécessaires dans les timings nécessaires pour exécuter le programme. L’UC
utilise ce qui est appelé un compteur de programme (CP) (voir chapitre 2) pour garder une trace de
l’instruction actuelle, et une partie spéciale de la mémoire appelée registre d’état (RE) (voir chapitre 2) pour
garder une trace de l’instruction exécutée la plus récente.
Unité Arithmétique et Logique (Arithmetic and Logic Unit ou ALU)
Comme le suggère le nom, l’UAL (ALU) est capable de réaliser plusieurs opérations arithmétique (addition,
soustraction, multiplication) et des fonctions logiques (ET, OU, OU Exclusif) . Les fonctions disponibles dans
l’UAL dictent les types d’instructions possibles à être exécuté sur le calculateur. L’UAL et UC forment l’Unité
Centrale de Traitement – UCT (CPU) du calculateur.
Dispositifs d’Entrée/Sortie-E/S (Input and Output -I/O Devices)
Les ordinateurs utilisent un nombre important de dispositifs d’E/S. Les dispositifs d’entrée recueillent des
informations à partir du monde extérieur pour aider l’ordinateur à prendre des décisions quant aux processus
à effectuer. Les entrées usuelles de l’ordinateur incluent : le clavier ; la sourie ; l’écran tactile ; le microphone ;
les interrupteurs ; et les détecteurs de lumière. Les dispositifs de sortie permettent à l’ordinateur d’afficher
des informations à destination des humains. Les sorties usuelles des ordinateurs sont par exemple : l’écran
d’affichage ; les haut-parleurs ; le retour haptique ; les LEDs ; les afficheurs ; et les buzzers.
Lignes de bus (Bus Lines)
Les lignes de bus sont des interconnexions entre composants. Les lignes de bus sont simplement des
connexions de fils multiple « normaux ». Dans ce document, les bus sont représentés par des traits épais ou
flèches épaisses. Cependant, ils peuvent être représentés par des trait simples avec barre oblique (slash) et un
nombre indiquant le nombre de bits. Ces deux possibilités sont illustrées en Figure 1.2.

Figure 1.2 : Deux représentations possible pour un bus.

Plusieurs « micro »-appareils existent aujourd’hui: microcalculateurs, microcontrôleurs, and


microprocesseurs. Comprendre cette hiérarchie illustrée dans Figure 1.3, va situer le contexte des
microcontrôleurs sur lesquels on se focalisera exclusivement.

Microcalculateur

Microcontrôleur

Microprocesseur

Figure 1.3: Hiérarchie des "micro" -appareils (Les microcalculateurs sont


des microcontrôleurs, qui à leur tour sont des
microprocesseurs).
1.2 Microprocesseur
Un microprocesseur est un unique circuit intégré (IC), généralement constitué de juste une CPU. Si vous
avez déjà construit un ordinateur, c’est le composant que vous achèteriez de chez AMD ou Intel, pour le placer
sur la carte mère. Une pâte thermique est appliquée au-dessus pour le relier thermiquement au dissipateur
thermique, permettant de dissiper la chaleur loin de l’électronique sensible à l’intérieur du processeur. Il existe
des microprocesseurs moins puissants et moins chers destinés pour des tâches assez peu intenses
contrairement à celles des ordinateurs à usage général.
Avantages des microprocesseurs

• Petit ;
• Peu couteux ;
• Personnalisable et versatile : l’utilisateur peut décider des types et des nombres de périphériques à
inclure.
Inconvénients des microprocesseurs

• Pas de mémoire en puce ;


• Pas de fonctions périphériques incluses ;
• Ne peu pas être utilisé directement avec les dispositifs d’E/S.
4.3 Microcontrôleur
Un microcontrôleur est un microprocesseur qui inclut de la mémoire et des fonctionnalités d’E/S. Les
microcontrôleurs sont utilisés dans les systèmes embarqués, et sont omniprésents dans le monde
technologique actuel. Cinq des plus importants microcontrôleurs 8-bit sont décrits dans le Tableau 4.1.
Vendeur Microcontrôleur(s)
Freescale Semiconductor 68HC08/68HC11
Intel 8051
Zilog Z8
Microchip AVR* PIC

Tableau 1.1 : Cinq des plus importants microcontrôleurs 8-bits.

Chacun des microcontrôleurs énumérés dans Tableau 4.1 a un jeu d’instruction (ensemble d’instructions)
qui lui est spécifique, son propre ensemble de périphériques et broches d’E/S. Ils ne sont pas généralement
interchangeables.
*Note : Atmel, le fabriquant original des microcontrôleurs AVR, a été racheté par Microchip en 2016.
Beaucoup de manuels et datasheets AVR contiennent encore le logo Atmel.
1.4 Systèmes embarqués (Embedded Systems)
Alors qu’un PC ou un laptop est une machine à usage général (utilisés pour les jeux, Internet, la musique,
le traitement de texte, etc.), les systèmes embarqués font référence à des composants mono-fonction. Il en
existe plusieurs d’exemples dans le monde qui nous entoure, mais en règle générale, un système embarqué
est capable d’effectuer des calculs sans utiliser un système d’exploitation (comme Windows, Linux, macOS,
iOS, etc.). Les systèmes embarqués peuvent être trouvés dans les montres, les lecteurs MP3, les distributeurs
automatiques de billets, et plus. Dans ces exemples, un ordinateur complet serait préjudiciable pour le
fonctionnement de ces équipements. Imaginez devoir rebooter Windows pour faire fonctionner une machine
à laver !
1.5 Choix d’un Microcontrôleur
Comment choisir un microcontrôleur pour un projet de système embarqué ? Il doit avant tout répondre à
toutes les exigences du projet et doit inclure des périphériques et accessoires rendant relativement simple le
développement de produits autour du microcontrôleur. De plus, il est important de s’assurer de la disponibilité
actuelle et futur du microcontrôleur.
Exigences du Project
• Vitesse ;
• Boîtier (DIP, SMD, etc.)
• Consommation d’énergie ;
• Mémoire ;
• Périphériques (timers, ADC, etc.)
• Nombre de broches d’E/S
• Facilité de mise à jour ;
• Coût.
Accessoires additifs
• Un assembleur disponible ;
• Un debugger ;
• Un compilateur pour les langages de programmation de haut-niveau
comme le C ;
• Un soutien technique.

Tableau 1.2 : Exigences du projet accessoires additifs à considérer lors du choix


d’un microcontrôleur.

1.6 Microcontrôleur Atmel AVR & Arduino


Le microcontrôleur qui sera utilisé dans ce cours est le AVR ATmega328P. Il est intégré dans une carte
Arduino Uno qui contient des fonctionnalité supplémentaires (mais non pas limitées) : régulateur de tension ;
bootloader ; connexion USB ; broches d’E/S ; et disponibilité d’un environnement de développement intégré
(Arduino IDE) pour des codes en langage C. Arduino est un microcontrôleur relativement peu coûteux. Vers
la fin de ce cours, vous aurez toute l’information dont vous aurez besoin pour développer votre propre système
embarqué et des « projets intelligents ».
La datasheet du ATmega328P (Disponible sur site internet de Microchip) est le seul et important document
utile pour comprendre tout ce qui doit être su au sujet du microcontrôleur. A première vue, il paraît
volumineux et difficile à comprendre. Il ne faut pas être intimidé. A chaque fois qu’on s’y réfère on comprend
un peu plus. Ce document doit accompagner le concepteur pour parfaire ces connaissances. Au moins, être
confortable avec les principales caractéristiques et fonctionnalités du ATmega328P dont certaines sont
reprises dans Tableau 1.3.

High Performance, Low Power


Atmel AVR 8-Bit Microcontroller Family
Advanced RISC Architecture
131 Powerful Instructions
32 × 8 General Purpose Working Registers
Up to 20 MIPS Throughput at 20MHz

High Endurance Non-volatile Memory Segments


32KBytes Flash program memory
1KBytes EEPROM
2KBytes Internal SRAM
Write/Erase Cycles: 10,000 Flash/100,000 EEPROM
Data retention: 20 years at 85◦C/100 years at 25◦C
Peripheral Features
Two 8-bit Timer / Counters
One 16-bit Timer / Counter
Six PWM Channels
6-channel 10-bit ADC in PDIP Package
Programmable Serial USART
Primary/Secondary SPI Serial Interface
Byte-oriented 2-wire Serial Interface (Philips I2C compatible)
Programmable Watchdog Timer with Separate On-chip
Oscillator
On-chip Analog Comparator
Interrupt and Wake-up on Pin Change
Special Microcontroller Features
Power-on Reset and Programmable Brown-out Detection
Internal Calibrated Oscillator
External and Internal Interrupt Sources
Six Sleep Modes
Power Consumption at 1MHz, 1.8V, 25◦C
Active Mode: 0.2mA
Power-down Mode: 0.1μA
Power-save Mode: 0.75μA (Including 32kHz RTC)

Table 1.3 : Principales caractéristiques du ATmega328P.

1.7 Programmation des systèmes Embarqués


Les ordinateurs et les microcontrôleurs sont inutiles sans les instructions de fonctionnement, qui sont
écrites en divers langages de programmation. Il existe une hiérarchie de types de langage, du langage machine
aux langages évolués comme le C. Celle-ci est illustrée dans Figure 1.4.

Figure 1.4: Hiérarchie de types de langage et leur rapport à


l’efficacité ainsi qu’à la simplicité.

Langage Machine
Le langage machine est l’ensemble d’instruction du microprocesseur converti en binaire. Par exemple,
l’instruction 0001 1101 0100 1111 sur ATmega328P additionne des nombres contenus dans deux registres (15
et 20). Ce code est ensuite acheminé matériellement (les intestins logiques du microprocesseur) à travers le
décodeur d’instruction pour former les commandes appropriées, les adresses, et les signaux de données à
l’électronique associée pour effectuer la tâche désirée. Le langage machine peut être très fastidieux à écrire
et difficile à débugger. Habituellement, il est accompli en utilisant des cartes perforées et des bandes
magnétiques.
Langage Assembleur
Le langage assembleur utilise des codes mnémoniques pour désigner chaque instruction plutôt que son
code binaire l’instruction machine ci-dessus serait réécrite comme ADD 15,20. L’assembleur est converti en
code machine par un programme appelé « assembleur ». Les familles de microprocesseurs et
microcontrôleurs ont des instructions spécifiques qu’ils sont capables d’exécuter. Pour cette raison, le code
assembleur ne peut pas être copié d’un microcontrôleur AVR et collé dans un microprocesseur Intel, par
exemple. Le ATmega328P, étant un microcontrôleur AVR, utilise le jeu d’instructions AVR. En étant familiarisé
avec les instructions permises sur un microcontrôleur signifie que le code pourra être écrit plus efficacement
et de manière compacte ; généralement, le code assembleur utilise moins de mémoire et prend moins de
temps à s’exécuter comparé à un code écrit en langage évolué.
Langage de Programmation de Haut-niveau (évolué)
Langage de Programmation de Haut-niveau utilise des fonctions pour faire ce que l’assembleur et le
langage machine font. L’addition peut être réalisée en utilisant des symboles arithmétiques comme : f = 152
+ 38 ; Le code en langage de haut-niveau est converti en assembleur puis en langage machine à l’aide d’un
compilateur. Comme exemple de langage évolués, on peut citer C, C++, Python et Visual Basic.
L’utilisation des langages évolués signifie que plus de temps sera passé à travailler sur les algorithmes plutôt
que sur les spécificités des instructions assembleur à utiliser. L’initialisation survient sans pour autant la faire ;
la pile, le pointeur de pile, les adresses mémoires, … sont tous alloués automatiquement par le compilateur.
De plus, les programmes de haut-niveau dans un même langage peuvent plus ou moins être recyclés d’un
microcontrôleur à un autre (sous réserve que tous les registres n’ont pas les mêmes noms, certaines fonctions
peuvent être quelque peu différentes, etc.).
1.8 Les Compilateurs
Les compilateurs assurent que le langage de programmation de haut-niveau est correct, à la fois en syntaxe
et en allocation mémoire. Des erreurs et des avertissements sont toujours affichés dans ces cas, et les codes
avec erreurs ne sont pas charger dans le microcontrôleur. Une fois le code est correct, le compilateur le
converti en langage assembleur, à partir duquel il génère un fichier HEX qui contient tout le code machine à
transférer dans la mémoire programme du microcontrôleur.
1.9 Conception de Programme pour Système Embarqué (SE) vs Ordinateur
La conception pour systèmes embarqués (ES) est très différente de l’écriture de programmes d’application
pour un (PC de bureau, laptop, et mobile). Les premiers sont très dépendants des ressources, spécialement
de mémoire disponible sur chaque type de composant. Ces différences sont données dans Tableau 1.4.
Système Embarqué Ordinateur

Lieu de stockage du programme ROM RAM

Capacité de la RAM 2 kB (ATmega328P) Quasi illimitée

Capacité de la ROM 32 kB (ATmega328P) Quasi illimitée

Utilisation de périphériques (ADC, Fréquent Rare


horloge, etc)
Utilisation du Code Assembleur Fréquent Rare

Tableau 1.4: Différences en matière de programmation et de ressources entre les


Système Embarqués et les ordinateurs.

Mémoire de l’ordinateur
Les ordinateurs de bureau et les laptops ont une mémoire quasi illimitée et de tout type. La mémoire flash
intégrée est utilisée pour stocker des informations qui ne changent pas et qui contiennent des instructions de
démarrage de l’ordinateur. Celles-ci forment le fameux BIOS (basic I/O system).
La mémoire à accès aléatoire (Random Access Memory - RAM), bien que ce nom soit quelque peu
inapproprié, les données du programme pendant son exécution. Par exemple, ouvrir un fichier PDF charge le
programme de lecture Adobe entière dans la RAM d’où il va s’exécuter. Ceci est dû à la disponibilité de
plusieurs giga-octets de RAM sur la plupart des ordinateurs, et au fait que la RAM à tendance à être plus rapide
que n’importe quel autre type de mémoire d’ordinateur.
La mémoire à lecture seule (Read-Only Memory - ROM), se présentant historiquement sous forme de
disques durs magnétiques, et usurpés de nos jours par la mémoire à état solide (solid-state memory), contient
les programmes exécutables et les fichiers de données non variables.
Mémoire des Systèmes Embarqués
Les systèmes embarqués ont beaucoup moins de capacité mémoire et d’options. La mémoire Flash est non
volatile et stocke les instructions du programme et les données prédéfinies (constants). La RAM est une
mémoire volatile contenant les données variables. Puisque la RAM est une ressource limitée, il est nécessaire
de se soucier de contraintes de taille lors d’écriture de programmes. Par exemple, un tableau de 500 valeurs
en virgule flottante nécessite plus de RAM qu’un microcontrôleur ATmega328P ne puisse tolérer.
Utilisation des Fonctionnalité dans la Puce (On-Chip Features)
Avec les systèmes embarqués, plusieurs fonctionnalités périphériques sont utilisées pour l’interfaçage avec
les dispositifs d’Entrée/Sortie, ce qui n’existe pas sur un PC. La configuration de chacune de ces fonctionnalités
périphériques nécessite la connaissance parfaite de chacun de leurs registres de contrôle.
Fonctionnalités périphériques du ATmega328P

• Des convertisseurs Analogiques numériques (ADC) ;


• Des interruptions externes ;
• Des minuteries (Timers) 8 et 16 bits ;
• Une minuterie « chien de garde » (Watchdog Timer)
• Des communications série : USART, SPI, et TWI (I2C).
Utilisation du Code Assembleur
Le code assembleur est fréquemment, mais pas toujours, utilisé pour programmer un microcontrôleur. Le
code assembleur utilise moins de mémoire que son équivalent en langage C, et a tendance à être plus efficace.
De plus, l’utilisation de l’assembleur mène à une grande connaissance du microcontrôleur.
4.10 Conception Top-Down / Implémentation Bottom-Up
Pour les projets de contrôle embarqués il est important de concevoir avant de rédiger le code ou de câbler
le matériel. Plutôt que de foncer directement sur le câblage et l’écrire le code, il est important de comprendre
avant tout le problème. Fractionner le projet en autant de modules ou parties que possible, et considérer
comment ils sont interconnectés et reliés les uns aux autres. Ceci est appelé « Conception du Haut vers le
Bas » (top-down design) comme si on regarde le projet par-dessus en regardant chacune de ces parties
élémentaires. Une fois que chaque module est défini, concevoir et implémenter chacun individuellement,
plutôt que d’essayer de traiter tout le projet à la fois. Ceci est appelé « Implémentation du Bas vers le Haut »
(bottom-up implementation). Ce processus de conception est expliqué dans Tableau 4.5.

Conception Haut-Bas

Comprendre complétement le problème

– STOP – déjà, ne pas écrire de code !;


– Spécifier les exigences ;
– Penser aux erreurs possibles ;
– Penser « quoi » et non pas « comment » ;
– Ne pas s’intéresser aux détails.
Niveaux de conception
 Fractionner le problème en parties (modules) ;
 Puis scinder ces parties en sous parties ;
 Etablir un diagramme bloc de toutes les parties muni et leurs
interconnexions ;
 Commencer à affiner les détails.

Implémentation Bas-Haut

Implémenter un sous-système à la fois

– Implémenter les sous-systèmes simples en premier ;


– Intégrer tout à la fin.

Table 1.5: Processus de conception Haut-Bas et d’implémentation Bas-Haut.

A chaque étape, il est important de garder une documentation détaillée du projet. Les ingénieurs utilisent
des carnets de notes pour y inscrire les idées, les pensées, les exigences, ce qui ne fonctionne pas et ce qui
fonctionne.
L’intérêt de cette stratégie de conception est qu’elle aide à clarifier le problème. On ne peut pas concevoir
quelque chose si on n’est pas complètement sûr de ce qu’elle doit faire. De plus, en subdivisant des parties
sont en plus petites pièces, celles-ci deviennent moins compliquées. On peut réaliser que des parties de la
solution peuvent être réutilisables (e.g. u module construit pour un composant peut avoir un code qui peut
être utilisé ailleurs dans la conception). Finalement, en partitionnant le système en petites briques, plusieurs
personnes peuvent travailler sur la solution.
1.11 Outils de Conception
Des outils de conception sont toujours disponibles pour aider à la conception et la réalisation d’un projet.
Un des outils de conception importants c’est l’utilisation d’organigrammes (Flowcharts). L’organigramme
décrit les étapes qu’un programme doit implémenter, de manière à rendre plus simple l’écriture du code
correspondant. Un autre intérêt de l’organigramme est qu’il est indépendant du langage de programmation.
En d’autres termes, étant donné un organigramme, le programme pourrait alors s’écrire aussi facilement en
langage évolué (e.g., C) qu’en assembleur. Figure 1.5 donne un exemple d’organigramme.

Figure 1.5: Exemple d’organigramme d’un projet pour faire


clignoter une LED à un intervalle d’une seconde.
Un autre outil important pour la conception est un logiciel de simulation de circuit qui permet de tester la
fonctionnalité du circuit avant tout câblage ou écriture de programme. Travailler avec des logiciels de
simulation pourrait constituer la majeure partie du travail d’un ingénieur. On peut rencontrer une multitude
de logiciels de simulation. Par exemple, CircuitVerse, Logisim, ou NI Multisim sont des package de simulation
matérielle pour les systèmes numérique. Tinkercad dispose d’un logiciel de simulation permettant de tester à
la fois le matériel et le logiciel du Arduino Uno. Ceci donne la possibilité de tester de nouvelles conceptions
sans pour autant disposer d’un Arduino ou autres composants. (Noter que Tinkercad ne dispose pas de toutes
les fonctionnalités de Arduino. Notamment, plusieurs protocoles de communication série n’ont pas encore
été implémentés dans Tinkercad avant 2020.)
1.12 Le Débogage (Debugging)
Un fois un projet est conçu son implémentation commence, et c’est inévitablement le moment pour
commencer le débogage. Afin de rendre le débogage aussi facile que possible, soit intelligent sur la manière
dont le code est implémenté. Travailler sur les fonctions de haut niveau, en premier. Une fois qu’elles
fonctionnent correctement, ajouter d’autres procédures (sous-programmes), une à la fois. Si plus d’une
fonctionnalité est ajoutée à la fois, et que quelque chose ne fonctionne pas, il sera très difficile de déterminer
quelle partie de la conception est défaillante. Dans le processus, maintenir le code bien commenté, et noter
les décisions de conception, les recherches, les idées d’implémentation, et ce qui fonctionne, ce qui ne
fonctionne pas (et pourquoi ?) sur le carnet de note du projet.
Si quelque chose ne fonctionne pas (ce qui va arriver inévitablement dans toute conception), plutôt que de
s’attaquer directement à modifier le code, il faut comprendre ce que ce dernier est en train de faire. Ce n’est
qu’après cela, qu’on peut modifier ce qui doit l’être. Ceci impose une connaissance intime des composants
logiciels et matériels de la conception en cours. On doit, en premier lieu, déterminer si c’est le matériel ou le
logiciel qui est en faute. Pour cela, il est impératif de tester le matériel avant de le programmer, afin d’éviter
des problèmes ultérieurs. Plusieurs étapes de vérification matérielle et de débogage logiciel sont suggérées
dans Tableau 1.6.

Vérification matérielle

– Vérifier que les DLED s’allument avant de les utiliser


– Vérifier les boutons poussoirs à l’aide d’un multimètre sur mode
« test de continuité »
– Utiliser un multimètre ou une sonde logique (pour tester les signaux
constants)
– Utiliser un oscilloscope (pour les signaux variables)
Débogage logiciel

– Parcourir le code : demander à quelqu’un d’autre de jeter un coup


d’œil au code
– Parcourir le code étape par étape et voir les résultats
– Mettre en commentaire une à une les lignes du code jusqu’à ce que
le programme fonctionne, puis décommenter une ligne à la fois
jusqu’à ce qu’il ne fonctionne pas
Tableau 1.6: Procédures de vérification matérielle et de débogage logiciel.

Vous aimerez peut-être aussi