Vous êtes sur la page 1sur 38

1 Structure d’un système à Microprocesseur Embarqué

IUT FOTSO VICTOR


2021-2022

Microprocesseur et Microcontrôleur

Préparé, rédigé et enseigné par : Dr TCHAMDA


(PhD en électronique,
Assistant université de Dschang,
Domaines : Système embarqué
Internet des objets - IoT,
Intelligence artificielle(IA)

© TCHAMDA 2021 -- 2022 UDM 1


1 Structure d’un système à Microprocesseur Embarqué

© TCHAMDA 2021 -- 2022 UDM 1


1 Structure d’un système à Microprocesseur Embarqué

Partie I : Rappels sur le codage de l’information

Chapitre 1 :

Rappels en numération et domaines


Applications des microprocesseurs

INTRODUCTION

Quand on frappe la lettre ‘’a ‘’ sur le clavier de la machine à écrire ordinaire, on entend le bruit
du marteau où est inscrit le caractère ‘’a ‘’ en actionnant en fait un levier.

© TCHAMDA 2021 -- 2022 UDM 1


2 Structure d’un système à Microprocesseur Embarqué

Quand on frappe la même lettre sur un clavier d’ordinateur, on fait surgir huit impulsions
électriques, réparties en deux catégories, des faibles et des fortes qui correspondent par
convention 0 et 1. Le code pour la lettre ‘’a’’ est 01000001. A l’intérieur de l’ordinateur,
La série 01000001 déclenche des signaux lumineux qui deviennent un ‘’a’’ sur l’écran.
Le code pour ‘’b’’ est 0100010, celui pour ‘’c’’ est 01100011.
On utilise le système binaire dans les communications notamment dans l’enregistrement des
œuvres musicales.
D’une façon générale, le nombre de symboles utilises est appelée Base. Lorsqu’un nombre est
écrit, la position respective des symboles détermine le poids.
Le tableau suivant donne pour quelques nombres leurs correspondances dans les bases 2
(binaire), 8 (octal) et 16 (hexadécimal).
Tableau 1 : correspondance de quelques nombres
Décimal (N)10 Binaire (N)2 Octal (N)8 Hexadécimal (N)16
0 0 0000 00 00
1 0 0001 01 01
2 0 0010 02 02
3 0 0011 03 03
4 0 0100 04 04
5 0 0101 05 05
6 0 0110 06 06
7 0 0111 07 07
8 0 1000 10 08
9 0 1001 11 09
10 0 1010 12 0A
11 0 1011 13 0B
12 0 1100 14 0C
13 0 1101 15 0D
14 0 1110 16 0E
15 0 1111 17 0F
16 1 0000 20 10
17 1 0001 21 11
18 1 0010 22 12
19 1 0011 23 13
20 1 0100 24 14
21 1 0101 25 15
22 1 0110 26 16
23 1 0111 27 17
24 1 1000 30 18
25 1 1001 31 19
26 1 1010 32 1A
27 1 1011 33 1B
28 1 1100 34 1C
29 1 1101 35 1D
30 1 1110 36 1E
31 1 1111 37 1F

© TCHAMDA 2021 -- 2022 UDM 2


3 Structure d’un système à Microprocesseur Embarqué

I. Conversion d’une base à une autre.


1. Conversion base 2 en base 10.
Pour convertir une base quelconque en base 10, on utilise sa forme polynomiale pour avoir son
équivalence en base 10.
Exemple :
a. Conversion binaire en décimal. Convertissons 01001101 à l’aide du tableau ci-
dessous.

27 26 25 24 23 2² 21 20
0 1 0 0 1 1 0 1

Le nombre en base 10 est : 26 + 23 + 22 + 20 = 64 + 8 + 4 + 1 = 77.


b. Conversion Octal en décimal. Convertissons 7601 à l’aide du tableau ci-dessous

87 86 85 84 83 8² 81 80
0 0 0 0 7 6 0 1
Le nombre en base 10 est : 83 + 8² + 81 + 80 =
7*512 + 6*64 + 0*81 + 1*80 = 3969
Remarque : Pour passer d’une base B1 à B2 avec B1 et B2 différents de la base 10, on passe B1
d’abord en base 10 puis en base B2.

B1 B2

2. Conversion de la10base 10 à une base quelconque.


On procède généralement par division successive du nombre écrit en base 10 par la nouvelle
base, puis lorsque le quotient est égal à 0, on regroupe les quotients successifs du poids le plus
faible vers le poids le plus fort.
Exemple : L’inverse de l’exemple sur le décimal.
Il s’agit de faire une suite de divisions euclidiennes par 2. Pour lire le résultat, on part du
quotient et on lit les restes dans le sens de la flèche. Le schéma suivant explique la méthode.
77 2
1 38 2
0 19 2
1 9 2
1 4 2
0 2 2
0 1 2
1 0
77 s’écrit donc en base 2 : 1001101 ou (77)10 = (1001101)2.

© TCHAMDA 2021 -- 2022 UDM 3


4 Structure d’un système à Microprocesseur Embarqué

Exercices : Faire les conversions des nombres suivants en décimal et vis vers ça (A1C) 16 ;
(123)8
3. Conversion de la base quelconque à la base 2.
Il suffit de chercher si cette base représente une puissance de deux 2k.
Ensuite regarder dans le tableau pour trouver la correspondance de chaque chiffre dans cette
base et les laisser en groupe.
Exemple : 1 – Passage la base 8 à la base 2 : 8 = 23.
N= ( 2 7 6 5 , 3 2 )8
N= ( 010 111 110 101 , 011 010)2
(2765,32)8 = (10111110101,01101)2
2 – Passage de la base 16 à la base 2 : 16 = 24..
N= ( 5 F 3 , 8 2 )16
N= ( 0101 1111 0011 , 1000 0010 )2

II. conversion (base 2 vers 10, base 2 vers 16, base 10 vers
2)

© TCHAMDA 2021 -- 2022 UDM 4


5 Structure d’un système à Microprocesseur Embarqué

Partie I : Structure logique et physique d’un microprocesseur.


Fonctionnement d’un microprocesseur

© TCHAMDA 2021 -- 2022 UDM 5


6 Structure d’un système à Microprocesseur Embarqué

Chapitre 2

Architecture de base d’un système à microprocesseur

Le développement de l'électronique numérique a suscité l'apparition de plusieurs types de


composants très puissants en particulier les systèmes micro-programmés. Leur aptitude à
s'adapter aux contraintes technologiques de plus en plus complexes, leur capacité de gérer un
grand nombre de fonctionnalités variées et leur coût de revient faible a encouragé leur utilisation
dans plusieurs applications tant domestiques qu'industrielles.

Le développement de ces composants programmables remplace de plus en plus


l'électronique classique vu que les circuits intégrés analogiques ou logiques ne peuvent plus
résoudre des fonctions de plus en plus complexes.
Historiquement, les constructeurs développèrent d'abord les systèmes micro
programmés intégrés dans les calculateurs de bureau ou de poche, avec des codes d'ordre
orientés vers le calcul numérique. Puis maitrisant cette technique ils offrirent des circuits
d'usage généraux : les microprocesseurs. Les systèmes micro programmés ont vu leur
importance progresser au rythme de l’importance prise par les microprocesseurs. C'est d'ailleurs
l'élément de base pour de tels systèmes.
1971 : premier microprocesseur 4 bits 4004 d’Intel. La miniaturisation des transistors a
permis d’augmenter considérablement la capacité d’intégration sur silicium. On est passé
rapidement du processeur 4 bits au :
 processeur 8 bits.
 processeurs 16 bits.
 processeurs 32 bits.
 processeurs 64 bits

Cette miniaturisation a offert des possibilités de réaliser des systèmes embarquées.

I. STRUCTURE D’UN SYSTEME MICROPROGRAMMES


Les structures matérielles des systèmes de traitement de l’information sont essentiellement
organisées autour du microprocesseur. Le microprocesseur est un circuit intégré complexe
caractérisé par une très grande intégration et doté de facultés fonctionnelles d’interprétation et

© TCHAMDA 2021 -- 2022 UDM 6


7 Structure d’un système à Microprocesseur Embarqué

d’exécution des instructions d’un programme. Comme dans tout circuit intégré, la technologie
de fabrication impose au microprocesseur des caractéristiques de :
- temps de réponse,
- consommation.

Cependant, le microprocesseur ne peut fonctionner sans un environnement minimal comportant


:
- une zone de mémoire vive pour les données et résultats,
- une zone de mémoire morte pour les programmes ou systèmes d’exploitation,
- une ou plusieurs interfaces pour les périphériques.

Entre les différents ensembles, les liaisons fonctionnelles sont assurées par trois groupes de
conducteurs en parallèles appelés bus et ayant chacun une fonction spécifique.

Les fonctions du microprocesseur sont variées :


 organiser l’enchaînement des tâches précisées dans la mémoire programme,
 rythmer et synchroniser l’exécution des tâches,
 analyser le contenu du programme, sélectionner, gérer et commander les circuits
nécessaires à l’exécution de chaque tâche,
 prendre en compte les informations extérieures au système.

III. L’ENVIRONNEMENT DU MICROPROCESSEUR


1. Mémoire :
Un circuit intégré de type mémoire permet de stocker et de restituer une très grande quantité
d’informations correspondant à N mots de n bits. Une mémoire est constituée par un assemblage
de cellules mémoires. Dans chaque cellule, il est possible d’écrire, de conserver et d’extraire un
élément d’information. Pour gérer cet ensemble de cellules mémoires, le circuit comprend
également des sélecteurs d’adresse, des amplificateurs, des commandes de modes de
fonctionnement… Il existe deux familles de mémoires:
Les mémoires vives, RAM (Random Access Memory) : mémoires qui peuvent être lues
et écrites en permanence. Elle contient habituellement les données pendant le traitement d’un
programme. Elle est effacée en cas de coupure d’énergie,
Les mémoires mortes, ROM (Read Only Memory) : Avec ces mémoires, seule la lecture
est possible. Les données qu’elle contient sont enregistrées par le concepteur du système. En
fonction de leur construction, il existe différents types :
 PROM, Programmable ROM : ROM programmable,

© TCHAMDA 2021 -- 2022 UDM 7


8 Structure d’un système à Microprocesseur Embarqué

 EPROM, Erasable PROM : PROM effaçable,


 EEPROM, Electric Erasable PROM : PROM effaçable électriquement.

2. Interface :
L’interfaçage est l’ensemble matériel qui permet de transférer les données entre le système
de traitement de l’information et les périphériques. On distingue les interfaces série et les
interfaces parallèles.
3. Périphériques :
Les périphériques sont les matériels extérieurs aux systèmes informatiques. On y retrouve :
 tous les matériels qui servent à la communication de l’homme avec le système
informatique : écran, clavier, souris…
 tous les systèmes de stockage des informations : lecteur de disquettes et CDROM,
disque dur, lecteur de bandes magnétiques…
 tous les appareils qui servent à traduire les données sur papier : imprimante à aiguilles,
jet ou bulles d’encre, laser…
 tous les appareils qui servent à acquérir des informations extérieures : lecteur de cartes
magnétiques, scanner, appareil photo numérique, carte d’acquisition son et vidéo…

II. MICROPROCESSEUR
Un microprocesseur est un circuit intégré complexe. Il résulte de l’intégration sur une puce
de fonctions logiques combinatoires (logiques et/ou arithmétique) et séquentielles (registres,
compteur, etc…). Il est capable d'interpréter et d'exécuter les instructions d'un programme.
Un microprocesseur est construit autour de deux éléments principaux:
‐ Une unité de commande
 Une unité de traitement
Ces unités sont associées à des registres chargées de stocker les différentes informations à
traiter. Ces éléments sont reliés entre eux par des bus interne permettant les échanges
d’informations.

© TCHAMDA 2021 -- 2022 UDM 8


9 Structure d’un système à Microprocesseur Embarqué

Figure: Architecture de base d’un µP.


L’unité de commande Elle permet de séquencer le déroulement des instructions. Elle effectue
la recherche en mémoire de l'instruction. Comme chaque instruction est codée sous forme
binaire, elle en assure le décodage pour enfin réaliser son exécution puis effectue la préparation
de l'instruction suivante.
Pour cela, elle est composée par :
 le compteur de programme : constitué par un registre dont le contenu est initialisé avec
l'adresse de la première instruction du programme. Il contient toujours l’adresse de l’instruction
à exécuter.
 le registre d'instruction et le décodeur d'instruction : chacune des instructions à
exécuter est rangée dans le registre instruction puis est décodée par le décodeur d’instruction.
 Bloc logique de commande (ou séquenceur) : Il organise l'exécution des instructions
au rythme d’une horloge. Il élabore tous les signaux de synchronisation internes ou externes
(bus de commande) du microprocesseur en fonction des divers signaux de commande provenant
du décodeur d’instruction ou du registre d’état par exemple. Il s'agit d'un automate réalisé soit
de façon câblée (obsolète), soit de façon micro‐ programmée, on parle alors de micro‐
microprocesseur.

L’unité de traitement C’est le cœur du microprocesseur. Elle regroupe les circuits qui assurent
les traitements nécessaires à l'exécution des instructions :
 L’Unité Arithmétique et Logique (UAL) : est un circuit complexe qui assure les fonctions
logiques (ET, OU, Comparaison, Décalage, etc…) ou arithmétique (Addition, soustraction).
 Le registre d'état : est généralement composé de 8 bits à considérer individuellement.
Chacun de ces bits est un indicateur dont l'état dépend du résultat de la dernière opération
effectuée par l’UAL. On les appelle indicateur d’état ou flag ou drapeaux. Dans un programme
le résultat du test de leur état conditionne souvent le déroulement de la suite du programme. On
peut citer par exemple les indicateurs de :
 retenue (carry : C)
 signe (Sign : S)
 débordement (overflow : OV ou V)

© TCHAMDA 2021 -- 2022 UDM 9


10 Structure d’un système à Microprocesseur Embarqué

 zéro (Z)
 parité (Parity : P)
 Les accumulateurs : sont des registres de travail qui servent à stocker un opérande au
début d'une opération arithmétique et le résultat à la fin de l'opération.

Les applications des systèmes à microprocesseurs sont multiples et variées :


– Ordinateur
– console de jeux
– calculatrice
– television
– Machine a lave
– système automatises

III. ARCHITECTURE D’UN SYSTEME A


MICROPROCESSEUR
L'architecture d'un système à microprocesseur représente l’organisation de ses différentes
unités et de leurs interconnexions. Le choix d'une architecture est toujours le résultat d'un
compromis entre
– performances et coûts
– efficacité et facilité de construction
– performances d'ensemble et facilité de programmation

1. Modèle de von Neumann


Pour traiter une information, un microprocesseur seul ne suffit pas, il faut l’insérer au sein d’un
système minimum de traitement programmé de l’information. John Von Neumann est à
l'origine d'un modèle de machine universelle de traitement programmé de l’information (1946).
Cette architecture sert de base à la plupart des systèmes à microprocesseur actuel. Elle est
composée des éléments suivants :
– une unité centrale
– une mémoire principale
– des interfaces d’entrées/sorties

Les différents organes du système sont reliés par des voies de communication appelées bus.

2. ARCHITECTURE DE HARVARD
Cette architecture sépare systématiquement la mémoire de programme de la mémoire des
données : l'adressage de ces mémoires est indépendant. Ce type d’architecture est utilisé sur des
microcontrôleurs qui ont connu un développement important ces dernières années.

© TCHAMDA 2021 -- 2022 UDM 10


11 Structure d’un système à Microprocesseur Embarqué

Quoique cette architecture puisse être complexe mais elle est performante: Gain en
terme de vitesse d’exécution des programmes : L’exécution d’une instruction ne fait plus appel
qu’à un seul cycle machine puisque l’on peut simultanément, grâce au deux bus, rechercher le
code de l’instruction et la ou les données qu’elle manipule

IV. CYCLE D’EXECUTION D’UNE INSTRUCTION


Le microprocesseur ne comprend qu’un certain nombre d’instructions qui sont codées en
binaire. Le traitement d’une instruction peut être décomposé en trois phases.
– Phase 1 : Recherche de l'instruction à traiter

1. Le PC (compteur programme) contient l'adresse de l'instruction suivante du programme.


Cette valeur est placée sur le bus d'adresses par l'unité de commande qui émet un ordre de
lecture.
2. Au bout d'un certain temps (temps d'accès à la mémoire), le contenu de la case mémoire
sélectionnée est disponible sur le bus des données.
3. L'instruction est stockée dans le registre instruction du processeur.
– Phase 2 : Décodage de l’instruction et recherche de l'opérande

Le registre d'instruction contient maintenant le premier mot de l'instruction qui peut être codée
sur plusieurs mots. Ce premier mot contient le code opératoire qui définit la nature de l'opération
à effectuer (addition, rotation,...) et le nombre de mots de l'instruction.
1. L'unité de commande transforme l'instruction en une suite de commandes élémentaires
nécessaires au traitement de l'instruction.
2. Si l'instruction nécessite une donnée en provenance de la mémoire, l'unité de commande
récupère sa valeur sur le bus de données.
3. L’opérande est stocké dans un registre.
– Phase 3 : Exécution de l'instruction
1. Le microprogramme réalisant l'instruction est exécuté.
2. Les drapeaux sont positionnés (registre d'état).
3. L'unité de commande positionne le PC pour l'instruction suivante.

Chapitre 3 :
Les BUS

© TCHAMDA 2021 -- 2022 UDM 11


12 Structure d’un système à Microprocesseur Embarqué

Comme nous l’avions vu plus haut, les trois éléments fondamentaux d’un système
microprogrammé sont : le microprocesseur ou microcontrôleur, la mémoire et les boîtiers
d’entrées sorties. Tous ces éléments sont reliés entre eux par des bus comme le montre la figure
ci dessous :

On appelle Bus, en informatique, un ensemble de liaisons physiques (câbles, pistes de circuits


imprimés, ...) pouvant être exploitées en commun par plusieurs éléments matériels afin de
communiquer. Les Bus ont pour but de réduire le nombre de traces nécessaires à la
communication des différents composants en mutualisant les communications sur une seule
voie de données. Dans le cas où la ligne sert uniquement à la communication de deux
composants matériels, on parle parfois de port (port série, port parallèle, ...). Un Bus est
caractérisé par le volume d'informations transmises simultanément (exprimé en bits),
correspondant au nombre de lignes sur lesquelles les données sont envoyées de manière
simultané. Une nappe de 32 fils permet ainsi de transmettre 32 bits en parallèle. On parle ainsi
de "largeur de bus" pour désigner le nombre de bits qu'il peut transmettre simultanément.
D'autre part, la vitesse du bus est également définie par sa fréquence (exprimée en Hertz), c'est-
à-dire le nombre de paquets de données envoyés ou reçus par seconde. On parle de cycle pour
désigner chaque envoi ou réception de données. De cette façon, il est possible de connaître la
bande passante d'un bus, c'est-à-dire le débit de données qu'il peut transporter, en multipliant sa
largeur par sa fréquence. Un Bus d'une largeur de 16 bits, cadencé à une fréquence de 133 Mhz
possède donc une bande passante égale à :

Pour la communication, un microprocesseur a besoin en général de trois Bus. Un Bus de


données, un Bus d’adresse et un Bus de commande. Sur la figure suivante nous présentons un
système à base de microprocesseur classique avec ces trois Bus. Chaque Bus a une fonction
particulière :

© TCHAMDA 2021 -- 2022 UDM 12


13 Structure d’un système à Microprocesseur Embarqué

I. Bus de données.
Il permet de véhiculer des données du microprocesseur vers un composant ou d'un composant
vers le microprocesseur. Il est donc bidirectionnel. Le nombre de fils de ce bus varie suivant les
microprocesseurs (8 / 16 / 32 / 64 bits). Dans la littérature, les différents fils de ce bus sont
appelés D0, D1, ..., Dp-1, si le bus a "p" fils.

II. Bus d’adresse.


La mémoire est composée de nombreuses cases mémoires. Chaque case est repérée par une
adresse. Lorsque le microprocesseur veut, par exemple, lire une case, il doit indiquer à quelle
adresse elle se trouve. Il met cette adresse sur le bus des adresses. La case mémoire reconnaît
alors son adresse et met sur le bus de données son contenu.
Exemple : Bus d’adresse 16 bits - données sur 8 bits.

Dans l'exemple précédent, le microprocesseur écrit la donnée 10101111 dans la case mémoire
d'adresse 1011 1111 0110 1010.
Le bus d’adresse est unidirectionnel : du microprocesseur vers les autres composants. Il se
compose de 16 à 32 fils, suivant les microprocesseurs, que l'on nomme A0, A1, ..., An-1. Le
tableau suivant donne l’espace mémoire adressable en fonction du nombre des lignes
d’adresses.

© TCHAMDA 2021 -- 2022 UDM 13


14 Structure d’un système à Microprocesseur Embarqué

III. Bus des commandes.

Le bus des commandes est constitué d'un ensemble de fils de "commandes", permettant la
synchronisation et bien sûr la commande des boîtiers mémoires et entrées/sorties par le
microprocesseur. Dans le cas précédent, la cellule mémoire doit savoir à quel instant elle doit
mettre son contenu sur le bus de données. Pour cela, le microprocesseur possède une broche
appelée Read (RD barre ) qu'il met à 0 (0v) lorsque la cellule doit agir. De même, lors d'une
écriture du microprocesseur vers la cellule, il met sa broche Write (WR barre ) à 0 (0V). Les
signaux RD et WR sont des signaux de synchronisation, de contrôle et de commande. Ils sont
reliés aux autres composants par un bus: le bus des commandes. Celui-ci comporte d'autres
signaux de commandes.

© TCHAMDA 2021 -- 2022 UDM 14


15 Structure d’un système à Microprocesseur Embarqué

Chapitre 4

Les Mémoires

La mémoire vive, généralement appelée RAM (Random Access Memory, mémoire à accès
aléatoire), est la mémoire principale du système, c'est-à-dire qu'il s'agit d'un espace permettant
de stocker de manière temporaire des données lors de l'exécution d'un programme. En effet le
stockage de données dans la mémoire vive est temporaire, contrairement au stockage de
données sur une mémoire de masse telle que le disque dur, car elle permet uniquement de
stocker des données tant qu'elle est alimentée électriquement. Ainsi, à chaque fois que
l'ordinateur est éteint, toutes les données présentes en mémoire sont irrémédiablement effacées.

La mémoire morte, appelée ROM pour Read Only Memory (mémoire à lecture seulement) est
un type de mémoire permettant de conserver les informations qui y sont contenues même
lorsque la mémoire n'est plus alimentée électriquement. A la base ce type de mémoire ne peut
être accédé qu'en lecture. Toutefois il est désormais possible d'enregistrer des informations dans
certaines mémoires de type ROM.

I. Fonctionnement de la mémoire vive.

La mémoire vive est constituée de centaines de milliers de petits condensateurs emmagasinant


des charges. Lorsqu'il est chargé, l'état logique du condensateur est égal à 1, dans le cas contraire
il est à 0, ce qui signifie que chaque condensateur représente un bit de la mémoire. Etant donné
que les condensateurs se déchargent, il faut constamment les recharger (le terme exact est
rafraîchir) à un intervalle de temps régulier appelé cycle de rafraîchissement (d'une durée
d'environ 15 nanosecondes (ns) pour une mémoire DRAM). Chaque condensateur est couplé à
un transistor (de type MOS) permettant de "récupérer" ou de modifier l'état du condensateur.
Ces transistors sont rangés sous forme de tableau (matrice), c'est-à-dire que l'on accède à une
"case mémoire" (aussi appelée point mémoire) par une ligne et une colonne. Un boîtier mémoire
est donc constitué d'un ensemble d'entités mémoire élémentaires (cellules mémoire) stockant
un élément binaire (bit : Binary digIT) ayant pour valeur 0 ou 1. Ces cellules sont groupées en
mot (word) de p bits (en général p=1 ou 8 bits). Le nombre n de cases mémoire de p bits appelé
capacité ou taille de la mémoire s'exprime en Kilo (1Ko=210=1024) ou en Méga (
1Mo=220=1024*1024=1048576). Chaque point mémoire est donc caractérisé par une adresse,
correspondant à un numéro de ligne et un numéro de colonne.

© TCHAMDA 2021 -- 2022 UDM 15


16 Structure d’un système à Microprocesseur Embarqué

La mémoire peut être vue comme un large vecteur (tableau) de mots ou octets.
– Un mot mémoire stocke une information sur D bits.
– Un mot mémoire contient plusieurs cellules mémoire.
– Une cellule mémoire mémorise un seul bit.
– Chaque mot possède sa propre adresse.
– Une adresse est un numéro unique qui permet d’accéder à un mot mémoire.
– Les adresses sont séquentielles (consécutives).
– La taille de l’adresse (le nombre de bits) dépend de la capacité de la mémoire.

Figure II.4 : Structure d’une mémoire à accès direct

II. sélection des mémoires

Les mémoires sont connectées à un bus d’adresse de n bits, un bus de données de p bits et des
lignes de commandes. Pour pouvoir communiquer avec le microprocesseur, on va relier leurs
bus ensembles. Pour cela, il est nécessaire d'avoir adéquation entre le nombre de bits des bus
de données et d’adresse de la mémoire et du microprocesseur. Sur la figure 2.10 apparaît une
broche de validation. Elle permet de sélectionner un boîtier mémoire parmi plusieurs, d'où son
appellation : "chip select". Cette broche permet d’éviter les conflits sur le bus de données. En
effet dans le cas général, il existe plusieurs boîtiers mémoire sur la carte, tous branchés sur le
même bus de données. Dans ce cas, il est nécessaire de construire un signal qui permettra à un

© TCHAMDA 2021 -- 2022 UDM 16


17 Structure d’un système à Microprocesseur Embarqué

seul boîtier d'accéder au bus de données. Ce signal CS (chip select) sélection de boîtier ou CE
(chip enable) validation de boîtier. Il faut créer autant de CS qu'il y a de boîtiers. Dans notre
exemple figure 2.11, il nous faut fabriquer deux CS : CS1, CS2

est appelé

Exemple :
Le bus d’adresse est sur 16 bits, le bus de données est sur 8 bits (figure 2.11). A l'adresse 1000H,
le premier boîtier mémoire contient A7H et le second contient A6H. Si le microprocesseur fait
une lecture à l'adresse 1000H (RD=1). Le premier boîtier mettra A7H sur le bus de données et
le deuxième A6H sur le bus de données. Le bus de données D7- D0 a donc sur son fil D0 un
"0" et un "1" ; c'est à dire 5 volts et la masse. C'est donc un court-circuit.
Les sélections de boîtiers "CS" (CS1 et CS2 sur la figure suivante) sont des fonctions logiques.
Elles proviennent de circuits combinatoires appelés "logique de décodage ou encore décodage
adresse". Les variables logiques de ces fonctions logiques sont les variables du bus d’adresse
(A0-An-1). Le choix des plages de validation des CSi sont exclusives les unes par rapport aux
autres. C'est à dire qu'elles ne se recouvrent pas.

Prenons l'exemple de la figure 2.13, si le bus d’adresse se compose de 16 fils (A0- A15).
Supposons que la taille mémoire des deux boîtiers soit 32*1024 = 32K = 215 adresses.
Il y a donc 15 broches adresses sur chaque boîtier. Nous pourrons mettre les fils A0 - A14 du
bus d’adresse sur ces broches. On peut prendre CS1 = /A15 (complément de A15)

© TCHAMDA 2021 -- 2022 UDM 17


18 Structure d’un système à Microprocesseur Embarqué

CS2=A15. Une lecture du microprocesseur à l'adresse 1000H donnera : CS1 =1 et CS2 =0. Ce
sera donc le premier boîtier qui sera validé et qui mettra le contenu de sa mémoire n° 0001 0000
0000 0000 sur le bus de données (A7H si on reprend l'exercice précédent). L'assemblage de
plusieurs boîtiers forme un plan mémoire de plus grande capacité. L'assemblage horizontal (en
largeur) permet de réaliser des mémoires de mots plus grands. Les boîtiers partagent le même
bus d’adresses et de contrôle. Tandis que l'assemblage vertical (en profondeur) augmente la
capacité (taille) mémoire du micro-ordinateur, les boîtiers partagent
le même bus de données.

© TCHAMDA 2021 -- 2022 UDM 18


19 Structure d’un système à Microprocesseur Embarqué

Exemple : Nous disposons d'un microprocesseur utilisant un bus de données de dimension


16 fils (D0- D15) et pouvant adresser 1 Mo cases de mémoire (bus d’adresse sur 20 fils A0-
A19 : 220=1Mo). Nous disposons également de boîtiers mémoire de 128 Ko octets chacun. De
plus, nous désirons travailler sur des mots de 16 bits. Chaque boîtier mémoire a besoin de17
fils du bus d’adresse A1-A17 (217=128K) pour être branchés sur ses broches d’adresse. Il reste
donc A0, A18 et A19. On va se servir de A18 et A19 pour construire les quatre CS des 8 boîtiers
mémoire et de A0 pour sélectionner partie basse ou haute du bus de données. La solution de ce
problème se trouve dans la figure (2.15), où nous utilisons un décodeur d'adresse à deux entrées
de sélection et quatre sorties (CSi).

© TCHAMDA 2021 -- 2022 UDM 19


20 Structure d’un système à Microprocesseur Embarqué

Chapitre 6 :
L'interface parallèle 8255A

I ) Introduction :
Le 8255 est un circuit programmable de 40 broches (voir figure 1) d'interface d'entrée/sortie
parallèle qui a été conçu pour travailler avec les microprocesseurs de la famille INTEL.
Il est formé par trois ports d'entrées/sorties, chaque port est de 8 bits qui peuvent être
programmés en entrée ou en sortie avec trois modes différents (mode zéro, mode un et mode
deux).

© TCHAMDA 2021 -- 2022 UDM 20


21 Structure d’un système à Microprocesseur Embarqué

Remarque :
Le port C est divisé en deux port C haut et port C bas
Le schéma bloque du 8255A est donné par la figure suivante :

Le schéma bloc du 8255 montre bien qu'il est divisé en deux groupes :

 Groupe A : formé par le port A et le port C haut.


 Groupe B : formé par le port B et le port C bas.

Le registre de données (Data buffer Bus) assure la liaison entre le bus de


données extérieur et le registre de controle ainsi que les ports d'entrées/sorties.

La sélection du 8255A se fait par l'intermédiaire de la pine CS (qui est en général fournie par
une logique de décodage qui permet la sélection du 8255A : voir plus loin les exemples
d'applications)

Le bus d'adresse du 8255A est formé essentiellement par deux pines (A0et A1) qui permettent
de sélectionner les ports ainsi que le registre de contrôle comme le montre le tableau suivant :

© TCHAMDA 2021 -- 2022 UDM 21


22 Structure d’un système à Microprocesseur Embarqué

Plus en détail l'adressage des différents ports en entrée sortie se fait selon la table de vérité
suivante :

© TCHAMDA 2021 -- 2022 UDM 22


23 Structure d’un système à Microprocesseur Embarqué

Chapitre 7 :
Structure interne microcontrôleur
ATMEGA

© TCHAMDA 2021 -- 2022 UDM 23


24 Structure d’un système à Microprocesseur Embarqué

Une architecture performante

 Architecture Harvard : 3 accès mémoires indépendants


o Mémoire Programme (Flash)
 liée directement à l'ALU et au bloc de 32 registres de travail internes
 propre bus de données
o Autres mémoires + autres ressources
 partagent un même bus de données
 Le processeur dispose d'un pipeline à 1 niveau
o l'instruction N s'exécute,
o pendant que l'instruction N+1 est récupérée en mémoire
 Donc : exécution d'1 instruction en 1 cycle d'horloge
o lecture de 2 opérandes dans les registres de travail
o exécution du calcul
o stockage du résultat dans les registres de travail

© TCHAMDA 2021 -- 2022 UDM 24


25 Structure d’un système à Microprocesseur Embarqué

Vous savez donc que le logiciel qui vient avec l’Arduino appelle une fois la fonction setup()
puis appelle ensuite loop() de manière répétitive.

 Généralement, pour mettre en œuvre un système, on va, dans loop(), lire des entrées de
l’Arduino, qu’elles soient analogiques ou numériques, exécuter un certain nombre de
calculs en fonction de ces entrées puis modifier l’état du système, ce qui aboutira
éventuellement à positionner des sorties.
 Ces lectures se font donc de manière répétitive. On appelle ceci de la scrutation ou
polling en anglais. La période de scrutation dépend du temps que loop() met à s’exécuter
et peut d’ailleurs être variable si loop() contient des instructions conditionnelles qui font
que d’une itération à l’autre de loop() le nombre d’instructions exécutées n’est pas le
même.
 Dans certaines circonstances la scrutation n’est pas adaptée car l’entrée qui est scrutée
peut changer plusieurs fois de valeur pendant la période de scrutation. Dans ce cas ces
changements de valeur ne sont pas vus par le logiciel et le système ne fonctionne pas
correctement.
 La solution réside dans l’utilisation des interruptions.

Une interruption est un déroutage automatique et « quasi-instantané » du programme en cours


d'exécution, en réponse à un signal émis par un périphérique interne ou par une entrée externe
(appelés sources d’interruption), vers un sous-programme permettant de gérer l’évènement.

 Le mécanisme d’interruption s’oppose à la « scrutation », où le μP interroge


régulièrement l’état de la source, par logiciel
o dans la scrutation, le processeur obéit à des instructions du programme pour
vérifier l'état des sources
o alors que l'interruption est déclenchée automatiquement sur demande d'une
source d'interruption, indépendamment du programme en cours d'exécution
 Exemple du reset

Principe de fonctionnement des interruptions

On a vu l’Arduino exécutait son programme en séquence, instruction par instruction, dans


l’ordre. Certaines instructions permettent de rompre cet ordre : les instructions conditionnelles
comme le if ... else ou les instructions de boucle comme le for(...). Mais l’Arduino
reste sur ses rails et respecte les instructions qui lui sont données.

Une interruption, comme son nom l’indique, consiste à interrompre momentanément le


programme que l’Arduino exécute pour qu’il effectue un autre travail. Quand cet autre travail
est terminé, l’Arduino retourne à l’exécution du programme et reprend à l’endroit exact où il
l’avait laissé.

Cet autre travail s’appelle le programme d’interruption ou la routine d’interruption ou


encore une ISR pour Interrupt Service Routine en anglais.

Il est très important que les ISR aient un temps d’exécution le plus court possible. On ne fera
donc aucun calcul compliqué et aucun appel à des fonctions longues comme un affichage sur
un écran LCD.

© TCHAMDA 2021 -- 2022 UDM 25


26 Structure d’un système à Microprocesseur Embarqué

Déroulement des interruptions

 Sur une interruption, voici ce qui se produit


1. l'instruction en cours s'achève
2. le masque d'interruption I est automatiquement mis à 1 pour empêcher d'autres
interruptions
3. le compteur ordinal PC est sauvegardé sur la pile (au contraire de SREG)
4. PC est ensuite chargé avec le vecteur d'interruption (qui effectue normalement
un saut vers le sous-programme d'interruption)
 En fin d'exécution de la routine d'interruption, c'est l'inverse
1. PC est chargé avec le dessus de la pile
2. I est remis à 0
3. le programme reprend alors là où il avait été interrompu

Liste des interruptions de l'ATmega328

Il existe plusieurs sources d’interruption, on dit également vecteur d’interruption, sur


l’AVR 328 qui équipe l’Arduino Uno, 26 au total. Nous n’allons pas toutes les passer en revue.
Nous allons seulement nous concentrer sur celles que nous pouvons utiliser dans nos sketchs.
Il s’agit des 5 interruptions liées au changement de la tension présente sur une broche numérique
qui sont donc ce que l’on appelle des interruptions externes. Les interruptions liées au timers,
des compteurs internes à l’Arduino qui permettent de compter le temps de manière précise sont
également intéressants et feront l’objet d’un autre article.

Que se passe-t-il si une nouvelle interruption survient alors que l’ISR déclenchée par la
précédente n’est pas terminée ?

Une ISR n’est pas interrompue par une nouvelle interruption. La nouvelle interruption ne sera
prise en compte que lorsque l’ISR en cours se terminera.

Le corollaire est qu’il ne faut pas appeler de fonctions qui se mettent en attente d’une
interruption à partir d’une ISR. Comme l’interruption attendue ne peut pas déclencher une
nouvelle ISR, la fonction attendra indéfiniment et tout le système se bloquera. C’est ce que l’on
appelle un deadlock.

Les fonctions de Serial qui permettent d’afficher, via la ligne série et l’USB dans le moniteur
série font exactement cela. Leur appel à partir d’une ISR est donc interdit.

Que se passe-t-il si plusieurs interruptions surviennent en même temps ?

Les Interruptions ont chacune une priorité. Par exemple, les interruptions externes sont plus
prioritaires que les interruptions des Timers. L’Arduino exécutera les ISR dans leur ordre de
priorité. L’ordre de priorité est donné dans la table ci-dessous. La source d’interruption située
la plus en haut de la table est la plus prioritaire.

© TCHAMDA 2021 -- 2022 UDM 26


27 Structure d’un système à Microprocesseur Embarqué

Les interruptions externes INT0 et INT1

Ces deux interr uptions sont les plus faciles à utiliser. INT0 correspond à la broche 2 des
Arduino a base d’AVR et INT1 correspond à la broche 3. Pour accrocher une routine
d’interruption à un état ou un changement d’état de l’une de ces broches on va utiliser la
fonction attachInterrupt(...).

Cette fonction prend 3 arguments : le numéro d’interruption externe, la fonction à appeler quand
l’interruption survient et enfin la condition selon laquelle l’interruption survient. Son prototype
est le suivant :

1. attachInterrupt(numéro, ISR, mode);

Détaillons ses arguments.

 numéro est le numéro d’interruption concernée. Il s’agira de 0 ou 1 sur un Arduino Uno,


ce qui correspond respectivement aux broches 2 et 3. Sur un Arduino Mega, les numéros
0 à 5 seront possibles et correspondent, dans l’ordre, aux broches 21, 20, 19, 18, 2 et 3.
 ISR est la routine d’interruption qui sera appelée lorsque l’interruption surviendra. Cette
routine d’interruption est une fonction qui ne renvoit rien et qui ne prend aucun
argument, comme ceci : void maRoutine() { ... }.
 mode indique ce qui va provoquer l’interruption. Les valeurs possibles pour mode sont :
o LOW : l’interruption est déclenchée quand la broche concernée est LOW.
Comme il s’agit d’un état et non d’un événement, l’interruption sera déclenchée
tant que la broche est LOW. Par conséquent, dès que l’ISR aura terminé son
exécution, elle la recommencera. Pendant ce temps, loop() ne sera pas exécuté.
o CHANGE : l’interruption est déclenchée quand la broche concernée change
d’état, c’est à dire passe de LOW à HIGH ou bien de HIGH à LOW. Il s’agit
d’un événement.
o RISING : l’interruption est déclenchée quand la broche concernée passe de
LOW à HIGH. Il s’agit également d’un événement.
o FALLING : l’interruption est déclenchée quand la broche concernée passe de
HIGH à LOW. Il s’agit encore d’un événement.

Les modes de déclenchement sont le reflet direct des capacités du matériel et à ce titre
permettent la meilleure réactivité. Ayez tout de même à l’esprit qu’il s’écoule presque 3μs entre
le déclenchement de l’interruption et l’exécution de la première instruction de l’ISR.

Une seconde fonction, detachInterrupt(...) permet de déconnecter l’ISR de la source


d’interruption. Son prototype est le suivant :

© TCHAMDA 2021 -- 2022 UDM 27


28 Structure d’un système à Microprocesseur Embarqué

1. detachInterrupt(numero);

Où numero est le numéro d’interruption, 0 ou 1 sur un Arduino Uno, 0 à 5 sur un Arduino Mega.

Résistance de rappel interne

Un Arduino possède plusieurs entrées numériques ayant deux états :

 État HAUT qui correspond à une entrée à 5 V sur l’Arduino Uno


 État BAS qui correspond à une entrée à 0 V sur l’Arduino Uno

Lorsque la broche d’une entrée numérique n’est pas reliée (interrupteur ouvert par exemple),
la tension sur cette entrée est flottante et son état peut varier aléatoirement entre les deux états
HAUT et BAS.

Une résistance de rappel permet de figer l’état d’une entrée numérique lorsque elle n’est pas
reliée, soit à un état HAUT (dans ce cas la résistance est dite « pull-up »), soit à un état BAS
(dans ce cas la résistance est dite « pull-down »).

L’exemple le plus simple à comprendre est la lecture de l’état d’un bouton poussoir ou d’un
interrupteur. Si l’interrupteur est relié au 5V, lorqu’il est fermé l’entrée de l’Arduino est bien à
l’état HAUT. Par contre lorsque cet interrupteur est ouvert, la broche de l’entrée numérique de
l’arduino n’est reliée à rien et son état est flottant et passe donc aléatoirement de l’état HAUT
à l’état BAS.

Le microcontrôleur qui équipe l’Arduino intègre des résistances de rappel internes qui évitent
l’utilisation de résistances externes. Pour activer la résistance de rappel interne sur une broche
donnée, il suffit de l’indiquer grâce à la fonction pinMode. Dans l’exemple ci-dessous, la
résistance de rappel interne est activée pour la broche 2.

void setup(){
pinMode (2, INPUT_PULLUP);
}

© TCHAMDA 2021 -- 2022 UDM 28


29 Structure d’un système à Microprocesseur Embarqué

Chapitre 8 :
Timers du microcontrôleur de
l’Arduino

L’utilisation des timers en Arduino est une méthode avancée permettant d’exécuter du code
sans perturber le reste du programme. Ils permettent notamment d’activer des fonctions à des
intervalles de temps précis. Les timers sont utilisées dans bon nombre de librairie de manière
complètement transparente pour l’utilisateur (millis(), Servo.h, PWM, etc.)

Un timer est un registre à l’intérieur du microcontrôleur qui s’incrémente (ou se décrémente)


chaque fois qu’il reçoit une impulsion d’un signal d’horloge. Ce signal d’horloge peut être
propre au microcontrôleur ou bien extérieur à celui-ci. Un timer est donc un compteur capable
de compter le temps qui s’écoule, d’où son nom anglais de timer counter.

Si le registre du timer comporte 8 bits, il est alors capable de compter de 0 à 255 (en
hexadécimal, de 00 à FF). Lorsqu’il arrive à 255 (FF), un coup d’horloge supplémentaire devrait
le faire passer à 256 (soit 100 en hexadécimal), ce qui n’est pas possible puisque le registre n’a
que 8 bits. Le registre passe donc à 0 ; on dit qu’il subit un débordement (Overflow en anglais),
mais ce débordement entraîne la mise à 1 d’un bit bien particulier dans un registre de contrôle
associé au timer. Ce bit est appelé un flag (drapeau en anglais) et indique que le timer vient de
compter jusqu’à 256, ce qui permet d’attirer l’attention du programmeur.

L’intérêt d’un timer est qu’il compte sans cesse et que pendant ce temps, le programme peut
réaliser autre chose, ce qui n’est pas possible si on utilise la fonction delay() qui est bloquante
et qui ne permet pas de faire autre chose pendant ce temps d’attente. Le temps que le timer met
pour compter 256 coups dépend bien sûr de la fréquence de l’horloge ; à 16 MHz (fréquence
du microcontrôleur utilisé dans les modules Arduino), c’est très rapide, mais il est possible de
diviser cette fréquence d’horloge grâce à des circuits internes au microcontrôleur appelés
prédiviseur (prescaler en anglais). On peut alors diviser la fréquence de base (16 MHz) par 8,
32, 64, 128, 256 ou 1024 ; pour cela, il faut utiliser intelligemment d’autres registres de contrôle
associés au timer. Par exemple, si on règle de prédiviseur pour diviser la fréquence par 1024, le
timer comptera donc à une fréquence de 15625 Hz.

© TCHAMDA 2021 -- 2022 UDM 29


30 Structure d’un système à Microprocesseur Embarqué

Le module Arduino Uno est construit autour du microcontrôleur AVR ATmega328P d’Atmel
qui possède 3 timers :

 Le timer0, sur 8 bits, utilisé par les fonctions delay(), millis() et micros(). Il
commande également des PWM (Pulse Width Modulation ou Modulation par Largeur
d’Impulsion) sur les broches 5 et 6.
 Le timer1, sur 16 bits, qui compte de 0 à 65535 (0 à FFFF en hexadécimal) et qui est
utilisé par la bibliothèque Servo ou bien pour de la PWM sur les broches 9 et 10.
 Le timer2, sur 8 bits, qui est utilisé par la fonction Tone() ou bien pour de la PWM sur
les broches 3 et 11.

I- Les Bases du Timer

Le langage d’Arduino fait donc appel aux timers du microcontrôleur mais ceci reste transparent
pour le programmeur. D’ailleurs, dans la majorité des applications, le langage d’Arduino est
souvent très suffisant et permet de développer des applications sans avoir besoin de faire appel
à l’architecture du microcontrôleur. Néanmoins, dans quelques cas particuliers, il peut être
intéressant de savoir programmer les timers ; dans cet article, nous allons évoquer l’utilisation
des timers comme compteur de temps, même si ceux-ci sont capables de faire bien d’autres
choses.

a. Les registres de contrôle

Le tableau suivant donne les différents registres de contrôle associés à chaque timer ; nous
verrons le rôle de chaque registre tout en nous limitant à ce qui est vraiment à connaître pour
réaliser un premier exemple.

b. Calcul théorique du comptage

Le timer 2 sera utilisé en le faisant compter à la fréquence de 62500 Hz (fréquence d’horloge


divisée par 256). Un cycle d’horloge dure donc 16 µs (l’inverse de la fréquence). Pour avoir

© TCHAMDA 2021 -- 2022 UDM 30


31 Structure d’un système à Microprocesseur Embarqué

500 ms (500000 µS), il faut compter 500 000 µs / 16 µs = 31250 fois. Cette valeur est
décomposable en 125 * 250. Le timer doit compter 250 fois pour déborder ; il suffit de le faire
partir de la valeur 6. Chaque fois qu’il déborde, une variable compteur est incrémentée ; quand
cette variable atteint 125, on a bien 500 ms qui se sont écoulées

c. Initialisation des registres de contrôle

Pour que le timer soit en mode normal, il faut que WGM20 , WGM21 et WGM22 soient à 0.
On positionne ces bits à 0 dans deux registres TCCR2A et TCCR2B par une instruction
adéquate (bitClear dans le langage Arduino). Pour que le prédiviseur divise par 256, il faut
que le bit CS22 soit égal à 1, le bit CS21 soit égal à 1 et le bit CS20 soit égal à 0 ; il suffit
d’écrire la valeur binaire 0b00000110 dans le registre TCCR2B. Heureusement pour nous, le
compilateur d’Arduino connaît les noms des registres et les noms des bits.

La dernière chose à savoir, c’est que pour réinitialiser le flag TOV2 par logiciel, il faut écrire
à 1 le bit 0 du registre TIFR2 ; l’instruction est bitSet (et non bitClear comme on aurait pu
le croire).

Nous avons vu qu’un timer est un registre compteur qui s’incrémente (ou se décrémente) à
chaque impulsion d’une horloge qui peut être celle du microcontrôleur divisée par un certain
nombre pour la ralentir. Lorsque le timer déborde, un flag est positionné à 1 dans un registre de
contrôle. En surveillant ce flag, on peut compter le temps qui s’écoule jusqu’à obtenir une durée

© TCHAMDA 2021 -- 2022 UDM 31


32 Structure d’un système à Microprocesseur Embarqué

déterminée. On peut lire la valeur du timer et on peut écrire une valeur dans le timer. Plusieurs
registres de contrôle sont associés au timer et permettent de modifier son comportement et de
suivre son débordement. La connaissance de ces registres de contrôle et du rôle joué par chacun
des bits les composant est indispensable au programmeur qui veut utiliser les timers. Pour cela,
une lecture assidue de la documentation du constructeur est indispensable.

L’intérêt d’un timer pour compter le temps qui s’écoule est que le programme peut réaliser autre
chose pendant ce temps. Dans l’exemple donné, il suffit de surveiller le flag TOV2 pour
connaître l’écoulement du temps ; ceci est possible parce que le programme ne fait rien d’autre
que de surveiller. Nous verrons dans un prochain article que le débordement du timer peut
engendrer une interruption ; le programme peut alors faire autre chose et être interrompu pour
traiter l’événement. Nous verrons aussi que les timers peuvent faire d’autres choses grâce aux
autres registres de contrôle comme OCR ou ICR.

II- Les Timers (II) en mode interruptions

Nous avons réalisé un premier programme faisant clignoter la DEL du module Arduino Uno
grâce au timer 2, en surveillant son débordement un certain nombre de fois pour agir sur la
DEL.

La surveillance du débordement du timer revient à surveiller le flag TOV2 , ce qui prend du


temps et interfère avec le déroulement du programme principal. Afin de libérer le programme
de cette tâche de surveillance, nous allons faire appel aux interruptions commandées par les
timers. Une fois de plus, nous utiliserons le timer 2, mais ce que nous allons faire peut aussi se
concevoir pour les autres timers du microcontrôleur.

a. Interruption Timer 2: Qu’est-ce qu’une


interruption ?

C’est ce qui nous arrive à tous dans notre vie de tous les jours. Imaginez que vous soyez au
téléphone et que l’on sonne à votre porte. Vous demandez à votre interlocuteur de patienter,
vous posez votre téléphone puis vous allez ouvrir. C’est le facteur qui vous apporte un colis.
Une fois celui-ci réceptionné et la porte refermée, vous retournez prendre votre téléphone pour
continuer votre conversation. L’interruption (sonnerie) vous a fait vous détourner de votre
programme principal (conversation téléphonique) pour aller réaliser un sous-programme
(ouvrir la porte) puis vous avez repris votre programme principal là où vous l’aviez laissé (si
vous n’avez pas perdu le fil de votre conversation !).

Un microcontrôleur fonctionne de la même façon : un événement interne (timer) ou bien externe


(broche) demande une interruption au microcontrôleur. Celui-ci va s’interrompre dans son
programme principal, puis va exécuter un sous-programme (on parle de routine d’interruption).
Une fois que cette routine est exécutée, le microcontrôleur reprend son programme principal,
là où il s’était arrêté, et continue son exécution. Pour cela, il a fallu que le microcontrôleur sauve
différents registres sur une pile et les rétablisse en fin de routine d’interruption. Il faut aussi que
le programmeur ait autorisé les interruptions ; si le programme doit réaliser une tâche selon une
chronologie très rigoureuse, il peut être nécessaire de ne pas les autoriser pour ne pas déranger
le microcontrôleur et c’est donc au programmeur de décider d’autoriser ou non les interruptions.
La fonction sei() permet d’autoriser les interruptions alors que la fonction cli() permet de
les ignorer ; on peut aussi utiliser les fonctions interrupts() et noInterrupts() du langage
Arduino.

© TCHAMDA 2021 -- 2022 UDM 32


33 Structure d’un système à Microprocesseur Embarqué

Toutes les demandes d’interruption arrivent sur une porte OU et sont éventuellement bloquées
par le signal GIE (Global Interrupt Enable) activé par la fonction sei(). La figure suivante
nous permet de comprendre comment le timer 2 peut faire une demande d’interruption.

Architecture de pilotage d’un timer


Ce circuit se trouve à l’intérieur du microcontrôleur qui équipe le module Arduino Uno.

La figure se lit de la droite vers la gauche : le signal d’horloge de 16 MHz arrive au prédiviseur
qui divise la fréquence en fonction des bits 0 à 2 du registre TCCR2B (voir le debut de ce cours
). Le timer TCNT compte ainsi moins rapidement. Lorsqu’il déborde, une bascule est
positionnée à 1 : c’est le flag TOV2 que l’on retrouve dans le bit 0 du registre TIFR2. Pour
autoriser une interruption par le timer, il faut que le flag TOIE2 (Timer/Counter2 Overflow
Interrupt Enable) qui est le bit 0 du registre TIMSK2 (Timer/Counter2 Interrupt Mask
Register), soit à 1 ; c’est ce qu’on appelle une autorisation d’interruption locale. Pour que notre
timer déclenche une interruption, il faut qu’il y soit autorisé (TOIE2 à 1) ET qu’il déborde (
TOV2 à 1), ces deux conditions arrivant sur une porte ET en amont de la porte OU. Mais comme
on l’a dit plus haut, il faut aussi que les interruptions soient autorisées de façon générale : c’est
le rôle du flag GIE, le bit 7 du registre SREG (Status Register) qui alimente une porte ET en
aval de la porte OU.

Si toutes les conditions que nous venons de voir sont réunies, l’interruption arrive au
microcontrôleur qui va donc interrompre son programme principal pour aller exécuter sa routine
d’interruption (ISR pour Interrupt Routine Service). Le système Arduino a prévu une routine
au nom réservé qu’il suffit de compléter : celle-ci commence par ISR(TIMER2_OVF_vect)
signifiant qu’il s’agit d’une routine d’interruption déclenchée par le vecteur d’overflow du timer
2. Cette routine remet automatiquement à 0 le flag TOV2, ce qu’il fallait faire soi-même
lorsqu’on surveillait le flag sans faire appel aux interruptions (programme de la première partie
de l’article).

b. Programme par interruption

Nous allons donc modifier le programme vu dans la première partie pour que l’inversion de la
DEL se fasse par une interruption provenant du timer 2. Les autres conditions restent
identiques : initialisation, réglage du prédiviseur (voir le précédent programme). La boucle
principale peut accueillir le programme de l’utilisateur ; à titre d’exemple, nous avons mis un
programme très classique faisant clignoter une autre DEL (branchée sur la broche 5 d’Arduino)
en utilisant la fonction delay(). Bien que cette fonction soit bloquante, cela n’empêche pas la
DEL reliée à la broche 13 de clignoter.

© TCHAMDA 2021 -- 2022 UDM 33


34 Structure d’un système à Microprocesseur Embarqué

Conclusion

Utiliser les interruptions générées par les timers permet de laisser le programme principal
s’occuper d’une autre tâche.

© TCHAMDA 2021 -- 2022 UDM 34


35 Structure d’un système à Microprocesseur Embarqué

Atelier de Microcontrôleur
Atelier 1 : Amélioration les performances d’un CAN en variant la tension de référence. Faire
au moins trois à quatre cas. Et enfin réaliser une acquisition d’un signal sinusoïdale d’amplitude
max 0.75 Volts et de fréquence 30Hz. à la fin du TP, ressortir la problématique.

Atelier 2 :
Dans une industrie, Un chariot permet de transporter des pièces d’un poste A vers un poste B
et vice versa. Le chariot est toujours en position A Lorsque l’opérateur active le bouton poussoir
marche. Le chariot se déplace vers B en 7 secondes et s’arrête automatiquement seul. Le
déchargement s’effectue en 4 secondes dès l’arrêt du chariot au poste B. ce temps de
déchargement terminé, le chariot retourne automatiquement au point A en 7 secondes. Les rails
du chariot sont transverse un passage piéton ce qui a obligé les constructeur de la commande
de prévoir un bouton d’arrêt d’urgence du chariot et d’activation d’une sirène. Ce bouton est
pressé par l’opérateur en cas de présence d’un objet immobile sur le trajet du chariot.
a. Utiliser une carte arduino uno, connecter sur la broche 2 un bouton poussoir en mode
down et sur la broche 5 un autre button en mode pulldown. Faire le schema de
connection de trois leds sur les broches 7,8, 12.

Broches 7 8 explication
Etat de sortie HIGH LOW Chariot A vers B
Etat de sortie LOW HIGH Chariot B vers A
Etat de sortie LOW LOW Chariot à l’arrêt
La led de la broche 12 joue le rôle de la sirène

b. Saisir le code ci-dessous dans arduino IDE


void setup() {
// put your setup code here, to run once:
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(12, OUTPUT);
pinMode(2, INPUT);
pinMode(5, INPUT);
}

void loop() {
// put your main code here, to run repeatedly:

if (digitalRead(2)==HIGH)//teste si action sur le bouton d'urgence


{
digitalWrite(12,HIGH);//activation sirene
digitalWrite(7,LOW);// 7 et 8 è l'état LOW donc
digitalWrite(8,LOW);// chariot à l'arret
}
if (digitalRead(5)==HIGH)//teste si action bouton marche
{
digitalWrite(12,LOW);//sirene à l'arret
digitalWrite(7,HIGH);//
digitalWrite(8,LOW);// chariot A vers B
delay(7000); // 7 secondes dedeplacement de A vers B
digitalWrite(7,LOW);//
digitalWrite(8,LOW);// chariot en arret
delay(4000); // 4 secondes de dechargement

© TCHAMDA 2021 -- 2022 UDM 35


36 Structure d’un système à Microprocesseur Embarqué

digitalWrite(7,LOW);//
digitalWrite(8,HIGH);// chariot B vers A
delay(7000); // 7 secondes de deplacement B vers A
}
}

 Televerser le code dans la carte, le tester en vérifiant si le code réponds à


l’exigence de sécurité d’écrite plus haut.
 Apres vos différents tests que constater vous ? (ressortir la problématique)
 Qu’aimeriez-vous avoir ?

c. ICI, le moniteur doit présenter et expliquer aux étudiants, un programme permettant au


microcontrôleur de gérer le cas d’urgence sans avoir attendre d’une tache autre soit
terminé car c’est cas d’urgence. Notion du cours Interruptions externes

Atelier 3 : Au TP 2, nous avons résolu un problème d’urgence. Si l’opérateur constate la


présence d’objet immobile sur le chemin du chariot, l’action sur le bouton d’arrêt d’urgence
désactive directement / immédiatement le chariot. Celui-ci s’arrêt. C’est bien bravooooooo vous
êtes comptant de vous car vous aviez bénéficié de nouvelle connaissance et résolu un problème
de grande important. Laisser-moi vous dire que vous vous êtes dans le dème (au bord de la
plaque) car vous n’aviez pas imaginé ce scénario.
Imaginer qu’un instant, l’opérateur soit distrait ou alors qu’il ne prête pas attention à la présence
d’un objet immobile sur le trajet. Hahaaaaa oufffffff. J’imaginer la tête que vous avez en ce
moment.

© TCHAMDA 2021 -- 2022 UDM 36

Vous aimerez peut-être aussi