Cours Microprocesseur
Avant Propos
Un système numérique, intégrant de l’électronique, fait souvent apparaître des fonctions ayant pour rôle le traitement d’informations. La majorité de ces systèmes sont conçus autour d’une structure à base de microcontrôleur ou microprocesseur. Le développement de ces composants programmables a été rendu possible grâce l’essor considérable qu’a connu la microélectronique et notamment les techniques d’intégration. Le microcontrôleur est né lorsque les technologies d'intégration ont suffisamment progressé pour permettre sa fabrication, mais aussi parce que très souvent, dans des applications tant domestiques qu'industrielles, on a besoin de systèmes "intelligents" ou tout au moins programmables. L'évolution du microcontrôleur a permis l'intégration de circuits complexes variés. Ces circuits ont été intégrés sur une même puce donnant ainsi beaucoup de flexibilité et de puissance de commande au microcontrôleur. Cette polyvalence lui permet d'occuper une place importante dans la réalisation de systèmes de commande. Le microcontrôleur est aujourd’hui le composant le plus adapté aux applications embarquées car il comporte sur sa puce un certain nombre d'interfaces qui n'existent pas sur un microprocesseur, par contre il est généralement moins puissant en terme de rapidité ou de taille de mémoire adressable et le plus souvent cantonné aux données de 8 ou 16 bits.
Un microcontrôleur se présente sous la forme d’un circuit intégré réunissant tous les éléments d’une structure à base de microprocesseur. Voici généralement ce que l’on trouve à l’intérieur d’un tel composant :
) Un microprocesseur (C.P.U.),
) Des bus,
) De la mémoire de donnée (RAM et EEPROM),
) De la mémoire programme (ROM, OTPROM, UVPROM ou EEPROM),
) Des interfaces parallèles pour la connexion des entrées / sorties,
) Des interfaces séries (synchrone ou asynchrone) pour le dialogue avec d’autres unités,
) Des timers pour générer ou mesurer des signaux avec une grande précision temporelle,
Les microcontrôleurs améliorent l'intégration et le coût (lié à la conception et à la réalisation) d'un système à base de microprocesseur en rassemblant ces éléments essentiels dans un seul circuit intégré. On parle alors de "système sur une puce" (en anglais : "System On chip"). Un microcontrôleur (ou µC) est donc un circuit intégré rassemblant un microprocesseur et d'autres composants tels que de la mémoire et des périphériques. Il est clair d’après cette description qu’il est difficile de parler de microcontrôleur sans parler du microprocesseur ou encore du processeur. Nous avons au préalable analysé un nombre important d'ouvrages consacrés aux microcontrôleurs et aux systèmes à bases de microprocesseur ainsi que plusieurs cours Internet proposés sur ces mêmes sujets. Les sujets abordés ici sont similaires à ceux qui sont le plus fréquemment traités dans certains ouvrages de références et certains sites Internet.
Nous avons volontairement découpé ce cours en cinq parties indépendantes mais complémentaires. Dans la première partie nous avons fait un rappel sur les systèmes numériques. C'est un pré requis nécessaire pour le reste du cours mais il doit être appuyé par un cours de systèmes logiques. Dans la deuxième partie de ce cours nous avons abordé les systèmes micro programmés. Ces systèmes à base de microprocesseurs ou de microcontrôleurs sont de plus en plus employés dans les systèmes numériques de commande contrôle. Le vaste domaine de contrôle peut être découpé en trois catégories d'applications. En premier lieu, le contrôle de processus et de commandes dans l'industrie assuré par des microcontrôleurs 8 bits, de plus en plus par des 16 bits et même par des 32 bits. Pour citer quelques secteurs visés parmi une multitude : les automatismes (automates et robots), les moteurs électriques, les onduleurs et autres alimentations stabilisées, mais aussi les climatiseurs ou encore toute la panoplie de l'électroménager. Aujourd'hui une machine à laver et un aspirateur ne se contentent plus d'un processeur 8 bits ; ils nécessitent un 16 bits. La deuxième catégorie concerne le contrôle de communications et flot de données, notamment multimédias, confié suivant les contraintes et la puissance requise à des modèles 16 ou 32 bits. A ce sujet, les microcontrôleurs 32 bits se taillent la part du lion dans tous les systèmes de communication sans fil, les modems xDSL et les applications graphiques. Ainsi, la prochaine génération de téléphones portables n'intégrera plus seulement un, mais deux microcontrôleurs 32 bits, à côté de l'inévitable DSP « processeur de signal ». Le deuxième sera entièrement destiné au traitement des données multimédias.
Dans cette catégorie d'applications, les composants 16 bits ont un domaine de prédilection avec les pilotes de disques durs, mais ils assurent également la gestion d'interfaces Ethernet ou Internet. Par exemple, le microcontrôleur MC9S12NE64 de Freescale est un véritable « terminal Ethernet » en une seule puce. Il intègre une pile de communications, des mémoires flash et Ram, un module MAC (media access controller) et un émetteur/récepteur PHY dans un boîtier unique. « Il rend la connectivité Ethernet accessible à des systèmes bas coût pour lesquels cette possibilité n'était même pas envisageable auparavant ». Enfin, la troisième catégorie a trait au contrôle dans l'automobile qui, lui aussi suivant les exigences en performances, fera appel à un modèle 16 bits ou 32 bits. L'industrie automobile est particulièrement consommatrice de microcontrôleurs.
Ils interviennent soit dans le fonctionnement même du véhicule (et sa sécurité), pour la gestion de l'allumage ou de l'injection, des freins ABS ou au niveau du tableau de bord, soit pour le confort dans l'habitacle avec la climatisation, les rétroviseurs électriques, le système de navigation, les modules de commande des portes, l'autoradio voire l'informatique de loisir. Comme nous pouvons le constater, il est très difficile d’aborder dans ce cours tous les systèmes micro programmés puisque chaque système a sa spécifité. Toutefois les trois éléments fondamentaux d’un système micro programmé 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. C’est pourquoi dans le deuxième chapitre nous examinons, l’architecture de base d’un processeur, les bus de données et d’adresses, le problème de décodage d'adresses et nous abordons à la fin de ce chapitre la technologie des mémoires. Nous avons essayé de montrer d'une manière simplifiée, par des figures, le principe de fonctionnement d'un processeur. Nous avons choisis pour cela quelques exemples faisant apparaître différentes organisations possibles de la mémoire externe. Cette partie nécessite le même pré requis que la première partie. La troisième partie de ce cours s’intéresse au microprocesseur. Rappelons qu’au niveau de traitement des informations, un microprocesseur est pratiquement équivalent à un microcontrôleur. Un microcontrôleur est dédié pour les applications industrielles de commandecontrôle ne nécessitant pas généralement un traitement d’informations de masse. Il intègre un certain nombre de périphériques adaptés pour ce genre d’applications. On pourrait utiliser un microprocesseur pour les mêmes fonctions mais ceci nécessiterait de rajouter des composants externes pour chaque périphérique. Dans cette partie du cours, nous allons étudier la programmation en langage machine et en assembleur d'un microprocesseur. L'étude complète d'un processeur réel, comme le 80486 ou le Pentium fabriqués par Intel, dépasse largement le cadre de ce cours : le nombre d'instructions et de registres est très élevé. Nous allons ici nous limiter à un sous-ensemble du microprocesseur 80486 (seuls les registres et les instructions les plus simples seront étudiés). De cette façon, nous pourrons tester sur un PC les programmes en langage machine que nous écrirons. Nous avons insisté également dans cette partie sur l'interaction entre le microprocesseur et les périphériques. C'est pourquoi nous avons consacré beaucoup de pages aux interruptions qui représentent un des points forts du microprocesseur. Afin de mieux expliquer le mécanisme des interruptions nous avons pris comme exemple le cas du PC où le microprocesseur est censé gérer plusieurs sources d’interruptions provenant des périphériques. Dans ce cas la gestion des priorités est dédiée à un contrôleur d’interruption du type PIC.
Cette architecture est partiellement figée dans le cas des PC depuis le microprocesseur 80286 (1990). Nous avons dressé à titre d’exemple un tableau récapitulatif des interruptions normalisées utilisées dans le cas du PC. Nous avons également exposé dans cette partie les notions de procédures et nous avons insisté sur le passage de paramètres aux procédures que ce soit par pile ou par registre. Nous avons fini cette partie par des exemples de programmation montrant la traduction de certains programmes du langage 'C' en langage assembleur. Le but est bien évidemment de montrer clairement le principe utilisé par les compilateurs de haut niveau pour le passage de paramètres aux procédures. Nous avons proposé pour cela un certain nombre d’exemple de programmation regroupant à la fois des procédures ‘C’ et des procédures assembleur. Nous avons donné également la démarche à suivre pour appeler, à partir du ‘C’ des procédures assembleur et à partir de l’assembleur des procédures ‘C’. Nous avons pris un exemple bien précieux celui de l’appel de la procédure printf du ‘C’, à partir d’un programme assembleur. Nous avons fini cette partie par un exemple classique de programmation, celui du tri d’un tableau. Le but de cet exemple est surtout de montrer l’intérêt de l’utilisation des macros qui simplifient la programmation et rendent le programme assez lisible. Cette partie nécessite une compréhension approfondie des notions traitées dans les parties 2 et 3 et surtout un pré requis sur les langages de programmation et en particulier le langage 'C'. Dans la quatrième partie de ce document nous nous intéressons au microcontrôleur. Un microcontrôleur est une unité de traitement de l’information de type microprocesseur à laquelle on a ajouté des périphériques internes permettant de réaliser des fonctions de commande-contrôle sans nécessiter l’ajout de composants externes. La majorité des microcontrôleurs intègrent mémoire de programme, mémoire de données, ports d'entrée-sortie, et même horloge, bien que des bases de temps externes puissent être employées. Certains modèles intègrent une multitude d’interfaces série (CAN, USB, I2C, SPI,..). Tous les microcontrôleurs ont des architectures RISC (reduced instruction set computer), ou encore microprocesseur à jeu d’instruction réduit. Plus on réduit le nombre d’instructions, plus facile et plus rapide en est le décodage, et plus vite le composant fonctionne. Il existe plusieurs famille de microcontrôleurs dont les plus connues sont : AtmelAT91 , Atmel AVR , le C167 de Siemens/Infineon, Hitachi H8, Intel 8051, Motorola68HC11, PIC de Microchip, ST6 de STMicroelectronics, ADuC d'Analog Devices, PICBASIC de ComfileTechnology.
Il est bien évident que, dans le cadre de ce cours dont le nombre de pages doit forcément rester limité, il ne va pas être possible de donner toutes les informations, matérielles et logicielles, relatives à tous ces microcontrôleurs. Le manuel technique de chacun d'entre eux comporte en effet plusieurs dizaines de pages, voir parfois une centaine. Nous allons nous intéresser dans le cadre de ce cours à la famille Intel C51. Après une brève présentation de cette famille nous avons orienté notre étude vers le microcontrôleur 80C51. C’est un microcontrôleur 8 bits avec un jeu d'instructions réduit (101 instructions). Ses instructions sont organisées autour d'un accumulateur et de registres (quatre banques de huit registres). L'unité centrale du 80C51 incorpore un processeur booléen qui accroît considérablement la vitesse de traitement des instructions de manipulation de bits. Cependant ses performances s’écroulent dans le cas de calculs arithmétiques sur des entiers 8 ou 16 bits. Le jeu d’instructions du 80C51 est optimisé pour les systèmes de contrôle 8 bits d'où un très grand nombre de fonctions de manipulation de bit adaptées pour les dispositifs de contrôle nécessitant un fonctionnement à 2 états (ouvertfermé ou tout ou rien). Nous avons passé en revue dans cette partie toutes les instructions du 80C51 appuyées par des exemples de programmation en assembleur simple. Nous avons également insisté dans cette partie sur l’exploitation des périphériques qu’intègre le 80C51 et notamment la liaison série et les ports d’entrées sorties. Nous avons finis cette partie par l’étude des interruptions offertes par le 80C51. Ces interruptions au nombre de cinq permettent d’envisager des applications temps réel avec le 80C51. Bien que le mécanisme de gestion de priorité est assez simple avec le 80C51 puisqu’il offre uniquement deux niveaux de priorité, il permet toutefois de donner une idée assez clair quant à la gestion des priorités dans le cas de la présence simultané de deux interruptions.
Partie N°1 : Représentation de l’information en numérique
I. Présentation du binaire.
Vers la fin des années 30, Claude Shannon démontra qu'à l'aide de "contacteurs" (interrupteurs) fermés pour "vrai" et ouverts pour "faux" il était possible d'effectuer des opérations logiques en associant le nombre " 1 " pour "vrai" et "0" pour "faux". Ce codage de l'information est nommé base binaire. C’est avec ce codage que fonctionnent les ordinateurs. Il consiste à utiliser deux états (représentés par les chiffres 0 et 1) pour coder les informations. L'homme travaille quant à lui avec 10 chiffres (0,1,2,3,4,5,6,7,8,9), on parle alors de base
décimale.
I.1 Le bit.
Bit signifie "binary digit", c'est-à-dire 0 ou 1 en numérotation binaire. C'est la plus petite unité d'information manipulable par une machine numérique. Il est possible de représenter physiquement cette information binaire :
- par un signal électrique ou magnétique, qui, lorsqu'elle atteint une certaine valeur, correspond à la valeur 1.
- grâce à des bistables, c'est-à-dire des composants électroniques qui ont deux états d'équilibre (un correspond à l'état 1, l'autre à 0)
Avec un bit il est ainsi possible d'obtenir deux états: soit 1, soit 0. 2 bits rendent possible l'obtention de quatre états différents (2*2):
2 bits
0 0
0 1 1 0
1 1
Avec 3 bits il est possible d'obtenir huit états différents (2*2*2):
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
Pour un groupe de n bits, il est possible de représenter 2n valeurs.
I.2 L'octet.
L'octet est une unité d'information composée de 8 bits. Il permet de stocker un caractère, telle qu'une lettre, un chiffre Ce regroupement de nombres par série de 8 permet une lisibilité plus grande, au même titre que l'on apprécie, en base décimale, de regrouper les nombres par trois pour pouvoir distinguer les milliers. Par exemple le nombre 1 256 245 est plus lisible que 1256245. Une unité d'information composée de 16 bits est généralement appelée mot (en anglais word). Une unité d'information de 32 bits de longueur est appelée double mot (en anglais double word, d'où l'appellation dword). Pour un octet, le plus petit nombre est 0 (représenté par huit zéros 00000000), le plus grand est 255 (représenté par huit chiffre "un" 11111111), ce qui représente 256 possibilités de valeurs différentes.
27 =128 26 =64 25 =32 24 =16 23 =8 22 =4 21 =2 |
20 =1 |
0 0 0 0 0 0 0 |
0 |
1 1 1 1 1 1 1 |
1 |
KiloOctets, MégaOctets
Longtemps l'informatique s'est singularisée par l'utilisation des unités du système international avec des valeurs différentes. Ainsi beaucoup d'informaticiens ont appris que 1kilo-ocet=1024 octets. Hors depuis décembre 1998, l'organisme international IEC a statué (). L'informatique utilise donc:
Un kilo-octet (Ko) = 1000 octets
Un méga-octet (Mo) = 1000 Ko = 1 000 000 octets
Un giga-octet (Go) = 1000 Mo = 1 000 000 000 octets
Un tera-octet (To) = 1000 Go = 1 000 000 000 000 octets
Comme tout le monde serais-je tenté de dire, mais également le kilo binaire (kibi), le méga binaire (mébi), le giga binaire (gibi), le tera binaire (tebi) définis comme ceci:
Un kibi-octet (Kio) vaut 210 = 1024 octets Un mébi-octet (Meo)vaut 220 =1 048 576 octets
Un gibi-octet (Gio) vaut 230 =1 073 741 824 octets
Un tebi-octet (Tio) vaut 240 =1 099 511 627 776 octets
Il est également utile de noter que la communauté internationale dans son ensemble utilise le byte de préférence à l'octet purement francophone.
II. Les opérations en binaire.
Les opérations arithmétiques simples telles que l'addition, la soustraction et la multiplication sont faciles à effectuer en binaire.
II.1 L'addition en binaire.
L'addition en binaire se fait avec les mêmes règles qu'en décimale:
On commence à additionner les bits de poids faibles (les bits de droite) puis on a des retenues lorsque la somme de deux bits de mêmes poids dépasse la valeur de l'unité la plus grande (dans le cas du binaire: 1), cette retenue est reportée sur le bit de poids plus fort suivant
Par exemple:
0 1 1 0 1
+ 0 1 1 1 0
- - - - - -
1 1 0 1 1
II.2 La multiplication en binaire.
La table de multiplication en binaire est très simple:
• 0x0=0
• 0x1=0
• 1x0=0
• 1x1=1
La multiplication se fait en formant un produit partiel pour chaque digit du multiplieur (seul les bits non nuls donneront un résultat non nul). Lorsque le bit du multiplieur est nul, le produit par l est nul, lorsqu'il vaut un, le produit partiel est constitué du multiplicande décalé du nombre de positions égal au poids du bit du multiplieur.
Par exemple:
0 1 0 1 multiplicande x 0 0 1 0 multiplieur - - - - - - 0 0 0 0 0 1 0 1 0 0 0 0 - - - - - - 0 1 0 1 0 |
III. La base hexadécimale.
Les nombres binaires étant de plus en plus longs, il a fallu introduire une nouvelle base: la base hexadécimale. La base hexadécimale consiste à compter sur une base 16, c'est pourquoi au-delà des 10 premiers chiffres on a décidé d'ajouter les 6 premières lettres :
0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F.
Base décimale |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
|
Base hexa – |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
A |
B |
C |
D |
E |
F |
|
Base binaire |
0000 |
0001 |
0010 |
0011 |
0100 |
0101 |
0110 |
0111 |
1000 |
1001 |
1010 |
1011 |
1100 |
1101 |
1110 |
1111 |
Un exemple :
Le nombre 27 (en base 10) vaut en base 16 : 16+11=1*161 + 11*160= 1*161 + B*160 c'est-à-dire 1B en base 16. Le nombre FB3 (en base 16) vaut en base 10 : F*162 + B*161 + 3*160=3840+176+3=4019. Pour convertir un octet en hexadécimale, on le partage en 2 groupes de 4 bits, qui correspondent chacun à un chiffre hexadécimal.
2 A D 5
0010 1010 1101 0101
IV. Représentation d'un nombre dans un ordinateur.
On appelle représentation (ou codification) d'un nombre la façon selon laquelle il est décrit sous forme binaire. La représentation des nombres sur un ordinateur est indispensable pour que celui-ci puisse les stocker et les manipuler. Toutefois le problème est qu'un nombre mathématique peut être infini (aussi grand que l'on veut), mais la représentation d'un nombre dans un ordinateur doit être fait sur un nombre de bits prédéfini. Il s'agit donc de prédéfinir un nombre de bits et la manière de les utiliser pour que ceux-ci servent le plus efficacement possible à représenter l'entité.
IV.1 Représentation d'un entier naturel.
Un entier naturel est un entier positif ou nul. Le choix à faire (c'est-à-dire le nombre de bits à utiliser) dépend de la fourchette des nombres que l'on désire utiliser. Pour coder des nombres entiers naturels compris entre 0 et 255, il nous suffira de 8 bits (un octet) car 28=256. D'une manière générale un codage sur n bits pourra permettre de représenter des nombres entiers naturels compris entre 0 et 2n-1. Pour représenter un nombre entier naturel, après avoir défini le nombre de bits sur lequel on le code, il suffit de ranger chaque bit dans la cellule binaire correspondant à son poids binaire de la droite vers la gauche, puis on "remplit" les bits non utilisés par des zéros.
IV.2 Représentation d'un entier signé.
Un entier signé est un entier pouvant être négatif. Il faut donc coder le nombre de telle façon que l'on puisse savoir s'il s'agit d'un nombre positif ou d'un nombre négatif, et il faut de plus que les règles d'addition soient conservées. L'astuce consiste à utiliser un codage que l'on appelle complément à deux.
- un entier relatif positif ou nul sera représenté en binaire (base 2) comme un entier naturel, à la seule différence que le bit de poids fort (le bit situé à l'extrême gauche) représente le signe. Il faut donc s'assurer pour un entier positif ou nul qu'il est à zéro (0 correspond à un signe positif, 1 à un signe négatif). Ainsi si on code un entier naturel sur 4 bits, le nombre le plus grand sera 0111 (c'est-à-dire 7 en base décimale). D'une manière générale le plus grand entier relatif positif codé sur n bits sera 2n-1-1.
-un entier relatif négatif grâce au codage en complément à deux. Soit à représenter un nombre négatif.
- Prenons son opposé (son équivalent en positif)
- On le représente en base 2 sur n-1 bits
- On complémente chaque bit (on inverse, c'est-à-dire que l'on remplace les zéros par des 1 et vice-versa) - On ajoute 1
On remarquera qu'en ajoutant le nombre et son complément à deux on obtient 0. Voyons maintenant cela sur un exemple: On désire coder la valeur -5 sur 8 bits. Il suffit :
- d'écrire 5 en binaire: 00000101
- de complémenter à 1: 11111010
- d'ajouter 1: 11111011
- la représentation binaire de -5 sur 8 bits est 11111011 Remarques:
Le bit de poids fort est 1, on a donc bien un nombre négatif. Si on ajoute 5 et -5 (00000101 et
11111011) on obtient 0 (avec une retenue de 1 )