mp3

Copyright
© 2000-2015 LHERBAUDIERE


22 pages à l'impression
Hit-Parade version initiale 2000
AVERTISSEMENT dernière mise à jour
28 janvier 2015

cliquez sur le mot avertissement pour connaitre une info essentielle avant de lire ce module et n'hésitez pas à cliquer en bas de page sur l'icone sommaire du site ça vous ouvrira d'autres perspectives

introduction au microprocesseur et circuits assimilés

troisième partie (3/5) : le 8031

le microcontrôleur 8031 le plus courant des µC
jeu d'instructions ses instructions
hardware du 8031 mise en oeuvre, interruptions,
une collection d'icônes pour visiter tout le site

Il existe plus de dix mille types de processeurs commercialisés. Nous avons volontairement choisi d'examiner en détail l'un des plus célèbres très employé dans le monde des microsystèmes industriels. La grande majorité des microcontrôleurs provenant du même fabricant ou de ses concurrents doivent une grande part de leurs fonctionnalités à ce 8051 lui-même héritier du premier microprocesseur fabriqué par INTEL en 1972.

Notons que dès 2008 Intel a abandonné le créneau des microcontrôleurs de cette famille à ses concurrents parmi lesquels on peut citer : Atmel, Infineon Technologies, Maxim Integrated Products (via Dallas Semiconductor), NXP (autrefois Philips Semiconductor), Winbond, ST Microelectronics, Silicon Laboratories (autrefois Cygnal), Texas Instruments et Cypress Semiconductor (et bien d'autres en particulier en Chine).

Vue d'ensemble sur la Famille MCS51

A- la famille MCS51

Le tableau ci-dessous présente les principales versions construites par INTEL . Il s'agit d'un exemple simplement destiné à vouss faire prendre conscience de la multiplicité potentielle de dispositifs issus d'un même système originel et qui vont se différentier par une ou plusieurs fonctionnalités différentes ou supplémentaires.


Les différentes versions possèdent donc quelques caractéristiques spécifiques supplémentaires. Ainsi le 8052AH possède 6 entrées d'interruption au lieu de 5 dans la version de base, les versions HCMOS possèdent des possibilités de mise en veille pour réduire la consommation, le 83C152 dispose de deux canaux d'accès direct à la mémoire, ainsi que d'un cinquième port et possède un brochage différent. De plus une version spéciale du 8052 dispose du basic intégré en rom (8052AH-BASIC). Le microcontrôleur choisi comme illustration de la famille est le 80C31BH qui est la version HCMOS du 8031, c'est à dire la version sans ROM interne du 8051 initial.

Dans le tableau ci-dessous nous listons les diverses versions présentes au catalogue d'INTEL en septembre 2006. On notera que les fréquences limites d'emploi étaient alors de 24 MHz et même 33MHz pour certains modèles tandis que l'on dispose de 16 ou 32K d'EPROM et de divers types de boitiers. Aujourd"hui ce catalogue remplirait plusieurs pages de ce site et les performances ont été multipliées par au moins 10.

80C31BH-24 ROMless (128 Bytes RAM)
80C51BH-24 4K ROM
87C51-24 4K OTP/EPROM
80C32-24 ROMless (256 Bytes RAM)
80C52-24 8K ROM
87C52-24 8K OTP/EPROM
80C58-24/-33 32K ROM
87C58-24/-33 32K OTP/EPROM
80C51FA-24/-33 ROMless (256 Bytes RAM) with PCA
83C51FA-24/-33 8K ROM with PCA
87C51FA-24/-33 8K OTP/EPROM with PCA
87C51FB-24/-33 16K ROM with PCA
87C51FB-24/-33 16K OTP/EPROM with PCA
87C51FC-24/-33 32K ROM with PCA
87C51FC-24/-33 32K OTP/EPROM with PCA
These products are now offered with frequencies of up to 24 MHz @ 20% Vcc and 33 MHz @ 10% Vcc.
Packages include 44Ld PLCC, 44Ld QFP, 40Ld P-Dip and 40Ld CerDip.

La famille 8051 reste donc l'une des plus vastes du marché car, outre INTEL qui en est le concepteur historique, plus de 25 constructeurs différents commercialisent des versions modifiées du 8051 (c'est à dire possédant le plus souvent un coeur de 8051 auquel ont été adjoints des compléments divers souvent spécifiques d'un type d'application, soient de type matériel, soient sous forme d'instructions supplémentaires, soient les deux) ce qui conduit à plusieurs centaines de circuits différents. Nous n'examinons ici que la version de base.

Les caractéristiques du 80C31BH


Le microcontrôleur possède les caractéristiques suivantes: Le brochage du 80C31BH

Les pins 32 à 39 constituent le port P0. Il s'agit d'un port multiplexé ce qui réduit le nombre de pins. En effet ce port sert le bus de données mais aussi fournit les lignes d'adresses A0 à A7.

Les pins 21 à 28 constituent le port P2. Il peuvent servir de lignes d'entrées/sorties à usage général mais il sert surtout à générer les lignes d'adresses A8 à A15. Les pins 1 à 8 forment le port P1. Ce sont des lignes bidirectionnelles d'entrées/sorties à usage général.

Le port P3 est formé des broches 10 à 17. Ce sont des lignes de contrôle et commande nécessaires pour le dialogue avec les montages extérieurs. Quelques lignes ne font pas partie d'un port. 1) séparation logique programme et données

Tous les composants de la famille ont un espace mémoire spécifique pour les données et un autre pour le programme, ce qui permet de travailler avec un bus 8 bits plus rapide d'accès (pour un CPU 8 bits). C'est l'état du bit PSEN qui permet de distinguer mémoire de données et mémoire de programme.

2) mémoire programme

Après un reset le CPU exécute le programme à partir de l'adresse 0000H, chaque interruption possède une adresse de démarrage de la routine correspondante avec un espace de 8 bytes entre chacune. Comme précisé ci-dessus l'état de la ligne EA permet de choisir, pour les versions avec ROM, l'accès au programme interne ou externe (à +5V ROM interne, à GND eprom externe). Pour les versions sans ROM la ligne EA doit obligatoirement être connectée à la masse.



3) mémoire de données

La mémoire de données comporte en fait deux zones d'une part les 128 (ou 256) octets internes au microcontrôleur et d'autre part la RAM externe. L'organisation des 128 octets internes est figurée ci-dessous


Les deux bits (3) et (4) de PSW (voir ci-après) permettent la sélection d'une banque de registres.

L'espace au dessus de l'adresse 80H constitue ce qu'on appelle le SFR (special function register) espace qui inclut les latches des ports, les timers, les contrôles de périphériques... Ces registres peuvent être atteints par adressage direct exclusivement. Ces 16 registres occupent l'espace jusqu'à FFH ainsi que le montre le tableau ci-dessous

C jeu d'instructions

Le jeu de base est le même pour tous les membres de la famille et est optimisé pour les systèmes de contrôle 8-bits, d'où un très grand nombre de fonctions jouant sur un bit puisque de nombreux dispositifs de contrôle ont un fonctionnement à 2 états (ouvert-fermé ou tout ou rien)

1 mot d'état PSW

Le registre PSW (program status word) qui réside dans l'espace SFR contient divers bits de statut qui reflètent l'état courant du CPU

nom  numéro signification
P PSW 0 parité de l'accumulateur = 1 si le nombre de 1 dans l'accu est impair (odd)
  PSW 1 bit configurable par l'utilisateur
OV PSW 2 bit d'overflow (en cas de dépassement de capacité lors d'opérations arithmétiques)
RS0 PSW 3 bit 0 de sélection d'une banque de registres
RS1 PSW 4 bit 1 " " "
FO PSW 5 flag de statut d'application générale
AC PSW 6 bit de carry auxiliaire pour les additions (opérations BCD
CY  PSW 7 bit de carry venant de l'ALU (mémorisation d'une retenue lors d'une addition)

2. modes d'adressage

adressage direct : sur 8 bits exclusivement pour les registres internes (de 0 à FFH)

indirect: on spécifie alors un registre qui contient l'adresse de l'opérande, dans ce mode on joint la ram interne ou externe. Pour une adresse 16 bits seul le registre dit data pointer (DPTR) peut être utilisé

registre : les banques de registres R0-R7 peuvent être atteintes par certaines instructions comportant 3 bits spécifiant le registre. Cette procédure évite de spécifier une adresse et permet de gagner du temps. De plus certaines instructions sont spécifiques d'un seul registre, par exemple de l'accumulateur et ne nécessitent de ce fait pas l'adjonction d'un octet d'adresse.

constantes immédiates: la valeur d'une constante peut suivre le code opératoire dans la mémoire programme, ainsi par ex MOV A, #100 charge l'accumulateur avec le nombre décimal 100 (on aurait pu spécifier 64H plutôt que #100 et obtenir le même résultat).

indexé: seule la mémoire programme peut être atteinte par adressage indexé, cela est utile pour la consultation d'une table. Le compteur de programme pointe sur la base de la table et l'accumulateur fournit le numéro de l'entrée concernée dans la table. Notons que les instructions de saut fournissent une autre procédure d'adressage indexé tout à fait générale.

3 instructions arithmétiques

Le tableau en fournit le listing. Par ex l'instruction d'addition ADD A, peut s'écrire

ADD A,7FH adressage direct (Dir)

ADD A,@R0 adressage indirect (Ind)

ADD A,R7adressage direct d'un registre (Reg)

ADD A,#127 adressage immédiat d'une constante (Imm)



Précisons que le résultat de la multiplication de deux nombres codés sur 8 bits s'exprime par un nombre codé sur 16 bits placé dans A et B (B contient la partie haute du résultat). Pour la division le quotient est placé dans A et le reste dans B. L'instruction DA A corrige l'erreur due à une addition de nombres codés en BCD.

A la fréquence d'horloge de 12MHz toutes les instructions s'exécutent en 1µs à l'exception des multiplications et divisions qui prennent 4 µs.

b 4 instructions logiques b

Il s'agit des opérations classiques booléennes opérant bit à bit sur un octet, ainsi l'opération AND entre l'accumulateur contenant 00110101B et l'octet 01010011B donnera le résultat 00010001B dans l'accumulateur

ANL A,<byte> ici encore tous les modes d'adressage sont permis. La plupart des opérations logiques sont exécutées en 1µs sauf celles qui font appel à une donnée et qui prennent alors 2µs.



l'instruction de rotation entraîne que le MSB devient le LSB (rotation à gauche) ou inversement, tandis que l'instruction swap substitue le quartet de poids fort à celui de poids faible et inversement (ce qui se révèle très utile pour convertir un nombre hexa en BCD).

5 transferts de données

ram interne

Les transferts affectant l'accumulateur s'effectuent en 1µS, les autres en 2µs. Notons que l'on peut transférer des données directement d'une case mémoire interne dans une autre sans passer par l'accumulateur. Notons que l'instruction d'empilage PUSH commence par incrémenter le stack pointer (SP), puis copie l'octet concerné dans la pile, l'instruction POP correspond à la démarche rigoureusement inverse de "dépilage".



ram externe

Les instructions permettant d'accéder à la ram externe en lecture ou écriture sont de deux types, soit elles utilisent une adresse sur un octet, soit sur deux octets, elles s'exécutent en 2µs.


Noter que l'accumulateur est toujours soit la source, soit la destination

consultation de tables

Deux instructions permettent cela (lire mais non mettre à jour) toujours en 2µs.



Précisons que la table ne pourra avoir que 256 entrées puisque A est codé sur 8 bits

6 instructions booléennes

La ram interne contient 128 bits adressables et l'espace SFR peut aussi comporter 128 bits adressables. Les lignes d'entrées/sorties des différents ports sont aussi bits adressables. Aussi tout un jeu d'instructions s'adressant non plus à un octet mais à un bit est disponible et l'exécution prend 1 ou plus souvent 2 µs (dans le cas d'une horloge à 12MHz, mais des circuits fonctionnant à de bien plus grandes fréquences sont disponibles). Notons que dans ce cas c'est le bit carry C du registre PSW qui va jouer le même rôle que l'accumulateur dans les instructions précédentes



Dans les instructions de saut rel représente une adresse relative généralement définie par une étiquette dans le programme,

par ex :
MOV C,
bit1 JNB bit2,

suite CPL C
suite: (suite du programme)
Remarquez que le petit morceau de programme ci-avant exécute l'instruction XRL (ou exclusif) qui n'existe pas entre deux bits dans le 8051. Notez encore que bit1 (ou bit2) peut être n'importe quel bit adressable ainsi il peut s'appeler FLAG et les deux lignes qui suivent permettent ainsi de transférer l'état de FLAG à une ligne d'un port
MOV C,
FLAG MOV P1.,C
(P1.0 signifie bit 0 du port 1)
b7 instructions de saut

Il existe des instructions de saut inconditionnel et d'autres qui ne s'exécuteront que si une condition est remplie

saut inconditionnel



Notons que l'instruction JMP addr comporte en fait 3 variantes SJMP, LJMP et AJMP selon le type de format d'addr. SJMP se réfère à une adresse relative, c'est à dire un nombre compris entre -128 et +127 que l'on va ajouter au compteur de programme. addr peut être définie par une étiquette ce qui est plus simple et évite de compter les lignes, mais attention à rester dans la fourchette -128+127. Si l'on doit atteindre une adresse au delà de cette fourchette il faudrait introduire un relais intermédiaire et l'on préférera la procédure LJMP.

Dans le cas LJMP (long saut) l'instruction est codée sur 3 octets et peut donc comporter une adresse sur 16 bits, c'est à dire n'importe où dans la plage de 64K que reconnaît le processeur.

Dans le cas AJMP l'adresse est codée sur 11 bits et ces 11 bits sont substitués aux 11 bits de poids faible du PC, ce qui signifie que la destination reste dans le même bloc de 2K que l'instruction suivant AJMP.

De même l'instruction JMP @A+DPTR comporte plusieurs cas. L'adresse de destination est calculée lors de l'exécution comme la somme du contenu du registre DPTR et de l'accumulateur et l'on peut imbriquer les JMP ce qui permet de multiplier les tables par exemple.

L'instruction CALL possède deux variantes LCALL et ACALL : l'une LCALL avec une adresse codée sur 16 bits tandis que l'autre correspond à une adresse sur 11 bits comme le AJMP correspondant. Les routines appelées par CALL sont toujours terminées par un RET.

sauts conditionnels

Ils sont tous à une adresse définie par offset relatif, donc entre -128 et +127 par rapport à l'instruction suivant celle de saut conditionnel. Comme ci-avant l'utilisateur emploiera préférentiellement un label pour définir l'adresse du saut qui s'exécutera en 2µs.


L'instruction DJNZ sert pour le contrôle des boucles, par ex:

  MOV counter, #10
LOOP: (début de la boucle)
  ---
  --- (fin de boucle)
  DJNZ counter, LOOP
  (suite)

D CPU timing

L'horloge peut être obtenue de diverses façons, soit avec une horloge externe, soit en utilisant l'oscillateur interne


1 cycles machine b

un cycle machine consiste en une séquence de 6 états nommés S1 à S6. Chaque état dure 2 périodes d'horloge et peut être découpé en 2 phases P1 et P2. Pendant le premier état le code opératoire est lu, si nécessaire le second byte de l'instruction est lu à l'état 4 (ex ADD A,#data); pour une instruction d'un seul octet telle INC DPTR qui nécessite pour son exécution 2 cycles machine, le code opératoire suivant (instruction suivante) est lu dès le 4ème état, mais n'est pas pris en compte et est relu 3 fois avant d'être exploité.

2 structure d'interruption

On dispose de 5 (ou 6) sources d'interruption: 2 externes, 2 (ou 3) timers et l'interruption provenant du port série interrupt enables Chaque source d'interruption peut individuellement être autorisée (enable) ou non (disable) en mettant à jour un bit du registre interrupt enable (IE) qui se trouve dans le SFR. L'état 1 d'un bit correspond à l'autorisation de prise en compte de l'interruption correspondante, tandis que l'état 0 l'interdit évidemment.



priorités d'interruption

On peut définir les niveaux de priorité de chaque interruption grâce au registre de priorité IP. Une interruption de haute priorité peut interrompre la routine de gestion d'une priorité d'ordre inférieur, elle-même ne peut être interrompue. De plus en interne un processus de polling permet de définir quelle INT sera servie la première lorsque 2 INT de même priorité arrivent en même temps



simulation d'un troisième niveau de priorité

Si deux niveaux ne suffisent pas on aura recours au soft pour définir un troisième niveau. On commence par assigner le niveau 1 dans le registre IP, puis la routine correspondante va bloquer les interruptions (sauf celle de priorité 2) par une modification ad hoc du registre IE jusqu'à ce que la routine soit terminée et une autorisation de service des interruptions via un RETI anticipé. Dans ce cas, si une interruption de priorité 2 survient pendant le traitement d'une interruption de priorité 1 celle-ci sera interrompue.

Le sous programme serait le suivant:

  PUSH IE (sauvegarde la situation du registre IE)
  MOV IE,#MASK (permet de modifier sélectivement l'état de IE)
  CALL LABEL ( va permettre d'appeler l'instruction RETI qui restaure les autorisations de prise en compte des interruptions, mais évidemment seulement celle qui est autorisée par MASK pourra être prise en compte)
  suite de la routine
  POP IE (permet de restaurer l'état antérieur de IE)
  RET (fin du traitement de l'interruption, ici on n'a pas besoin d'un RETI car il a déjà été pris en compte)
LABEL: RETI  

Hardware du 8031

Dans ce chapitre on va examiner la configuration hardware, en particulier comment gérer les ports, les timers, la puissance consommée. On va d'abord revenir sur les registres spéciaux qui résident dans la zone SFR dans la plage d'adresses s'étendant de 0H à FFH

A - registres spéciaux

On va d'abord préciser le mapping de ces registres, ce qui permettra en outre de visualiser les zones non implémentées de cet espace sur le chip (ce ne sont pas des cases vides, ici elles n'existent pas physiquement, cependant notons qu'elles sont parfois en partie implémentées dans des versions étendues du 8051 disposant de nouvelles possibilités)


Fig. tableau des registres du 8031. La colonne d'extrême gauche et celle de droite indiquent les limites d'adresses du tableau, ainsi le registre SP est à l'adresse 81 et PCON à l'adresse 87.

1) accumulateur

Il est référencé par le mnémonique ACC sur le tableau, cependant dans les instructions on le désigne par A

2) registre B

Il est utilisé tout particulièrement pour l'exécution des multiplications et divisions. Mais il peut être considéré aussi comme un registre quelconque.

3) PSW

On l'a déjà rencontré dans le chapitre précédent.

4) stack pointer

Le pointeur de pile est incrémenté avant l'exécution d'un PUSH ou d'un CALL. Bien qu'on puisse a priori mettre la pile n'importe où, lors d'un reset le pointeur est initialisé à 07H, et par conséquent la pile débute à l'adresse 08H.

5) data pointer

Le pointeur de données est un registre en deux parties DPH pour la partie haute et DPL pour la partie basse de l'adresse. On peut manipuler séparément ses deux moitiés, ou les considérer comme un ensemble 16 bits.

6) ports 0 à 3

P0, P1, P2 et P3 sont les latches des ports correspondants.

7) buffer de données série

Le buffer de données série est lui aussi un double registre l'un pour la transmission, l'autre pour la réception, mais c'est transparent car il n'y a qu'une adresse SBUF.

8) registres des timers

les registres TLx et THx (avec x variant de 0 à 2) constitue les registres de comptages sous 16 bits des timers correspondants.

9) registres de capture

La paire de registres RCAP2 sont réservés au timer 2 et permettent sous certaines conditions une recopie de sauvegarde de TH2 et TL2. Ils n'existent pas dans le 8031.

10) registres de contrôle

Les registres spécialisés IP, IE, TMOD, TCON, T2CON, SCON et PCON contiennent les mots de statut pour le système d'interruption, les timers et le port série.

B - structure et mise en oeuvre des ports

Les quatre ports sont bidirectionnels, chacun consiste en un latch (vu ci-dessus P0 à P3) un driver de sortie et un buffer d'entrée. Les drivers des ports 0 et 2 et le buffer d'entrée du port 0 servent aux accès mémoire externe. Dans ce cas le port 0 concerne l'octet de poids faible de l'adresse qui est multiplexé avec la donnée à lire ou écrire. Les ports 1 et 3 sont multifonctionnels, le tableau ci-dessous définit le rôle de chaque pin particulier préaffecté.



Notons que les fonctions ci-dessus ne sont activées que si le bit correspondant dans le latch du port concerné est à 1. Dans le cas contraire le port-pin est blocké à 0

1) configuration

Dans leur configuration matérielle les 4 ports ne sont pas tout à fait équivalents puisque certains (0 et 2) sont multiplexés, d'autres non et qu'en sortie trois possèdent un pull-up interne tandis que le port 0 présente une sortie différente (open drain output). Le diagramme présente les 4 cas. La configuration d'un port-pin consiste à mettre un 1 ou un 0 dans la case du latch qui lui correspond. Au reset tous les latches sont à 1 par défaut.

2) écriture dans un port

Lors de l'exécution d'une instruction qui change la valeur du latch de contrôle d'un port, la nouvelle valeur arrive au latch pendant le S6P2 (deuxième phase du sixième état) du cycle final de l'instruction, mais comme le latch n'est effectivement testé qu'au cours des phases 1 de l'horloge, la nouvelle valeur n'apparaitra sur la patte du circuit qu'à la phase 1 suivante S1P1 du cycle machine suivant. S'il s'agit d'un passage de 1 à 0 dans l'un des ports 1,2 ou 3, un pullup additionnel agit durant S1P1et S1P2 du cycle pendant lequel la transition se produit. Cela a pour but d'accélérer la vitesse de la transition en permettant un courant 100 fois supérieur (30mA) à celui fourni par le transistor de sortie normal (0.25mA).

b3) interfaçage

Les buffers des ports 1,2 et 3 peuvent alimenter chacun 4 entrées TTL LS, le port 0 peut aller jusqu'à 8, mais nécessite un pullup externe pour une liaison sur des entrées de type NMOS, sauf dans le cas ou il est utilisé comme bus d'adresse ou de donnée.

b4) compléments

Certaines instructions lisent le latch et d'autres lisent les pins. Celles qui lisent le latch plutôt que les pins sont dites read-modify-write instructions car elles lisent une valeur, peuvent la changer et la réécrire dans le latch. Ce sont les instructions ANL, ORL, XRL, JBC, CPL, INC, DEC, DJNZ, MOV , PX.Y, C (move carry bit to bit Y of port X), CLR PX.Y (clear bit Y of port X) et SETB PX.Y (set bit Y of port X). Précisons qu'il est souvent plus sûr de lire le latch plutôt que la patte de sortie qu'il contrôle car cette patte de sortie est nécessairement reliée à l'extérieur et cela peut entrainer des anomalies apparentes (un niveau 1 commandant la base d'un transistor rend ce transistor très conducteur et par suite ramène le potentiel sur la pin à celui de la base du transistor soit pas grand chose et la lecture de cette pin pourrait être interprétée comme un 0 alors que le latch de contrôle indique lui un 1 non perturbé).

C - Accès à la mémoire externe

Ils sont de deux types selon qu'il s'agit de la mémoire de programme ou de la mémoire de données.La première utilise le signal PSEN comme contrôle de lecture tandis que la seconde utilise RD ou WR selon qu'il s'agit de lire ou d'écrire une donnée. L'accès au programme implique toujours une adresse sur 16 bits, tandis que la mémoire de données peut être atteinte soit en 8, soit en 16 bits. Notons que la partie basse de l'adresse étant multiplexée avec la donnée il convient de la latcher pendant le temps de lecture ou d'écriture dans un latch externe piloté avec le signal ALE (cf figures du chapitre précédent). Pendant un accès à la mémoire externe le CPU écrit 0FFH dans le latch du port 0 afin d'écraser toute information antérieure. La mémoire programme peut être atteinte sous deux conditions: soit le signal EA est actif soit le compteur de programme contient un nombre supérieur à 0FFFH. Cela en fait impose pour les versions romless la mise à la masse de la broche EA. Bien sûr lorsqu'on accède au programme le port 2 est bloqué en sortie et ne peut être utilisé à d'autres fonctions d'entrée-sortie.

D - timers et compteurs

Tous les timers peuvent être configurés pour fonctionner en timer ou en compteur d'évènements. Dans la fonction timer le registre est incrémenté à chaque cycle machine. En mode compteur le registre est incrémenté à chaque transition 1 - 0 sur sa broche extérieure T0, T1 (ou T2). Dans cette fonction cette broche est testée pendant la phase S5P2 de chaque cycle machine, donc si la broche indique un 1 puis un 0 au cycle suivant le compteur est incrémenté et la nouvelle valeur apparait dans le registre pendant le S3P1 du cycle suivant. Comme il faut 2 cycles machines la fréquence maxi que pourra compter le compteur sera donc 1/24 de la fréquence d'horloge. Il n'y a aucune restriction sur le rapport cyclique, mais pour qu'une transition soit prise en compte il est plus sûr qu'elle dure au moins un cycle machine entier. De plus quatre modes de fonctionnement sont disponibles pour les timer 0 et 1, et trois spécifiques pour le timer 2.

1) timers 0 et 1

Les modes sont sélectionnés par l'état du registre de contrôle des timers TMOD (bits M1 et M0, soient 4 combinaisons possibles pour chaque compteur/timer)



Le second tableau spécifie le registre TCON qui concerne surtout les INT liées ou non aux timers



mode 0 Mettre le timer en mode 0 est recréer le timer du 8048. Dans ce mode, le timer est configuré comme un registre 13 bits contrôlé par l'interruption externe si GATE est à 1. Les 3 bits supérieurs de TLx sont ignorés.

mode 1 Idem au mode 0, mais on fonctionne en 16 bits

mode 2 Dans ce mode le registre TLx est un compteur 8bits, avec rechargement automatique dès qu'il y a overflow par la valeur stockée dans THx, et génération d'un bit d'overflow TF1 (bit 7 du registre TCON)

mode 3 Le mode 3 est plus complexe et différent pour les deux timers. Dans ce mode le timer 1 conserve son contenu, c'est identique à ce que l'on obtient avec TR1 = 0 Par contre pour le timer 0 les deux registres TL0 et TH0 sont considérés comme deux compteurs séparés. TL0 utilise les bits de contrôle C/T, GATE, TR0, INT0 et TF0 tandis que TH0 est figé dans une fonction timer comptant les cycles machine et récupère les bits TR1 et TF1 du timer 1 ce qui le fait contrôler l'interruption du timer 1.

2) timer 2

C'est un compteur 16 bits (présent sur le seul 8052AH) pouvant être utilisé en mode timer ou compteur selon 3 modes opératoires différents auto-reload, générateur de bauds, capture (sauvegarde automatique de son contenu dans un registre 16 bits RCAP2L et RCAP2H). Sa configuration est définie dans le registre T2CON.

E - interface série

Le port série est de type full duplex bufferisé, c'est à dire qu'il peut émettre et recevoir simultanément et même commencer à recevoir un second octet alors que le premier n'a pas encore été traité par le CPU grâce au buffer SBUF. Sa configuration est contrôlée par le registre SCON. Il dispose de 4 modes d'opération

1) modes

mode 0 Les données séries sont véhiculées via la ligne RXD. L'horloge est sortie par TXD. la transmission (I ou O) se fait en 8 bits en commençant par celui de poids le plus faible. La vitesse (baud rate) est de 1/12 de la fréquence d'oscillateur.

mode 1 10 bits sont transmis via TXDou reçus via RXD:1 bit de start, 8 bits de données, 1 bit d'arrêt. A la réception le stop bit est envoyé dans le registre SCON (RB8). La vitesse est variable.

mode 2 11 bits sont transmis ou reçus, c'est à dire qu'en plus du cas précédent il y a un 9ème bit de donnée programmable (TB8 de SCON) qui peut être un bit de parité (le P de PSW) à la transmission, à la réception ce bit est mis en RB8 de SCON et le bit de stop est ignoré. La vitesse est 1/32 ou 1/64 de la fréquence de base.

mode 3 Identique au mode 2, mais la vitesse est programmable. Dans tous les modes la réception est initiée par REN = 1, en mode 0 il faut en plus RI=0. La transmission est initiée par une instruction qui utulise SBUF comme registre de destination.

2) communications multiprocesseur

Les modes 2 et 3 sont spécifiquement conçus pour le fonctionnement multiprocesseur via le 9ème bit. En effet quand le processeur maître veut transmettre à l'un de ses esclaves, il commence par envoyer une adresse qui définit le récepteur. Le 9ème bit est alors utile, il sera mis à 1 pour une adresse et à 0 pour une donnée ce qui permet la différenciation entre donnée et adresse. On procède de la façon suivante, le 9ème bit on l'a vu va dans RB8. Il est possible de programmer tout port de réception de telle sorte que l'interruption correspondante ne soit activée que si RB8 = 1 (on peut le définir ainsi en plaçant dans RB8 le contenu du bit SM2 qui appartient à SCON et est à 1 en mode 2 ou 3). Quand le processeur maître enverra un bloc adresse, tous les ports en réception sont actifs et vont donc pouvoir identifier le bloc reçu et le comparer avec leur propre adresse, tous ceux pour lesquels cette comparaison donnera un résultat de non identité resteront inchangés tandis que le vrai destinataire passera son bit SM2 à 0 ce qui alors autorise l'entrée des blocs de données qui vont suivre dans le buffer de ce seul processeur esclave.

b3) registre de contrôle (SCON)b

SM0 (MSB)| SM1 | SM2 | REN | TB8 | RB8 | TI | RI (LSB)

Ce registre définit les modes, contient le 9ème bit éventuel et les bits de contrôle d'interruption du port série. Le bit de poids faible (LSB) est le bit RI, c'est à dire le drapeau de réception. Il est positionné à 1 (par le hardware) à la fin de réception de chaque bloc, c'est à dire après le 8ème bit en mode 0 ou le bit de stop dans les autres modes. Il sera remis à 0 par soft. TI est symétriquement le drapeau de transmission. positionné par le hard après le 8ème bit en mode 0 ou au début du stop bit dans les autres modes. Devra être remis à 0 par soft. RB8 on l'a vu contient le 9ème bit reçu en mode 2 ou 3, en mode 1 si SM2 = 0 c'est le bit de stop, non utilisé en mode 0. TB8 est le 9ème bit transmis, mis à 1 ou 0 par soft. REN mis a 1 par soft pour autoriser la réception et à 0 pour l'interdire. SM2 permet la communication multiprocesseur en mode 2 ou 3. Dans ce cas, s'il est à 1 alors RI ne sera pas activé si le 9ème bit reçu (RB8) est 0. En mode 1, si SM2 = 1 alors RI ne sera activé que si un stop bit valide est reçu. En mode 0, SM2 doit être à 0. La combinaison des bits SM0 et SM1 permet la sélection des modes selon le tableau ci-dessous



4) vitesse de transmission

En mode 2 le choix entre les 2 possibilités dépend de la valeur du bit SMOD du registre PCON, pour SMOD = 0 on a F/64 et F/32 pour SMOD=1.

avec timer 1 En mode 1 ou 3, la vitesse de transmission pourra être définie via le timer 1 Le tableau ci-dessous illustre les différentes possibilités qui font intervenir SMOS et le choix d'un mode du timer. Les 3 dernières colonnes sont relatives à l'état du timer 1.



Dans le cas général, l'interruption du timer 1 doit être désactivée, mais si l'on souhaite des transmissions très lentes, on peut la laisser active et utiliser le timer 1 en timer 16 bits en utilisant l'interruption générée par le timer, d'une part, pour lancer la transmission d'une donnée et, d'autre part, pour recharger le timer par soft.

avec timer 2 Dans le 8052 on utilisera préférentiellement le timer 2

5) compléments

mode 0 A titre indicatif on précise sur la figure jointe une image simplifiée du diagramme fonctionnel du port série lors d'une transmission en mode 0 et les chronogrammes associés.

mode1, 2 et 3 Des documents semblables peuvent être trouvés dans la documentation technique d'INTEL concernant les autres modes de fonctionnement du port série.

F - interruptions

1) rappels

Comme on l'a déjà dit il y a 5 (ou 6 pour le 8052) sources d'interruption que l'on peut schématiser graphiquement comme ci-dessous. Rappelons que tous les bits qui génèrent des interruptions peuvent être mis à 0 par soft et que les autorisations d'interruptions sont définies dans le registre IE, tandis que les priorités sont précisées par l'état des bits du registre IP que l'on a rencontrés dans le chapitre précédent.



Précisons cependant la structure du polling interne qui permet de choisir l'interruption à traiter en priorité lorsque deux interruptions définies par soft comme de même niveau arrivent en même temps: IE0 (priorité la plus élevée), puis TF0, IE1, TF1, RI+TI et enfin TF2+EXF2 (priorité la plus faible)

2) gestion

Les drapeaux d'interruption sont échantillonnés à l'état S5P2 de chaque cycle machine. Le polling est procédé au cycle machine suivant. Si l'un des drapeaux est trouvé à 1, le système de gestion d'interruption va générer un LCALL à la routine appropriée si ce LCALL n'est pas bloqué par l'une des conditions suivantes:
  • une interruption de priorité équivalente ou supérieure est déjà en cours de traitement,
  • le cycle de polling n'est pas le cycle final de l'instruction en cours de traitement,
  • l'instruction en cours de traitement est RETI ou toute écriture dans l'un des registres IE ou IP.
La deuxième condition garantit que l'instruction en court de traitement sera bien achevée avant que l'on ne prenne en compte l'interruption. La troisième condition impose qu'après RETI ou une écriture dans IE ou IP au moins une instruction soit exécutée avant la prise en compte de cette interruption. Ce qui garantit que le programme principal sera quand même exécuté si par malchance ( ou erreur ou malveillance) une même interruption est générée sans cesse.

Notons que si un drapeau est actif, mais que le service de l'interruption ne peut être exécuté immédiatement parce que l'une des 3 situations précédentes impose une attente, cette interruption ne sera traitée ensuite (lorsqu'il n'y aura plus de condition de blocage) que si le drapeau est toujours actif à cet instant (puisque le cycle de polling est effectué à chaque cycle machine c'est évidemment le dernier qui compte). L'adresse du début de routine est évidemment figée; le LCALL sauvegarde le PC dans la pile (afin de permettre le retour au programme en cours ensuite), mais non PSW, et charge PC avec l'adresse ad hoc selon la liste ci-dessous



Le programme s'exécute alors à partir de cette adresse jusqu'à ce qu'une instruction RETI soit rencontrée, alors les deux derniers octets de la pile sont rechargés dans le compteur de programme (PC) et le programme repart là où il s'était arrêté. Notez que si une instruction RET est rencontrée avant RETI le PC est aussi rechargé, mais le service de l'interruption n'est pas considéré comme achevé et toute nouvelle interruption de priorité égale ou inférieure à celle qui vient d'être traitée ne pourra jamais plus être prise en compte (ne pas se tromper svp).

3) interruptions externes

Comme le rappelle le schéma ci-avant les interruptions externes peuvent être prises en compte selon l'étatde ITx soit lorsque le niveau est activé soit lors de la transition (front). Si ITx =0, l'interruption sera détectée si la broche INTx est au niveau bas; dans le cas contraire une interruption ne pourra être détectée que par la succession d'un état haut dans un cycle et d'un état bas dans le suivant pour la broche INTx (en conséquence ces états doivent durer au moins un cycle pour être identifiés). Le drapeau IEx sera automatiquement remis à zéro par le CPU dès que la routine est appelée. Notons que la broche peut repasser à 1 avant que la routine soit lancée. Dans le cas d'une reconnaissance non pas de transition mais de niveau, il est indispensable de remettre le niveau à 1 sur la broche INTx dès que l'interruption est en cours de traitement (en tout cas avant la fin de la routine) sinon elle sera prise en compte à nouveau dès sa fin de traitement; par contre il est évident qu'il ne faut pas le faire avant le début d'exécution de la routine car dans le cycle suivant avant l'exécution de la routine l'échantillonnage du niveau INTx mettrait IEx à 0 et la routine ne serait pas lancée.

4) temps de réponse

En pratique il faut compter un minimum de 3 cycles machines (24 périodes d'horloge) avant démarrage effectif de la routine de traitement d'interruption (un cycle d'échantillonnage +2 cycles pour LCALL), mais si l'instruction en court n'était pas dans son dernier cycle ce sera plus long (mais d'au plus 3 cycles puisque la plus longue instruction MUL ou DIV ne dure que 4 cycles) et 5 cycles maxi d'attente en cas de RETI (1 cycle pour terminer RETI et une instruction complète ensuite soit 4 cycles max si c'était une MUL). Donc en pratique entre 3 et 9 cycles d'attente.

G - opération "single-step"

La structure d'interruption du 8051 permet l'exploitation pas à pas avec très peu de software. On a en effet noté qu'une interruption ne peut être traitée directement après un RETI mais qu'après exécution d'au moins une instruction du programme principal (ce qui constitue une garantie qu'on pourra malgré de nombreuses interruptions quand même traiter le programme principal). On peut donc travailler en mode pas à pas en utilisant l'interruption extérieure par niveau. La routine de service de cette interruption pourrait se terminer ainsi

JNB P3.2,$ ; wait here till INT0 goes high

JB P3.2,$ ; now wait till it goes low

RETI ; go back and execute one instruction

Donc si la broche INT0 qui est aussi la broche P3.2 est normallement maintenue basse le CPU entre dans la routine d'interruption et y reste jusqu'à ce qu'elle soit haute, puis à nouveau basse, alors la routine s'achève par un RETI et comme le niveau de P3.2 est toujours bas l'interruption est à nouveau détectée mais une instruction du programme principal doit être exécutée avant que la routine d'interruption soit à nouveau rappelée, d'où un fonctionnement en mode pas à pas très facile à gérer (il suffit d'un interrupteur de type poussoir relié au 5V via une résistance et un latch anti rebond). Cela est très commode pour tester et mettre au point un programme.

H - reset

L'entrée reset est la broche RST qui est l'entrée d'un trigger de schmitt. Le reset est obtenu en maintenant la broche RST au niveau haut pendant au moins 2 cycles machines (24 périodes d'horloge) alors que l'horloge fonctionne. Le CPU répond alors en provoquant un reset interne (le RST est en fait échantillonné à l'instant S5P2 comme les INT) mais il faut noter que les port-pins restent actifs pendant 19 périodes ensuite tout est réinitialisé, mais le signal ALE et PSEN qui sont liés à l'horloge redémarrent après 1 ou 2 cycles supplémentaires (avec toutes les conséquences sur les dispositifs externes qui leur sont liés). Ce reset provoque l'écriture de 0 dans tous les SFR sauf les latches des ports, le pointeur de pile et SBUF. Les latches (P0-P3) des ports sont initialisés à FFH, le pointeur de pile à 07H et SBUF est indéterminé

I - gestion de la puissance

1) au reset

La mise en route s'effectue en reliant la broche RST à VCC via une capacité selon le circuit suivant qui garantit un temps de maintien suffisant pour que l'oscillateur ait eu le temps de démarrer (>10ms). Noter qu'à l'inverse la coupure de Vcc va entrainer un potentiel fortement négatif (-5V) sur RST mais il y a une protection interne et le circuit n'en subit aucun dommage.



2) réduction de puissance du 8031

idle mode

La technologie HCMOS permet de réduire la consommation de deux façons via un registre de contrôle PCON dont seuls 5 bits sont implantés :

SMOD (MSB : PCON.7) | | | | GF1 (PCON.3) | GF0 (PCON.2) | PD (PCON.1) | IDL (PCON.0)

Rappelons que SMOD est le bit de doublement de vitesse pour le port série. GF1 et GF0 sont deux bits représentant des drapeaux d'emploi général au gré de l'utilisateur. PD est le power down bit qui active ce mode lorsqu'il est à 1, tandis que IDL active le mode IDLE.

En mode IDLE l'instruction qui met à 1 le bit IDL est la dernière à être exécutée avant de passer dans ce mode. Ensuite l'oscillator n'alimente plus le CPU (mais l'oscillateur continue à fonctionner) qui s'arrête mais sa configuration est sauvegardée (SP,PC PSW, ACC et autres registres) le timer continue à fonctionner, le port série est actif de même que la structure d'interruption. ALE et PSEN sont maintenus au niveau haut. Pour terminer un mode IDLE il y a deux processus, soit un reset hardware (mais alors tout est perdu), soit une INT dont l'activation entrainera automatiquement le passage à 0 du bit IDL et la fin du mode IDLE, l'interruption est alors traitée suivie d'un RETI et tout repart à l'instruction qui dans le programme suivait l'instruction qui avait enclenché le mode IDLE.

power down mode

En mode power down, après l'instruction qui met PD à 1, l'oscillateur s'arrête, mais le contenu de la ram interne (et les SFR) est conservé. La seule façon de redémarrer est un reset hardware qui va redéfinir tous les SFR mais conserver intact le contenu de la ram interne. Dans ce mode puisque seule la ram est conservée on peut réduire encore la consommation en alimentant le chip sous une tension réduite jusqu'à 2V (mais seulement après avoir enclenché le power down sinon c'est la panique; inversement on rétablira la tension à 5V avant le reset)

J - timing interne

Notons que la plupart des signaux internes sont influencés par les charges connectées aux diverses broches du composant. On s'arrangera pour qu'entre 0.8V et 2.0V les temps de montée ou descente soient de l'ordre de 10 ns. Les temps de propagation varient d'une broche à l'autre en fonction de la charge, de la température et du lot de fabrication : avec une horloge à 12MHz et en prenant pour référence le signal en XTAL2, les délais de propagation s'échelonnent entre 25 et 125 ns. Imaginez les délais pour une horloge à 1GHz dans certains circuits modernes.


Hit-Parade