Polycope Microproc Habilitation
Polycope Microproc Habilitation
Polycope Microproc Habilitation
Université Hassiba Benbouali de Chlef ‐‐‐
Algérie
Faculté de Technologie
Département d’Electrotechnique
Les Microprocesseurs
&
Les Microcontrôleurs
__ Tome 01 __
Ce cours est dédié aux étudiants d’Electrotechnique inscrits en troisièmes
année licence et première année Master (options Génie Electrique et
Informatique Industrielle et Commande Electrique). Il est enseigné en tant que
cours intégré en semestre 1pour les deux niveaux. Il porte sur des notions
élémentaires et avancées de l’étude et de la programmation des
microprocesseurs, et en particuliers le 16F84 de Microchip, ainsi que sur des
notions de bases sur les microcontrôleurs.
Nous commençons le cours avec une présentation générale de l’historique
des microprocesseurs et des systèmes de numération suivis d’un résumé sur les
opérations arithmétiques des nombres signés et les opérations booliennes. Nous
traitons ensuite en détail ensuite de les architectures et les fonctions de base des
microprocesseurs, tout en induisant une explication des différents types de
mémoires. Une fois les connaissances de bases assimilées, nous continuant avec
l’étude et la programmation du PIC16F84 de Microchip ainsi que la manière dont
ce dernier s’interface avec les modules externes. Tous les modules composant ce
microcontrôleur sont introduit avec détail à savoir, le compteur de programme,
les timers, les mémoires, les ports d’entrée et de sortie, la pile du système etc.
Nous terminons ce cours avec l’étude de toutes les instructions permettant la
programmation du 16F84 en langage assembleur.
Enfin, ce cours sera publié entièrement sur le site Web de l’université
Hassiba Benbouali de Chlef.
Polycopié --- cours de Microprocesseurs & Microcontrôleurs (Tome 01)
II. Historique
En 1642, Pascale inventait la Pascaline qui est une calculatrice entièrement mécanique. Le télégraphe
optique fut inventé en 1792 par les frères Chappe. La première machine qui est un métier à tisser les cartes
perforées est inventé en 1801 par Jacquard, elle prenait en charge le langage binaire et l’enregistrement
des programmes. En 1932, le monde a vu la naissance du premier calculateur électronique qui était le
compteur à tubes. Le premier ordinateur ENIAC (Electronic Numerical Integrator And Computer) est
inventé en 1946, c’est une machine qui consommait 140kW et réalisait 5000 additions par seconde contre
500 multiplications. Les mémoires à tores magnétiques ont été réalisées en 1953 et la société Texas/Kilby
fut apparaitre le premier circuit intégré en 1957. L’entreprise américaine Intel Corporation a réalisé le
premier microprocesseur en date du 15 novembre 1971 ; c’était le fameux Intel 4040 qui embarquait 2250
transistors bipolaires, tournait à la vitesse d’horloge de 108Khz avec quatre bits. La même firme a doublé
les capacités d’Intel 4040 en un autre microprocesseur appelé Intel 8080 avec des mots de huit bits, 64
kilo Octets adressables et une horloge de 2Mhz.
L’an 1981 était le début de l’informatique grand public, dont Intel équipait le premier PC et le
MOTOROLA 68000 d’Appel II. Durant la période 1985 à 1990, le monde de l’électronique avait sur les
marchés les premiers microcontrôleurs industriels l’Intel 8051 et le MOTOROLA 68HC11. Dès 1995, la
puissance des ordinateurs permettait la vulgarisation des outils de CAO (Controller Access Object) et des
compilateurs C avec comme cible les microcontrôleurs.
Par la suite et dans les années 70 apparaissent de petites entreprises de fabrication de microprocesseurs
comme MOS Technologies avec son 6502 très inspiré du 6800 mais vendu seulement 25$ et ZILOG
avec son Z80 qui constitue une amélioration technique du 8080 (augmentation du nombre de
registres, simplification de l'alimentation...). Les autres grands constructeurs (TEXAS INSTRUMENT,
FAIRCHILD, RCA, SIGNETICS etc.) se lanceront aussi dans ce marché.
III. Le système décimal
Pour rappel un système décimal est un système de numération qui utilise 10 chiffres (de 0 à 9) pour
générer des nombres, c’est un système en base 10. Mais dans un nombre la position des chiffres a
également une grande importance. Les chiffres les moins significatifs se situent à droite du nombre, et
leur importance augmente au fur et à mesure du déplacement vers la gauche. En effet, dans le nombre
502, le 5 à une plus grande importance que le 2. En réalité, chaque chiffre, que l’on peut appeler DIGIT,
à une valeur qui dépend de son RANG. Quel est ce rapport ? Il s’agit tout simplement de l’élévation de la
BASE utilisée élevé à la puissance de son RANG. Remarquez ici une chose très importante : le comptage
du rang s’effectue toujours de droite à gauche et en commençant par 0. Pour notre nombre 502, sa valeur
est donc en réalité : 502 = 2*10° + 0*101+5*10². Notez que le symbole * est utilisé pour indiquer une
opération de multiplication. Dans les microprocesseurs un nombre décimal est écrit tel quel ou sous la
forme D’xxxxxx’ dont x peut prendre les chiffres entre 0 et 9.
IV. Le système binaire
Pour un ordinateur il ne sait que distinguer entre deux niveaux : présence ou absence de tension ! Cela
veut dire que le système décimal est inadapté. Pour représenter deux niveaux logiques (niveau haut de
tension et niveau bas) il est donc obligatoire d’utiliser un système de numération à base de deux : le
système binaire qui utilise deux chiffres, le 0 et le 1 pour représenter n’importe quel nombre sous
formes d’une série de 0 et de 1. Chaque chiffre est appelé Bit (BInary uniT en anglais) et un ensemble
de huit bit est un Octet (Byte en anglais). En binaire, un nombre est représenté sous la forme B’xxxxxx’
dont x vaut un 0 ou un 1.
Donnée su 2 x x
bits
Donnée sur 4 x x x x
bits (quartet)
Donnée sur 8 x x x x x x x x
bits (Octet)
Donnée sur x x x x x x X x x x x x x x x x x
16 bits (mot =
2 octets)
Pour illustration, sur deux bits on ne peut représenter que B’00’, B’01’, B’10’ et B’11’ ce qui est
équivalent en binaire respectivement à 0, 1, 2 et 3 par une sommation des puissances de 2. A titre
d’exemple B’11’ = 1x20 + 1x21 = 3. Donc sur deux bits on ne peut représenter au maximum que le
Dr A. Zegaoui, UHBC ; Département d’’Electrotechnique, Laboratoire GEER 7
Polycopié --- cours de Microprocesseurs & Microcontrôleurs (Tome 01)
nombre décimal 3. Par contre sur quatre bits (Quartet) on peut aller à B’1111’ ce qui est équivalent à
nombre 13 en décimal. A titre d’exemple le B’1001’ = 1x20 + 0x21 + 0x21 + 1x22 = 5 en décimal. Sur
quatre bits on ne peut coder en fait que les nombres naturels allant de 0 à 13 au maximum. Donc pour
coder un nombre décimal plus de 13 il nous faut plus de bits en binaire ! Une donnée, un nombre
décimal, codé sur 8 bits est appelé Octet. Donc sur un octet on peut représenter au maximum B’1111
1111’ = 1 + 2 + 4 + 8 + 16 + 32 + 64 = 127 en décimal et tout nombre supérieur à 127 nécessite plus
d’un octet pour être condé en binaire. Et sur 16 bit on peut coder un nombre décimal de moins de 65535
et plus de 65535 nécessite plus de 16 bits pour un codage en binaire.
V. Le système hexadécimal
Ecrire des nombre en binaire par une succession de 1 et de 0 sur une taille élevée (plusieurs bits) n’est
pas facile à gérer et peut même être une source d’erreur d’écriture. Pour y remédier, il a été décidé de
scinder l’octet en deux quartets et que chaque quartet était représenté par un chiffre conformément au
tableau VVV. On a déjà vu qu’un quartet ne peut coder que les nombres décimaux de 0 à 15. Pour
qu’un quartet ne puisse être représenté que par un seul chiffre, il a été décidé de remplacer les 6
nombres de 10 à 15 par les premières lettres de l’alphabet : A, B, C, D, E et F. il est à signaler qu’un
nombre hexadécimal est précédé par le suffixe 0x. À titre d’exemple, le plus grand nombre qu’on peut
représenter sur un octet est 0xFFFF FFFF = Fx160 + Fx161 + Fx162 + Fx163 + Fx164 + Fx165 +
Fx166 + Fx167 = Fx (1+16+256+4096+65536+1048576+16777216+268435456) = 16x286331153=
4 581 298 448 c’est énorme comme nombre !
B’0000’ 0x0 0
B’0001’ 0x1 1
B’0010’ 0x2 2
B’0011’ 0x3 3
B’0100’ 0x4 4
B’0101’ 0x5 5
B’0110’ 0x6 6
B’0111’ 0x7 7
B’1000’ 0x8 8
B’1001’ 0x9 9
B’1010’ 0xA 10
B’1011’ 0xB 11
B’1100’ 0xC 12
B’1101’ 0xD 13
B’1110’ 0xE 14
B’1111’ 0xF 15
Le codage d’un nombre sur n’importe quel système de numération ou d’un système de numération à
autre est facile à faire.
VI. Opérations arithmétiques et nombres signés
Quelque soit le système de numération adopté, les opérations arithmétique se font avec les mêmes règles
qu’en décimal.
Addition :
1
B’ 1 0 10 11 1’
+ B’ 1 1 0 0 1’
= B’ 1 0 1 1 0 0’
On additionne les chiffres de droite, et on obtient : 1+1=10 car 2 n’existe pas en binaire, on écrit
0 et on reporte 1 ;
La réponse est alors 101100 soit 44 en décimal. On remarque bien sûr que l’addition de deux nombres
codés sur cinq bits donne lieu à un résultat codé sur six bits. C’est normal parce que cinq bit ne suffisent
pas pour coder le nombre 44 !
On procède de la même manière pour les nombres codés en hexadécimal. Effectivement, en sachant que
0xF + 0x1 = 0x10, soit 15+1 = 16.
VII. Les nombres signés : la soustraction
Dans de nombreuses applications, on utilise la soustraction mais le signe « - » n’est pas représentable
électriquement car ce n’est qu’un concept.
Pour des nombres binaires représentés par un octet, sont considérés comme « signés » si le bit 7 représente
le signe. Dans les nombre signés, si le bit 7 est mis à 1 cela signifie que le nombre est négatif et est positif
dans le cas contraire. Cette façon de faire fait perdre un nombre, car le nombre 0 aura deux représentation,
à savoir : 10000000 (-0) et 00000000 (+0). La méthode du complément à deux nous permet d’éviter cette
perte.
En binaire, Pour rendre un nombre négatif
1) On inverse la totalité du nombre (le complément à 1).
2) On ajoute 1
On obtient alors ce qu’on appelle le COMPLEMENT A DEUX du nombre.
Pour exemple, comment avoir le nombre -5 en binaire :
On écrit 5 en binaire, soit : 00000101.
On inverse tous les bits, soit : 11111010 (le complément à 1).
On ajoute 1, soit 11111010+00000001= 11111011 (le complément à2).
Et par conversion inverse, on aura :
On écrit 5 en binaire, soit : 11111011.
On inverse tous les bits, soit : 00000100 (le complément à 1).
On ajoute 1, soit 00000100+00000001= 00000101 (le complément à2) ce qui donne +5 ; c’est
logique car -(-5)=5 !
Sur un octet, et dans le cas des nombres signés, on obtient les nouvelles limites suivantes :
La plus grande valeur est ‘b01111111’, soit +127.
La plus petite valeur est ‘b10000000’, soit -128.
Remarquez que les opérations continuent de fonctionner. Prenons –3 + 5
B ’11111101’ (-3)
+ B ’00000101’ (5)
-----------------------------
= B’100000010’ (2)
Et là, on dit que ça ne fait pas 2 ? Et bien si, regardez bien, il y a 9 bits, or le processeur n’en gère que 8.
Le 9ème est donc tombé dans un bit spécial que nous verrons plus tard. Dans le registre du processeur, il
reste donc les 8 bits de droite, soit 2, qui est bien égal à (–3) + 5.
Maintenant, si vous avez bien suivi, vous êtes en train de vous poser la question suivante : Quand je vois
B’11111101’, est-ce que c’est –3 ou est-ce que c’est 253 ? Et bien vous ne pouvez pas le savoir sans
connaître le contexte.
Sachez que les nombres signifient uniquement ce que le concepteur du programme a décidé qu’ils
représentent. S’il travaille avec des nombres signés ou non, ou si cet octet représente tout autre chose. La
seule chose qui importe c’est de respecter les conventions que vous vous êtes fixées lors de la création de
cet octet. C’est donc au programmeur de décider de quoi il a besoin pour tel type de données.
VIII.Les opérations booliennes
Ce type d’opérations concerne ceux qui s’effectuent bit par bit sur un octet donné. Dans ce qui suit vous
trouvez un résumé des opérations indispensables à connaître dans la programmation de tout type
microcontrôleurs et essentiellement les PICs.
A. Le complément logique
C’est la négation ou l’inversion logique, ou le NOT en anglais, mais plus précisément le complément
à 1. Elle est souvent notée « ! » devant le nombre à inverser. Son fonctionnement tout simple consiste à
inverser tous les bits de l’octet. Des 1 deviendront des 0 et vis versa. A titre d’exemple, le NOT
B’10001111’ donne ‘B01110000 ‘.
Il est à noter que pour simplifier, avant de complémenter à 1 un nombre quelconque, il faut avant
tout le coder en binaire. Le complément sert généralement à lire une valeur dont les niveaux actifs ont été
inversés dont il faut l’inverser pour avoir la vraie valeur, à réaliser des nombres négatifs …etc.
B. Le ET (AND) logique
Un ET logique, AND et souvent noté &, est la multiplication bit à bit. Elle se réalise entre deux mots et elle multiplie chaque
bit du premier mot par le bit du même rang du second mot. D’où pour réaliser un opération ET logique, il faut disposer de
deux octets. La table de vérité d’une telle opération est présentée dans le tableau ci-après :
Bit1 Bit2 AND
0 0 0
0 1 0
1 0 0
1 1 1
Dr A. Zegaoui, UHBC ; Département d’’Electrotechnique, Laboratoire GEER 11
Polycopié --- cours de Microprocesseurs & Microcontrôleurs (Tome 01)
Par simple examen de la table de vérité, on remarque que la seule possibilité pour obtenir un « 1 » est que le Bit1
AND le Bit2 soient à « 1 ». Ce qui se fait normalement par une multiplication. 1*1 = 1, 0*1 = 0, 1*0 = 0. A titre
d’exemple, b’11001100’ AND b’11110000’ donne b’11000000’. De cet exemple, on peut utiliser cette opération
pour préparer le deuxième octet de l’opération comme un masque en vu de masquer (les rendre des 0) les bits de
l’octet qui n’intéressent pas notre application. Le masque b’11110000’ choisi dans notre exemple a permet de
garder le quartet du poids le plus fort dans l’octet b’11000000’.
En résumé, on peut donc à l’aide de cette opération logique positionner un ou plusieurs bits dans un mot à 0 sans
connaître son contenu précédent.
C. Le OU (OR) logique
Cette opération, notée généralement « | », manipule aussi deux octets et permet de positionner le résultat à 1 si
l’un des deux bits de même rang dans les deux octets est à1. Donc le bit du résultat est à 1 si le Bit1 OU le Bit2
est à 1.
La table de vérité de l’opération OR illustrant son fonctionnement est consignée dans le tableau suivant :
Bit1 Bit2 OR
0 0 0
0 1 1
1 0 1
1 1 1
Le ET logique sert, dans la programmation des microcontrôleurs, à forcer n’importe quel bit d’un octet à 1 via un
masque sans connaitre au préalable son contenu. A titre d’exemple, dans l’octet b’10001000’ on veut forcer son
sixième bit à 1 sans toucher le contenu restant. Pour cela on utilise l’opéartion avec comme masque l’octet
b’11000000’, et le résultat de l’opération sera bien sur b’11001000’.
D. Le OU‐EXCUSIF (Exclusif OR) ou XOR
Le XOR (eXclusif OR) assume la même fonction logique OR avec un détail en plus : Pour obtenir 1, il faut que
le Bit1 soit à 1 OU que le Bit2 soit à 1 à l’EXCLUSION des deux bits ensemble. Donc si les 2 bits sont à 1, alors
le résultat sera 0 conformément à la table de vérité ci-après. Elle opère sur deux octets.
Bit1 Bit2 XOR
0 0 0
0 1 1
1 0 1
1 1 0
Cette opération sert tout simplement à inverser un ou plusieurs bits dans un mot sans toucher aux autres avec la
technique de masque dans le deuxième mot. Comme exemple b’10001000’ XOR b’11000000’ donne le résultat
b’01001000’. L’exemple illustre bien l’inversion de l’état logique des deux bits du poids fort dans le premier octet.
IX. Architecture basique d’un microprocesseur
Le microprocesseur ( M.P.U. : MicroProcessor Unit ; C.P.U. : Central Processing Unit) est un circuit
intégré complexe (ensemble de millions de transistors) appartenant à la famille des Very Large Scale Intégration
(VLSI) capable d'effectuer séquentiellement et automatiquement des suites d'opérations élémentaires
(programme). Le microprocesseur remplit deux fonctions essentielles : le traitement des données et le contrôle du
système.
Le traitement de données se fait par l'unité de traitement (fonction est dédiée à l'U.A.L. : Unité Arithmétique et
Logique et ALU : Arithmetic and Logic Unit en anglais). Le traitement concerne la manipulation des données
sous formes de transfert (déplacement), opérations arithmétiques, opérations logiques.... Le contrôle du système
se traduit par des opérations de décodage et d'exécution des ordres exprimés sous forme d'instruction, c’est donc
le séquençage des opérations et c’est le rôle de l’unité de commande.
Un microprocesseur est qualifié par sa puissance qui est la capacité de traiter un grand nombre d'opérations par
seconde sur de grands nombres et en grande quantité. Cette puissance est principalement régie par les critères
suivants :
La longueur des mots : données et instructions (on parle de largeur du bus des données).
Le nombre d'octets que le microprocesseur peut adresser (on parle de largeur du bus des
adresses).
La vitesse d'exécution des instructions liée à la fréquence de fonctionnement de l'horloge de
cadencement exprimée en MHZ.
Dans une unité de traitement on distingue généralement trois éléments logiques principaux :
❒ Une Unité Arithmétique et Logique (U.A.L.)
❒ Un Accumulateur. et
❒ Des registres que l'on nomme couramment : Le Compteur d'Instructions (C.I.), le Registre
d'état, le Registre d'Instructions (R.I.), le Registre d'Adresses (R.A.) et le registre
temporaire des données.
Cet ensemble est interconnecté au travers de différents bus. On trouve trois types de bus :
❒ Le bus des données (bi-directionnel)
❒ Le bus des adresses (uni-directionnel)
❒ Le bus de contrôle (bi-directionnel)
X. LʹUnité Arithmétique et Logique
C’est un circuit complexe qui assure les fonctions logiques (ET, OU, comparaison …) ou arithmétiques (addition,
division, soustraction, …). Il permet donc de traiter et tester les données. Comme l’objectif est de développer un
programme qui gère une application voulue, toute instruction qui modifie une donnée fait toujours appel à l'UAL.
XI. Lʹaccumulateur ou le registre de travail
Le processeur utilise toujours des registres, qui sont des petites mémoires internes très rapides d'accès
utilisées pour stocker temporairement une donnée, une instruction ou une adresse. Chaque registre stocke 8,
16 ou 32 bits. Le nombre exact de registres dépend du type de processeur et varie typiquement entre une
dizaine et une centaine. Parmi les registres, le plus important est le registre accumulateur, qui est utilisé
pour stocker les résultats des opérations arithmétiques et logiques. L'accumulateur intervient dans une proportion
importante des instructions.
C'est le registre le plus important du microprocesseur, il sert systématiquement lorsque ce dernier aura besoin de
"manipuler" des données. La plupart des opérations logiques et arithmétiques sur les données font appel au
couple "UAL - accumulateur" selon la procédure établie en figure 02 suivante:
XII. L’unité de commande et de contrôle
C'est l'unité de control qui supervise le déroulement de toutes les opérations au sein du processeur. Elle est
constituée principalement de :
A. lʹhorloge :
C'est l'horloge qui génère les signaux qui permettent le cadencement et la synchronisation de toutes les
opérations. Attention, l'horloge n'est pas une montre au sens commun du terme, c'est juste un signal
carré qui a une fréquence fixe (3 Ghz par exemple), a chaque coup (front) d'horloge, le microprocesseur
(qui ne l'oublions pas n'est qu'un circuit électronique) réalise une tache élémentaire. L'exécution d'une
instruction nécessite plusieurs coups d'horloges.
B. Le compteur programme PC :
Le compteur programme (PC : program counter) est un registre (pointeur) qui contient l'adresse de la
case mémoire où est stockée le prochain élément d'instruction qui devra être chargé dans le processeur
pour être analysé et exécuté. Au début de l'exécution d'un programme, le PC est initialisé par le
système d'exploitation à l'adresse mémoire où est stockée la première instruction du programme. Le
compteur programme est incrémenté automatiquement chaque fois qu'un élément d'instruction est chargée
dans le processeur
D. Le décodeur
C'est lui qui va "décoder" l'instruction contenue dans RI et générer les signaux logiques correspondant et
les communiquer au séquenceur.
E. Le séquenceur
Il gère le séquencement des opérations et génère les signaux de commande qui vont activer tous les
éléments qui participeront à l'exécution de l'instruction et spécialement l'ALU.
XIII. Le registre dʹétat
Le registre d'état est formé de plusieurs bits appelés drapeaux ou indicateurs (Flags) qui sont positionnés
par l'ALU après chaque opération. Par exemple l’indicateur Z indique quand il est positionné que le
résultat de l'opération est égal à Zéro. L’indicateur C indique que l'opération a généré une retenue. Le
bit N indique que le résultat est négatif …
On dispose d'un jeu d'instructions conditionnées par l'état de différents drapeaux.
XIV. Le Compteur dʹInstructions
Le compteur d’instruction, appelé encore Compteur Programme (PC, Program Couter PC en anglais.) ou
Compteur Ordinal (C.O.) a pour mission de Pointer TOUJOURS le premier octet d'une instruction qui doit étre
exécutée après achèvement de l’exécution de l’instruction en cours. Un programme à exécuter est une succession
d'instructions ordonnées (chaque instruction peut prendre plusieurs octets) qui se trouve rangé dans une zone
mémoire, généralement à des adresses successives. Le PC repère toujours le premier octet de chaque instruction
du programme qui doit être exécutée. Le PC est connecté au bus interne des données. L’adresse de la première
instruction est à spécifiée par le programmeur via les directives du logiciel de programmation.
Cette adresse est transmise aux circuits mémoires par l'intermédiaire du bus d'adresse via le Registre d'Adresses.
Le PC pointe toujours l'adresse du début de l'instruction suivante. Il est possible de charger le PC avec une
adresse qui ne correspond pas au déroulement séquentiel du programme et ce par les détournements conditionnel
et inconditionnel (les GOTO conditionnés ou l’appel de sous-programme).
XV. Le registre dʹadresses
Le Registre d'Adresses, RA, sert d'interface entre le bus des données interne et le bus des adresses par un pilotage
du bus d'adresses du microprocesseur. Le RA se constitue d'une longueur de 16 bits, via deux registres huit bits
chacun (partie haute et partie basse). Son contenu provient de différentes sources : Le compteur d'instruction, un
registre général ou un emplacement mémoire. Son contenu d'adresse pointe la zone mémoire utile au
microprocesseur. Une fois que le premier octet de l'instruction en cours est décodé, le contenu du compteur
d'instructions est changé et va contenir l'adresse du début de l'instruction à venir. Le contenu du Registre
Dr A. Zegaoui, UHBC ; Département d’’Electrotechnique, Laboratoire GEER 16
Polycopié --- cours de Microprocesseurs & Microcontrôleurs (Tome 01)
d'adresses change. Il est à noter que le Compteur d’Instruction diffère du Registre d’Adresse. Ce changement
correspond : soit à une incrémentation du contenu afin de lire l'information complémentaire de l'instruction
en cours, soit à un chargement d'une nouvelle valeur correspondant à une nouvelle zone mémoire utilisée
temporairement par le microprocesseur (zone différente de celle où se trouve le programme). Cette nouvelle
valeur provient : soit d'une lecture en mémoire (directement ou indirectement selon les modes d'adressage
utilisés), soit d'un calcul (addition, ...).
XVI. Le Registre dʹInstructions (RI)
Le registre d'instructions contient le premier octet de l'instruction en cours d'exécution. Ce registre
est chargé pendant le cycle de base extraction-exécution. L'information r e ç u e v i a l e le bus des
données est utilisée par le décodeur d'instructions conformément au cycle de recherche exécution ci-après :
La donnée extraite de la mémoire est stockée dans le R.I. (c'est la phase extraction).
Ensuite ce contenu est interprété par le décodeur d'instructions qui agit alors sur la logique de contrôle
(c'est la phase exécution).
Cet octet indique au microprocesseur deux choses :
Une action (une lecture, une écriture ou autre ...)
Un lieu d'action (un registre, un accumulateur, une case mémoire...)
Le résultat de cette interprétation se traduit par des niveaux logiques sur le bus de contrôle.
XVII. Le registre dʹétat
Le registre d’état, Status Register en anglais, a pour mission de stocker les résultats des tests effectués par
l'UAL après traitement sur les données. C’est un registre à bits et chaque bit nous informe d’un état bien
spécifique du microprocesseur. Un état est un indicateur, drapeau ou flag en anglais. L'existence de ces
résultats permet d'écrire des programmes avec des branchements conditionnels (nouvelle adresse dans le CI).
En fonction de l'état des bits de ce registre le microprocesseur peut, alors, exécuter des programmes
différents. Le microprocesseur prend en quelque sorte des "décisions". Le nombre de ces bits diffère d’un
constructeur à autre mais les bits les plus couramment utilisés sont :
Le bit de retenue “Carry”: Ce bit est actif , dans le niveau logique haut, lorsque le huitième
bit du résultat de l'opération généré une retenue. Une addition de 255 et 1 sur un processeur 8 bits
génère un retenu ce qui active ce flag.
le bit de zero: Ce bit est actif lorsque l'opération a pour effet de mettre tous les bits d'un
accumulateur ou d'un registre à la valeur logique 0 (très utilisé pour réaliser des compteurs). Aussi
pour un processeur 8 bits, l’addition de 255 et 1 donne un résultat nul dans le registre W ce qui
provoque l’activation du bit Zéro du registre Status.
Le bit de signe: Information qui indique que le bit le plus significatif (MSB) du contenu de
l'accumulateur est un 1 logique et par suite on connait que le résultat est un nombre négatif.
XVIII. Les registres généraux
En plus des 6 registres de base que possèdent tous les microprocesseurs 8 bits, il peut en exister d'autres destinés
à faciliter la tâche du programmeur. On les nomme registres généraux. Sur notre schéma fonctionnel type, nous
avons 3 registres généraux B, C et D. Ce ne sont pas des registres puissants (tel un accumulateur) puisqu'ils
n'ont pas de liaison directe avec la sortie de l'U.A.L.
Ces registres peuvent néanmoins affecter le Registre d'Etat.
Parfois, ils peuvent constituer un registre 16 bits - appelé paire de registre (ex : BC chez Intel
ou D chez Motorola). Ainsi, il est possible de réaliser des opérations sur un mot (ex : incrémentation
de la paire).
XIX. Structure de la mémoire principale (MP)
La mémoire, figure 03, est divisée en emplacements (des cases mémoires contiguës) de taille fixe
(par exemple huit bits) utilisés pour stocker instructions et données. En principe, la taille d’un
emplacement mémoire pourrait être quelconque ; en fait, la plupart des ordinateurs en service
aujourd’hui utilisent des emplacements mémoire d’un octet (“ byte ” en anglais, soit huit bits, unité
pratique pour coder un caractère par exemple).
Seul le processeur peut modifier l'état de la mémoire. Chaque emplacement mémoire conserve les
informations que le processeur y écrit jusqu'à coupure de l'alimentation électrique, où tout le contenu est
perdu (contrairement au contenu des mémoires externes comme les disquettes et disques durs).
Les seules opérations possibles sur la mémoire sont :
écriture d'un emplacement : le processeur donne une valeur et une adresse, et la mémoire range la
valeur à l'emplacement indiqué par l’adresse ;
lecture d'un emplacement : le processeur demande à la mémoire la valeur contenue à
l'emplacement dont il indique l'adresse. Le contenu de l'emplacement lu reste inchangé.
Finalement la structure d’un microprocesseur se résume en figure 04.
Dr A. Zegaoui, UHBC ; Département d’’Electrotechnique, Laboratoire GEER 18
Polycopié --- cours de Microprocesseurs & Microcontrôleurs (Tome 01)
Figure 04 : structure de base d’un microprocesseur.
XX. Exécution d’un programme
Le travail d'un processeur est d'exécuter des programmes. Un programme est une suite d'instructions
écrites sur chaque ligne du programme. Une instruction peut être écrite sous différents langages de
programmation. Pour un langage de bas niveau comme l'assembleur, une instruction réalise une tache
élémentaire comme une addition par exemple. Avec un langage évolué de haut niveau comme le langage
Basic ou le C, une instruction peut réaliser un ensemble de taches qui nécessiterait plusieurs instructions
en Assembleur.
Un processeur quel qu'il soit sait exécuter un ensemble bien défini de codes machines connu sous le
jeu d'instructions. Chaque code machine est un nombre binaire de quelques octets, il correspond à une
instruction élémentaire bien définie. Sur papier, on a pris l'habitude de les représenter en hexadécimal
pour faciliter.
Par exemple, l'instruction en assembleur MOVF f,d tirée du Datasheet du microprocesseur du PIC
16F84 signifie : déplacer l’octet ‘f’ et placer le résultat dans la destination ‘d’. le code machine qui réalise
cette instruction est ’00 1000 dfff ffff’. Ce codage de l’opération est appelé OPCODE.
De nos jours, les informaticiens et les programmeurs des microprocesseurs, disposent d'un choix très
important de langages de programmation différents les uns des autres : Assembleur, Basic/Qbasic, Pascal,
C/C++, Visual Basic, Visual C++, Delphi, Java, … pour l’élaboration des différentes applications. En
fait, les lignes de programme que nous écrivons constituent ce qu'on appelle un programme source qui
sera stocké dans un fichier texte dont l'extension dépend du langage choisi (test.c pour le C, test.pas pour
le pascal, test.cpp pour le c++ etc.)
Ces programmes sources sont compréhensibles par nous mais pas par le processeur. Pour que le
processeur puisse les comprendre il faut les traduire (compiler) en langage machine qui est une suite de
codes machine. Sur les PCs, se sont les fichiers avec l'extension .exe (test.exe). Chaque langage de
programmation a son compilateur qui permet de transformer le programme source en un programme
exécutable compréhensible par le processeur. Tous les exécutables se ressemblent et le processeur ne sait
pas avec quel langage ils ont été écrits.
Avec un langage de haut niveau comme le C++, une instruction que nous écrivons peut être très
sophistiquée. C'est le compilateur C++ qui la traduit en un ensemble d'instructions élémentaires
compréhensible par le processeur.
L'intérêt du langage assembleur est que chaque instruction que nous écrivons correspond à une
instruction élémentaire du processeur. C'est comme si on travaillait directement en langage machine.
Ainsi, on sait exactement tout ce que fait le processeur lors de l'exécution d'un programme.
XXI. Les mémoires
Une mémoire est un composant électronique à base de semi-conducteurs permettant de stocker
(enregistrer, conserver et restituer) des informations (instructions ou variables) sous forme binaire. Ces
informations peuvent alors être écrites ou lues. La capacité de mémorisation détermine la polyvalence des
systèmes numériques et leur adaptabilité a de nombreuse situations. De nos jours, il existe des mémoires
à lecture seule appelées ROM (Read Only Memery) et d’autres à lecture/écriture improprement appelées
RAM (Random Access Memory). Le contenu d’une ROM, fixé lors de la fabrication, reste dans la
mémoire même en absence d’alimentation. Au contraire une RAM perd son contenu une fois mise hors
secteur et du coup se sont des mémoires volatiles.
Entre les deux types précédents de mémoires, existe un autre type qui ne perd pas son contenu une
non-alimenté mais ce dernier peut être modifiable par un processus industriel. A titre d’exemple, le
contenu d’une EPROM est effacé par une exposition aux rayons ultra-violets et un nouveau contenu peut
être écrit via un appareil spécialisé, les EEPROM peuvent être électriquement reprogrammées et les
mémoires flash, les EEPROM, sont rapide à reprogrammer.
Actuellement, Il existe deux types de mémoires qui se distinguent par leur technique de fabrication :
les mémoires dynamiques et les mémoires statiques. Il s’agit dans les deux cas de mémoires volatiles qui
nécessitent une alimentation pour conserver leur contenu. La mémoire dynamique est appelée DRAM
(Dymanic RAM) par opposition à la mémoire statique appelée SRAM (Static RAM). Vue leur moindre
coût et densité supérieure d’intégration, les DRAMs sont plus utilisées comme des mémoires principales
dans les ordinateurs par contre les SRAMs sont utilisées pour les caches en raison de leurs plus grande
vitesse.
Lente Rapide
Mécanisme de rafraîchissent
XXII. Organisation d’une mémoire
Le rangement d’informations dans une mémoire peut être vu sous forme d’une grille, tableau ou
matrice de dimension km. Chaque élément de la matrice est un bit. Chaque ligne de la matrice
correspond à une adresse mémoire, c'est-à-dire un emplacement mémoire et chaque colonne représente
Dr A. Zegaoui, UHBC ; Département d’’Electrotechnique, Laboratoire GEER 21
Polycopié --- cours de Microprocesseurs & Microcontrôleurs (Tome 01)
un des bits de l’information stockée. Donc dans une mémoire km bits on aura 2k emplacement (adresses
ou parfois cases mémoires) mémoire et que chaque adresse abrite un mot de données de m bits (8, 16, 32
bits…). Le nombre de fils d’adresses d’un boîtier mémoire définit donc le nombre de cases mémoire que
comprend le boîtier. Le nombre de fils de données définit la taille des données que l’on peut sauvegarder
dans chaque case mémoire.
En plus du bus d’adresses et du bus de données, un boîtier mémoire comprend une entrée de commande
qui permet de définir le type d’action que l’on effectue avec la mémoire (lecture/écriture) et une entrée
de sélection qui permet de mettre les entrées/sorties du boîtier en haute impédance comme indiqué en
figure XXX.
Adresses
(K cases mém)
Données
R/W Mémoire (k bits)
CS
Une opération de manipulation de la mémoire (lecture/écriture) suit toujours le cycle illustré en figure
06 de haut en bas.
sélection de l’adresse
XXIII. Caractéristiques d’une mémoire
Les caractéristiques principales et communes à toutes les mémoires sont :
La capacité : exprimée souvent en octet, c’est le nombre total de bits que contient la
mémoire.
Le format des données : c’est le nombre de bits que l’on peut mémoriser par case mémoire
ou tout simplement c’est la largeur du mot mémorisable.
Le temps d’accès : c’est le temps qui s'écoule entre l'instant où a été lancée une opération de
lecture/écriture en mémoire et l'instant où la première information est disponible sur le bus de
données.
Le temps de cycle : il représente l'intervalle minimum qui doit séparer deux demandes
successives de lecture ou d'écriture.
Dans une mémoire magnétique, pour accéder à une adresse ciblé, il faut dérouler la bande magnétique
jusqu’à ce que l’on trouve l’enregistrement adéquat. Cela veut dire que l’accès à l’information est
séquentiel or le temps d’accès est variable selon la position de l’information recherchée. Par contre, dans
les mémoires principales utilisées dans les systèmes à microprocesseurs sont à base de transistors, et que
le temps mis pour obtenir n’importe quelle information ne dépend pas de son adresse. L’accès à une telle
mémoire est aléatoire ou direct.
XXIV. Types de mémoires
Les mémoires contiennent les programmes qui sont une série d’instruction en langage assembleur,
codées en binaires et des données qui sont des informations utilisables au cours de l’exécution du
programme.
Les caractéristiques de choix d’une mémoire sont : sa taille physique, sa vitesse (environ quelques
dizaines de ns), sa consommation et ses niveaux logiques. L’idéal est qu’elle soit à faible prix et à vitesse
élevée.
A. Mémoires mortes (ROMs)
Ce sont des mémoires à lecture seule. L’écriture dans ce genre de mémoires nécessite un
programmateur ou une procédure assez longue que les RAMs et les informations stockées sont conservées
même lors d’une coupure subite de l’alimentation.
La figure 07 présente les différents types de mémoires mortes. Tous ces types seront définis brièvement
ci-après.
ROM
Mémoires
mortes
PROM FPROM
OTP
EPROM FPROM
OTP
EPROM
ROM (Read Only Memory): Ce sont des mémoires à masque de fabrication de diodes disposées sur
un réseau de lignes et de colonnes ou de transistors. Programmées à l’usine, elles ne peuvent pas être
reprogrammées.
PROM à fusibles ou FPROM (Programmable Read Only Memory ou Fuse PROM) sont réalisées à
partir de transistors bipolaires dont leurs liaisons entre l'émetteur et la colonne sont effectuées par
l’intermédiaire d’un fusible. Ce genre est à programmer par l’utilisateur et ne peuvent pas être
reprogrammées.
EPROM (Erasable Programmable Read Only Memory) en plus des avantages des PROM, ces
mémoires possèdent la possibilité de l'effacement des données par l'utilisateur.
OTP MEMORY (One Time Programmable MEMORY): programmable une seule fois à l’aide d’un
programmateur.
UVPROM (EPROM effaçable par une exposition aux ultraviolet U.V.). Ce type de mémoire est placé
dans un boîtier céramique avec fenêtre de quartz effaçable aux U.V.
EEPROM ou E2PROM (Erasable Electricaly PROM) : sont des sortes de mémoires effaçables et
reprogrammables électriquement.
EPROM FLASH : effaçable électriquement, écriture plus rapide que les EEPROM mais effacement
de toute la capacité de la mémoire en un coup. En raison de sa vitesse élevée, de sa durabilité et de sa
faible consommation, la mémoire flash est idéale pour de nombreuses applications : comme les appareils
photos numériques, les téléphones cellulaires, les imprimantes, les ordinateurs portables, les récepteurs
d’ondes radio de poche et les dispositifs d’enregistrement sonore.
B. Mémoires vives (RAMs) :
Les mémoires vives sont volatiles à accès direct. Elles nécessitent une énergie pour stocker et garder
les données. Il existe deux types de mémoires vives : statiques et dynamiques.
C. Les RAM statiques (SRAM) :
La réalisation interne est essentiellement faite par une matrice de bascules, figure 08 :
Figure 08 : RAM avec 2n emplacement mémoires (mots) et chaque mot est à m bits.
D. Les RAM dynamiques (DRAM) :
Dans cette catégorie de mémoires, les niveaux logiques sont stockés sous forme de charges électriques
dans des condensateurs. Comme le condensateur se décharge à travers des résistances de fuite, le maintien
de l’information est réalisé par une réécriture de façon régulière. Ce procédé est appelé un
rafraîchissement et qui devra se faire environ toute les deux millisecondes.
XXV. Les Microcontrôleurs : Le PIC 16F84
XXVI. Introduction
Un PIC (Programmable Interface Controller) est un microcontrôleur de chez Microchip, la société
américaine Technology à l’arizona. Ses caractéristiques principales sont :
Utilisation d'un jeu d'instructions réduit, d'où le nom de son architecture : RISC (Reduced
Instructions Set Construction). Les instructions sont ainsi codées sur un nombre réduit de bits, ce
qui accélère l'exécution (1 cycle machine par instruction sauf pour les sauts qui requirent 2 cycles).
En revanche, leur nombre limité oblige à se restreindre à des instructions basiques, contrairement
aux systèmes d'architecture CISC (Complex Instructions Set Construction) qui proposent plus
d'instructions donc codées sur plus de bits mais réalisant des traitements plus complexes.
Il existe trois familles de PIC : -Base-Line : Les instructions sont codées sur 12 bits, -Mid-Line : Les
instructions sont codées sur 14 bits et, -High-End : Les instructions sont codées sur 16 bits.
yy : Identification
A titre d’exemple, un PIC 16F84 –10, s’identifie comme : 16 signifie que le PIC est de la famille Mid-
Line ; F le PIC a une mémoire programme de type FLASH ; son type est 84 ainsi que 10 veut dire
utilisation d’un Quartz à 10MHz au maximum.
XXVII. Le Microcontrôleur 16F84
Le 16F84 est un microcontrôleur à 08 bits avec un boîtier est un DIL (Dual In Line) de 2x9 pattes. En
dépit de sa petite taille, il est caractérisé par une architecture interne qui lui confère souplesse et vitesse
incomparables. Avec un examen de sa fiche technique, le Datasheet, ses principales caractéristiques sont :
XXVIII. Brochage et fonctions des différentes pattes
La Figure 09 montre le brochage du circuit. Les fonctions des pattes sont les suivantes :
XXIX. Architecture générale
La Figure 10 présente l'architecture générale du circuit. Il est constitué des éléments suivants :
XXX. Organisation de la mémoire
Les PICs contiennent une mémoire de programme et une mémoire de données. La structure Harvard
des PICs fournit un accès séparé à chacune. A signaler que pendant le même cycle machine, un accès aux
deux types est possible.
XXXI. Mémoire de programme
Une fois chargée par un programmateur hard dans le corps du PIC par la liaison série, c'est elle qui
contient le programme à exécuter. L’organisation de cette mémoire est représentée dans la Figure 11. Elle
contient 1k "mots" de 14 bits dans le cas du PIC 16F84, même si le compteur de programme (PC) de 13
bits peut en adresser 8k. L'adresse 0000h contient le vecteur du RESET, l'adresse 0004h contient l'unique
vecteur d'interruption du PIC. La pile contient 8 valeurs. Comme le compteur de programme, elle n'a pas
d'adresse dans la plage de mémoire. Ce sont des zones réservées par le système.
XXXII. Mémoire de données
La mémoire de donné (Data Memory) est composée de deux parties formant la RAM et une zone
EEPROM. La première contient les registres SFRs (Special Function Registers) qui permettent de
contrôler les opérations sur le circuit. La seconde contient des registres généraux, libres pour l'utilisateur
(programmeur). La dernière contient 64 octets. Il est à signaler que les instructions orientées octets ou bits
contiennent une adresse sur 7 bits pour désigner l'octet avec lequel l'instruction doit travailler. Comme à
titre d’exemple et consigné sur la Figure 12, le registre TRISA d'adresse 85h est inaccessible avec une
Dr A. Zegaoui, UHBC ; Département d’’Electrotechnique, Laboratoire GEER 31
Polycopié --- cours de Microprocesseurs & Microcontrôleurs (Tome 01)
adresse sur 7 bits. C'est pourquoi le constructeur a défini deux banques. Le bit RP0, 5ième bit du registre
d'état (STATUS_Reg) permet de choisir entre les deux. Ainsi, une adresse sur 8 bits est composée de RP0
en poids fort et des 7 bits provenant de l'instruction à exécuter.
XXXIII. Registres généraux
Ils sont accessibles soit directement soit indirectement à travers les registres FSR et INDF (Voir les
modes d’adressage).
A. Registres spéciaux – SFRs (Special Function RegisterS)
La Figure 13 résume la fonction de chacun des bits de registres SFRs. Le SFRs sont des registres qui
permettent la gestion du PIC dont certains ont une fonction générale et d'autres une fonction spécifique
attachée à un périphérique donné. En banque 0 (page mémoire 0) ils sont situés de l'adresse mémoire 00h
à l'adresse 0Bh par contre sont situés de l'adresse 80h à l'adresse 8Bh dans la banque 1 (deuxième page
mémoire). Les adresses mémoires 07h et 87h ne contiennent aucun registre.
B. Description des registres FSRs
Nom du Adresse Fonction
registre Mémoire
STATUS 03h-83h Il contient l'état de l'unité arithmétique et logique ainsi que les bits
de sélection des banques (Figure* III.4).
PORTA 05h Donne accès en lecture ou écriture au port A, 5 bits. Les sorties
sont à drain ouvert. Le bit 4 peut être utilisé en entrée de comptage.
PORTB 06h Donne accès en lecture ou écriture au port B. Les sorties sont à
drain ouvert. Le bit RB0 peut être utilisé en entrée d'interruption.
PCLATCH 0Ah-8Ah Donne accès en écriture aux bits de poids forts du compteur de
programme.
C. Détail des registres STATUS et OPTION
Les figures 14 et 15 présentent les registres SFRs à utilisation très importante. Il est à noter que ce sont
des registres à bits. Ces registres seront revus plus loin dans le document.
XXXIV. Mémoire EEPROM
Le PIC possède une zone EEPROM de 64 octets accessibles en lecture et en écriture par le programme.
On peut y sauvegarder des valeurs, qui seront conservées même si l'alimentation est éteinte, et les
récupérer lors de la mise sous tension. Leur accès est spécifique et requiert l'utilisation de registres dédiés.
La lecture et l'écriture ne peut s'exécuter que selon des séquences particulières.
XXXV. Jeu dʹinstructions
Les PICs sont conçus pour être programmés avec un nombre d'instructions réduit ce qui leur qualifie
par une architecture RISC (Reduced Instruction Set Computer). Cette réduction permet de limiter la taille
de leur codage et donc de la place mémoire et du temps d'exécution. La format général d’une instruction
est consigné en figure 16.
Toutes les instructions sont codées sur 14 bits. Elles sont regroupées en trois grands types
NB : pour d=0 résultat opération stocké dans registre W et pour d=1 résultat stocké dans registre f.
La plupart des instructions opèrent en utilisant le registre de travail W (Working register) comparable
à l’accumulateur des anciens microprocesseurs, et soit un registre file soit une valeur immédiate codée
XXXVI. LʹALU et le registre W
C'est une ALU 8 Bits qui réalise les opérations arithmétique et logique entre le registre de travail W
(l’accumulateur) et n'importe quel autre registre 'File' ou constante (Literal) k. L'accumulateur W est un
registre de travail 8 bits, il n'a pas d'adresse comme les autres SFR. Pour les instructions à deux opérandes,
c'est toujours lui qui contient un des deux opérandes. Pour les instructions à un opérande, celui-ci peut
être soit W soit n'importe quel registre F. Le résultat de l'opération peut être placé soit dans le registre de
travail W soit dans le registre F.
XXXVII. LʹHorloge
L'horloge peut être soit interne soit externe. L'horloge interne est constituée d'un oscillateur à quartz
ou d'un oscillateur RC ce qui est illustré en figure 18.
Avec l'oscillateur à Quartz, on peut avoir des fréquences allant jusqu'à 4, 10 ou 20 MHz selon le type
de µC. Le filtre passe bas RS-C2 limite les harmoniques dus à l’écrêtage et Réduit l’amplitude de
l’oscillation. (il n'est pas obligatoire). Avec un oscillateur R-C, la fréquence de l'oscillation est fixée par
Vdd, Rext et Cext. Elle peut varier légèrement d'un circuit à l'autre. Dans certaines applications, une
horloge externe au microcontrôleur peut être utilisée pour synchroniser le PIC sur un processus
particulier.
Quelque soit l'oscillateur utilisé, l'horloge système dite aussi horloge instruction est obtenue en
divisant la fréquence par 4. Ce qui est illustré dans les datasheets par le terme Fosc/4 pour désigner
l'horloge système.
Avec un quartz de 4 MHz, on obtient une horloge instruction de 1 MHz, soit le temps pour exécuter
une instruction de 1µs. par contre si on utilise un quartz de 20 MHz pour cadenser le PIC, l’orlige
instruction sera de 5 MHz soit un temps de 0,2 µs danc plus rapide !
XXXVIII. Le port dʹ E/S PORTA
Le port A désigné par PORTA est un port de 5 bits (RA0 à RA4). Chaque E/S est compatible TTL.
La configuration de direction pour chaque bit du port est déterminée avec le registre TRISA.
Le bit de rang i du TRISA = 0 oblige le bit du rang i du PORTA d’être configuré en sortie
Le bit de rang i du TRISA = 1 oblige le bit du rang i du PORTA d’être configuré en entrée
On remarque aussi que la broche RA4 est multiplexée avec l'entrée horloge du Timer0 (TMR0). Elle
peut donc être utilisée soit comme Entrée/Sortie (E/S) normale du port A, soit comme entrée horloge
pour le Timer0. Le choix se fait à l'aide du bit T0CS du registre OPTION_REG.
RA4 est une E/S à drain ouvert, si on veut l'utiliser comme sortie (pour allumer une LED par
exemple), il ne faut pas oublier de mettre une résistance externe vers Vdd. La figure 19
schématise le principe d'une sortie drain ouvert (ou collecteur ouvert). Si RA4 est positionnée à
0, l'interrupteur est fermé, la sortie est reliée à la masse, alors que si RA4 est placée à 1,
l'interrupteur est ouvert, la sortie est déconnectée d'où la nécessite de la résistance externe pour
amener le courant de l'alimentation vers la LED. La valeur de 330 Ω est donnée à titre indicatif.
Vd
330 Ω
LED
XXXIX. Le port dʹ E/S PORTB
Le port B désigné par PORTB est un port bidirectionnel de 8 bits (RB0 à RB7). La
configuration de direction se fait à l'aide du registre TRISB pareil que le TRISA. En entrée, la
ligne RB0 appelée aussi INT peut déclencher une interruption externe dite RB0 INTERRUPT.
En entrée aussi, une quelconque des lignes RB4 à RB7 peut déclencher l'interruption RBI
INTERRUPT.
XL. Le Timer TMR0
Le timer0 est un registre à huit bits. Il peut assurer la fonction compteur et la fonction
temporisateur. Il est incrémenté en permanence soit par l’horloge interne Fosc/4 (mode timer)
soit par une horloge externe appliquée à la broche RA4 du port A (mode compteur). Le choix de
l'horloge se fait à l'aide du bit T0CS du registre OPTION_REG. En fonctionnement en mode
timer le bit TOCS du registre OPTION est mis à 0, et là le Tmr0 fonctionne par horloge interne.
Si le TOCS est mis à 1, le Tmr0 fonctionne en mode compteur par horloge externe appliquée à
RA4. Dans le cas de l'horloge externe, le choix du front du signal d’horloge sur lequel le TIMER
s'incrémente se fait via le bit TOSE du registre OPTION :TOSE = 0, incrémentation sur fronts
montants et TOSE = 1, incrémentation sur fronts descendants. Avec un cadencement de 4MHz,
pour faire clignoter une LED à une fréquence de 1Hz, il nous faut à peu près de 2000
débordement du timer0. Pour faciliter la tâche, les concepteurs ont fait recours à la notion de
prédiviseur qui n’est autre d’un diviseur d’évènements de l’horloge. Quelque soit l'horloge
choisie, on peut la passer dans un diviseur de fréquence programmable (prescaler) dont le rapport
est fixés par les bits PS0, PS1, PS2 et PSA du registre OPTION_REG (voir datasheet).
L'affectation ou non du prédiviseur se fait à l'aide du bit PSA du registre OPTION_REG : PSA
= 0, le prédiviseur est affecté au Timer0 mais si PSA = 1, pas de prédiviseur pour le timer0 car
il sera affecté au chien de garde.
Pour un PSA=0, le tableau suivant donne la valeur du prédiviseur au cas par cas (tiré du
datasheet).
Le prédiviseur des modules timer0/WDT (Watch Dog Timer : Chien de garde) du 16F84 est
organisé conformément à la figure 20.
Le contenu du timer TMR0 est accessible par le registre tmr0 situé à la banque0 à l’adresse
01h. Il peut être lu ou écrit à n'importe quel moment. Après une écriture, l'incrémentation est
inhibée pendant deux cycles machine. Donc il faut tenir compte de ces deux cycles machines
dans le calcul exact du temps. Au débordement de TMR0 (passage de FF à 00), le drapeau T0IF
est placé à 1. Ceci peut déclencher l'interruption T0I si celle-ci est validée dans le registre
INTCON.
L'horloge du WDT est ajustée par le fabricant pour que Le Time-Out (le débordement du
WDT) sera atteint toutes les 18 ms. Par une programmation du bit PSA à 1 du registre OPTION,
on affecte au WDT un prédiviseur conformément au tableau ci-après. Le rapport du prédiviseur
est fixé par les bits PS0, PS1 et PS2 du registre OPTION_REG.
Pour éviter une possible Reset du microcontrôleur d’une façon répétée, il faut utiliser le WDT
avec beaucoup précaution. Pour éviter un débordement du WDT lors de l'exécution d'un
programme, deux possibilités se présentent : la première est d’inhiber le WDT d'une façon
permanente en mettant à 0 le bit WDTE dans l'EEPROM de configuration et la seconde est de
remettre le WDT à 0 périodiquement dans le programme à l'aide de l'instruction CLRWDT.
XLII. Le mode SLEEP
Dans les PIC, le mode SLEEP inhibe l’horloge système ce qui provoque l’arrêt de l’exécution
du programme. Dans ce mode le PIC fonctionne avec consommation et ce à l'aide de l'instruction
SLEEP. Pour sortir du mode SLEEP, il faut provoquer un WAKE-UP par l’intermédiaire de
l’une des possibilités suivantes :
Provoquer un RESET externe par une mise de l’entrée MCLR au niveau logique 0 et du coup le
PIC reprend l'exécution du programme à partir du début ;
Un débordement du WDT si celui-ci est validémais ici le PIC reprend le programme à partir de
l'instruction qui suit l'instruction SLEEP ;
Aussi une interruption INT (sur RB0), RBI (sur RB4-RB7) ou EEI (fin d'écriture en EEPROM
de données) provoque le Wake-up. Le bit de validation de l'interruption en question doit être
validé, par contre, le WAKE-UP aura lieu quelque soit la position de bit de validation globale
GIE. Deux cas alors sont possibles:
GIE = 0, Le PIC reprend l'exécution du programme à partir de l'instruction
qui suit l'instruction SLEEP, l'interruption n'est pas prise en compte ;
GIE = 1, Le PIC exécute l'instruction qui se trouve juste après l'instruction
SLEEP puis se branche à l'adresse 0004 pour exécuter la procédure
d'interruption. Il est conseille, que dans le cas où l'instruction suivant SLEEP
n'est pas désirée, d’utiliser l'instruction NOP.
XLIII. La mémoire EEPROM de configuration
Durant la phase de chargement du programme dans la mémoire programme du PIC, on
programme aussi une EEPROM de configuration constituée de cinq mots de 14 bits dont :
b1 b1 b1 b1 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0
3 2 1 0
CP CP CP CP C C C C C C PWRT WDT FOSC FOSC
P P P P P P E E 1 0
Avec :
bits 1-0 FOSC1-FOSC0, Sélection du type d'oscillateur pour
l'horloge
- 11 : Oscillateur RC
- 10 : Oscillateur HS (High speed) : quartz haute fréquence
(jusqu'à 10 MHz)
- 01 : Oscillateur XT, c'est le mode le plus utilisé, quartz jusqu'à 4
MHz
- 00 : Oscillateur LP (Low power), consommation réduite, jusqu'à
200 kHz
bit 2 WDTE, validation du timer WDT (chien de garde)
- 1 : WDT validé
- 0 : WDT inhibé
bit 3 PWRTE, validation d'une temporisation à la mise sous tension
- 1 : temporisation inhibée
- 0 : temporisation validée
bit 13-4 CP, Protection en lecture du code
programme
- 1 : pas de protection
- 0 : protection activée
XLIV. La mémoire EEPROM de données
La mémoire EEPROM de données est constituée de 64 octets commençant à l'adresse 0x2100
que l'on peut lire et écrire depuis un programme. Ces octets sont conservés après une coupure
de courant et sont très utiles pour conserver des paramètres semi permanents. On y accède à
l'aide des registres EEADR et EEDATA: toute lecture écriture dans le registre EEDATA se fait
dans la position mémoire pointée par EEADR. En fait EEADR contient l'adresse relative par
rapport à la page qui commence en 0x2100, autrement dit, l'adresse va de 0 à 63. Deux registres
de contrôle (EECON1 et EECON2) sont associés à la mémoire EEMROM. La durée d’écriture
d’un octet est de l’ordre de 10 ms, la fin de chaque écriture réussie est annoncé par le drapeau
EEIF et la remise à zéro du bit RW du registre EECON1. Le drapeau EEIF peut déclencher
l'interruption EEI si elle a été validée.
XLV. Les interruptions
Une interruption provoque l’arrêt du programme principal pour aller exécuter une procédure
d'interruption (sous-programme). A la fin de cette procédure, le microcontrôleur reprend le
programme à l’endroit où il s’était arrêté et ce par enregistrement de l’adresse de retour dans la
pile du système par le CP. Le PIC16F84 possède quatre sources d'interruption (INTRB0, PortB,
Timer0, et écriture sur EEPROM). A chaque interruption sont associés deux bits : un bit de
validation et un drapeau (flag). Le premier permet d'autoriser ou d’interdire l'interruption, le
second permet au programmeur de savoir le type de cette interruption. Tous ces bits sont dans
le registre INTCON à part le drapeau EEIF de l'interruption EEI qui se trouve dans le registre
EECON1.
XLVI. Modes dʹadressages
Le mode d’adressage est la façon d’accéder à une donnée qui sera utile dans le programme.
Il existe trois grands types d'accès à une donnée (figure 22) :
comme un autre nom de FSR, utilisé pour accéder à la donnée elle-même, FSR servant à choisir
l'adresse.
A. Lʹadressage indirect
L'adressage indirect se fait par l'intermédiaire des registres FSR et INDF. Le registre INDF
n'est pas un vrai registre mais représente la case mémoire pointée par le registre d'index FSR.
Pour lire ou écrire dans une case mémoire en utilisant l'adressage indirect, on commence par
placer l'adresse dans le registre FSR, ensuite on lit/écrit dans le registre INDF.
XLVII. Le compteur programme
Le Program Counter est un registre de 13 bits qui s'incrémente automatiquement lors de
l'exécution du programme. On peut toutefois le modifier par programme pour réaliser ce qu'on
appelle un goto calculé. On y accède par les registres PCL et PCLATH :
PCL (8 bits) est la partie basse de PC, il est accessible en lecture écriture
PCH (5 bits) est la partie haute de PC, il n'est pas accessible directement. On peut toutefois le
modifier indirectement à l'aide du registre PCLATH qui est une registre SFR accessible
en lecture écriture et où seuls 5 bits sont utilisés.
XLVIII. Détail des 35 instructions du 16F84
ADDLW : ADD Literal to W
Additionne le contenu du registre W à l’octet situé (en mémoire RAM) à l’adresse indiquée
de suite (adresse comprise entre 0C et 4F). Le résultat peut être placé soit dans le registre W si
d=0, soit dans la mémoire RAM à la place de l’octet utilisé pour faire l’addition si d=1. Le
résultat écrase toujours l’ancienne valeur de la destination d. Cette instruction affecte 3 bits du
registre d’état : le flag C, le flag DC et le flag Z et elle consomme éventuellement un cycle
d’horloge.
ADDWF,0 ;
L’exemple le contenu du registre correspond à l’adresse mémoire mavariable sera mis dans
W, puis additionne mavariable au contenu de W, et range le résultat dans W. si à la place de W
on trouve 1 ou f le résultat sera rangé dans mavarible.
Cette instruction effectue l’opération logique ET (AND) entre la valeur immédiate du literal
et l’octet se trouvant dans le registre W. Le literal doit être un mot de 8 bits (de 00 à FF)
l’instruction affecte le bit Z du registre d’état et en matière de temps consomme un cycle
d’horloge. Il faut revoir la table de vérité d’une porte ET dans le cours de Logique et Calculateur.
01111010 (octet)
00100000 (masque)
Ce qui donne après le 00100000 (résultat)
Le résultat de l’opération permet donc bien de récupérer uniquement le bit 5 de
l’octet : ici c’est un 1 (00100000).
Cette instruction effectue l’opération logique ET (AND) entre l’octet se trouvant dans le
registre W et l’octet situé (en mémoire RAM) à l’adresse indiquée de suite (adresse comprise
entre 0C et 4F) ; avec comme résultat stocké dépendant de la valeur allouée à d. elle affecte le
bit Z du registre STATUS et consomme un cycle d’horloge.
Exemples de programmation :
ANDWF,0 Adresse
L’exemple effectue un ET logique entre l’octet se trouvant dans W et l’octet se trouvant à
Adresse, et range le résultat dans W. la table de vérité de la porte ET doit être révisée.
Cette instruction sert lorsque, dans un octet, on a besoin de récupérer un bit en particulier (ou
certains bits en particulier). Pour ce faire, il suffit de préparer un masque d’un octet composé de
0 aux emplacements où se trouvent les bits à éliminer et de 1 aux emplacements où se trouvent
les bits à récupérer. Si à titre d’exemple, on souhaite récupérer uniquement le bit 4 de l’octet
01111010, on prépare le masque 00010000 et on fait un ET logique entre l’octet et le masque.
Comme ceci :
01111010 (octet)
00010000 (masque)
C’est une instruction orientée bit, qui met à zéro le bit désigné de l’octet situé (en
mémoire RAM) à l’adresse indiquée de suite (adresse comprise entre 0C et 4F). elle n’affecte
pas le registre d’état STATUS et consomme un cycle d’horloge.
Exemples de programmation :
On suppose que l’adresse mémoire 24 contient l’octet 00001111, et que l’on veuille mettre à
zéro (Clear) le bit 2. Pour cela on écrit dans notre programme :
BCF 24,2 ;
A l’inverse de l’instruction BCF, l’instruction BSF met à 1 (Set) le bit désigné de l’octet situé
à l’adresse mémoire indiquée de suite (adresse comprise entre 0C et 4F). pareil, cette instruction
n’affecte aucun bit du registre STATUS et consomme un cycle d’horloge.
BSF 24,2 ;
On aura la valeur initiale de l’octet qui était de 00001111 avant qu’il soit manipulé par
l’instruction BCF.
C’est une instruction de contrôle orientée bits. Elle vérifie l’état logique du bit désigné de
l’octet situé à l’adresse mémoire, en RAM, indiquée de suite (adresse comprise entre 0C et 4F).
si le bit testé est à zéro l’instruction suivant BTFSC sera ignoré et par voie de conséquence sautée
et ne sera pas exécutée. L’instruction n’affecte aussi aucun bit du registre d’état STATUS et
selon que la réponse soit OUI ou NON, l’instruction prend 1 ou 2 cycles d’horloge.
Généralement l’instruction opère conformément à l’organigramme de traitement ci-après en
figure 23 :
Teste le bit concerné
par BTFSC/BTFSS
OUI
Est‐ce le bit
testé est à 0/1
NON
Instruction 01
Instruction 02
(Sauter instruction 01)
Exemple de programmation : En supposant que l’octet dont on veut tester un bit soit situé
dans le PORTB. On veut tester l’état de la pin RB3 du registre PORTB. Si elle est à zéron on
allume une LED dans la broche RA3 du registre PORTA si on l’éteint. Pour cela il suffit d’écrire
dans notre programme :
BTFSC PORTB,3
A contrario de l’instruction BTFSC, l’instruction BTFSS vérifie l’état logique du bit désigné
de l’octet situé à l’adresse mémoire indiquée de suite (adresse comprise entre 0C et 4F). si ce bit
est à 1, ignore l’instruction suivante. Selon que le bit testé est 1 ou à 0, l’instruction prend 1 ou
2 cycles d’horloge. L’organigramme de traitement reste le même que celui indiqué sur la figure
999333.
Tout sous-programme appelé par l’instruction CALL doit obligatoirement se terminer soit
par l’instruction RETURN, soit par l’instruction RETLW qui permettront le renvoi au
programme principal à la fin du sous-programme. Cette instruction prend deux cycles d’horloge.
L’instruction CALL fait toujours revenir le programme principal à l’endroit où il avait été
abandonné ; tandis que l’instruction GOTO provoque l’abandon total de la séquence et peut
conduire soit à une toute autre action, soit à l’arrêt total du programme. Donc à ne pas confondre
entre les deux instructions.
Rappel : La pile (stack) est une zone de mémoire ne pouvant contenir que 8 mots de 13 bits
dans le µC 16F84. Ceci limite les possibilités d’appel à sous-programmes à huit niveaux
d’imbrication. S’il y en avait un appel dans une neuvième imbrication, la première adresse de
retour serait perdue et bonjours les problèmes. Donc il faut faire très attention à cette remarque.
Programme principal
..................................
..................................
..................................
CALL sous-programme
Adresse de retour du sous‐
.................................. programme stockée dans la
.................................. pile avant d’exécuter CALL
..................................
Sous-programme
..................................
..................................
..................................
RETURN
L’instruction CLRF permet d’effacer ce qui se trouve à l’adresse mémoire indiquée de suite.
Elle affecte le bit Z du registre d’état et consomme un cycle d’horloge.
Exemples de programmation : pour mettre à zéro (initialiser) tous les bit du port B, on tappe
dans notre programme :
CLRF PORTB
CLRW: CLeaR W
Cette instruction ne concerne que le registre de travail W et qui permet de le remettre à zéro.
Elle affecte le bit Z du registre d’état et consomme un cycle d’horloge.
CLRWDT permet de mettre à zéro le compteur du chien de garde et en plus celui du pré-
diviseur, si celui-ci est activé. Cette instruction affecte deux bits du registre d’état ; le flag TO
(Time Out) passe à 1 et le flag PD (Power Down) passe à 1. Elle consomme un cycle d’horloge.
Exemple de programmation :
COMF effectue un complément bit à bit sur l’octet File situé à l’adresse indiquée de suite ; le
résultat sera stocké suivant la valeur de la destination d. il s’agit ici d’un complémnt logique tout
en changeant des 0 par des 1 et inversement. Cette instruction affecte le bit Z du registre d’état
STATUS et consomme un cycle d’horloge.
Exemples de programmation :
COMF 3C,0 ; en supposant que l’octet situé à l’adresse 3C contient 00011110. Alors
l’instruction provoque le complément bit à bit de l’octet situé à l’adresse 3C et range le résultat
dans W du moment que d=0. Dans W on trouve après exécution 11100001.
DECF permet de décrémenter la valeur de l’octet situé à l’adresse mémoire indiquée de suite
(adresse comprise entre 0C et 4F) ; avec résultat stocké selon la valeur de d. Cette instruction
affecte le bit Z du registre d’état et consomme éventuellement un cycle d’horloge.
Exemples de programmation :
C’est une instruction de contrôle (test) orientée octet. Elle décrémente la valeur de l’octet
situé à l’adresse mémoire indiquée de suite (adresse comprise entre 0C et 4F), et effectue le test
: l’octet désigné a-t-il atteint zéro ? Si OUI, ignore l’instruction suivante sinon continue
l’exécution de l’instruction qui suit et qui est généralement un GOTO ou un CALL. Le résultat
du test est rangé conformément à la valeur de d. Selon qu’à la suite de la décrémentation l’octet
ait atteint ou pas la valeur zéro, l’instruction prend 1 ou 2 cycles d’horloge.
Exemple de programmation :
Permet d’aller de façon inconditionnelle à l’adresse indiquée de suite (label). Label peut être
une adresse mémoire comme une simple étiquette dans le programme. Cette instruction
interrompt l’exécution séquentielle des instructions et oblige à poursuivre le programme d’une
adresse complètement ailleurs. Contrairement à l’instruction CALL qui fait toujours revenir le
programme principal à l’endroit où il avait été abandonné, l’instruction GOTO provoque
l’abandon complet de la séquence et conduira à une toute autre action dans le programme. Elle
consomme deux cycles d’horloge.
Exemples de programmation :
INCF 0C,0 ; incrémente l’octet situé à l’@ mémoire 0C et range le résultat dans le registre
W.
Incrémente la valeur de l’octet situé (en mémoire RAM) à l’adresse indiquée de suite (adresse
comprise entre 0C et 4F), et effectue un test : l’octet a-t-il atteint zéro ? Si OUI, ignore
l’instruction suivante. Le résultat est stocké conformément à la valeur de la destination d soit
dans W (d=0) soit dans l’octet File (d=1). L’instruction prend un cycle ou deux d’horloge et est
généralement suivie par GOTO ou CALL.
Exemples de programmation :
INCFSZ compteur,0
Incrémente l’octet se trouvant à l’adresse compteur, et range le résultat dans W car d=0. Si le
résultat est zéro, ignore l’instruction qui suit.
Effectue une opération logique OU inclusif entre la valeur immédiate du literal et l’octet se
trouvant dans le registre W. Le résultat de l’opération se range automatiquement dans le registre
de travail W. Le literal est un mot de 8 bits (de 00 à FF). L’instruction IORLW affecte le bit Z
du registre d’état STATUS et consomme un cycle d’horloge.
A B Q = A OR B
0 0 0
0 1 1
1 0 1
1 1 1
Exemple de programmation : IORLW B5
B5 = 10110101
49 = 01001001
Une fois forcés à 1, on peut utiliser ces bits (ou l’octet) comme on veut.
Comme IORLW, l’instruction IORWF effectue une opération logique OU inclusif entre
l’octet se trouvant dans le registre W et l’octet situé (en mémoire RAM) à l’adresse située de
suite (adresse comprise entre 0C et 4F). Le résultat est à ranger selon la valeur que prend la
destination d. Cette instruction affecte le bit Z du registre d’état STATUS et consomme un cycle
d’horloge
Exemples de programmation :
IORWF 36,0
NB. Cette instruction sert exactement comme IORLW à la différence que la première opère
sur un literal et la seconde sur un octet File.
Cette instruction permet soit de porter dans W le contenu situé (en mémoire RAM) à l’adresse
indiquée de suite (adresse comprise entre 0C et 4F), avec l’option de programmation d=0 soit
copier l’octet sur lui-même au même emplacement de la RAM, avec l’option de programmation
d=1. Cette instruction affecte le bit Z du registre d’état STATUS et consomme un cycle
d’horloge.
MOVLW permet de Charger de manière immédiate le literal dans le registre W. Le literal est
un mot de 8 bits (de 00 à FF). elle n’affecte aucun bit du registre STATUS et consomme un
cycle d’horloge.
Cette instruction charge le contenu du registre W dans l’adresse mémoire indiquée de suite
(adresse de 0C à 4F). Elle affecte le flag Z du registre STATUS et consomme un cycle d’horloge.
NOP: No OPeration
Cette instruction demande au processeur de ne rien faire, c’est juste pour qu’il consomme un
temps d’un cycle d’horloge. On l’utilise lorsqu’on a besoin de créer des temporisations. Elle
consomme un cycle d’horloge.
C’est l’instruction obligatoire pour chaque programme d’interruption. Elle permet le retour
au programme principal après exécution d’un sous-programme d’interruption. Une fois exécuté,
le compteur de programme PC sera chargé avec la valeur qui se trouve au sommet de la pile
(stack) ; ce qui provoque le retour au programme principal. Elle consomme deux cycles
d’horloge et n’affecte aucun drapeau du registre STATUS.
Cette instruction agit jusqu’à un certain point similaire à l’instruction RETURN, au sens
qu’elle ferme un sous-programme et provoque le retour au programme principal à l’endroit où
il avait été abandonné suite à un CALL ; mais avec une particularité en plus c’est de charger
dans le registre W la valeur du literal qui est un mot de 8 bits (de 00 à FF). Elle n’affecte aucun
flag du registre d’état STATUS et consomme deux cycles d’horloge.
L’instruction RLF fait une rotation à gauche de l’octet situé de suite via le bit C (carry) du
registre STATUS. Le contenu du bit de CARRY devient le nouveau bit 0 de l’octet File ayant
effectué la rotation à gauche, tandis que son ancien bit 7 entre dans CARRY. Le résultat sera
rangé conformément à la valeur de d. Cette instruction affecte le bit C du registre d’état STATUS
et consomme un cycle d’horloge.
L’instruction RRF fait le chemin inverse de celui de ‘instruction RLF, donc une rotation à
droite en utilisant le bit Carry du registre STATUS. Même remarques que pour RLF.
C’est l’instruction qui met en veille le processeur. Elle ne met pas le µC hors tension, mais
elle arrête le séquencement des instructions (ralentir le signal d’horloge jusqu’à l’extrême limite
: la fréquence zéro). Seul le chronomètre du Watch Dog (chien de garde) reste actif. La
consommation du boîtier (qui normalement est de 2 mA) tombe à 30 µA. Le µC se met en route
suite à une demande d’interruption, ou un signal provenant du chien de garde. Elle affecte deux
bits du registre d’état STATUS, le bit TO (Time Out) passe à 1 et le bit PD (Power Down)
passe à 0 et elle consomme un cycle d’horloge. En plus, elle met à zéro le chronomètre du chien
de garde, ainsi que le pré diviseur.
Cette instruction fait la soustraction du literal (valeur immédiate représentée par un octet
pouvant aller de 00 à FF) du contenu du registre W, et place le résultat dans W. Elle affecte trois
bits du registre d’état : le flag C (Carry), le flag DC (Digit Carry) et le le flag Z (Zero) et
consomme un cycle d’horloge.
Echange les quatre bits de poids fort d’un octet se trouvant (en mémoire RAM) à l’adresse
indiquée de suite (adresse comprise entre 00 et 4F), avec ses propres quatre bits de poids faible
: permuter les deux quartets de l’octet désigné et mettre le résultat selon la valeur de d.
l’instruction SWAPF n’affecte aucun bit du registre d’état et consomme un cycle d’horloge.
Pour rappel, un OR exclusif permet de comparer deux octets bit à bit. Si les bits de même
poids sont au même niveau, le résultat est zéro et si par contre ils sont à des niveaux différents,
le résultat est 1 et ce conformément à sa table de vérité ci-après :
A B Q = A XOR B
0 0 0
0 1 1
1 0 1
1 1 0
Exemple de XOR entre deux octets : (00110011) XOR (01110010) donne le résultat
(01000001).
Un XOR permet d’inverser un état logique. Exemple : Soit au départ l’octet 11111111. Si le
XOR se fait avec 00000000, rien ne change ; le résultat reste 11111111. Si par contre le XOR
se fait avec 00000001,le résultat devient 11111110. Alors que les zéros ne font rien changer,
les 1 provoquent un basculement d’état logique.
NB. Cette instruction sert lorsque, dans un octet, on a besoin d’inverser un bit en particulier
(ou certains bits en particulier). Donc on est astreint d’utiliser la technique des masques. Dans le
masque on fait des 1 logiques pour les bits dont on veut les inverser et des 0 logiques pour ceux
qu’on veut garder leurs états logiques.
Cette instruction opère exactement comme XORLW à la différence que XORWF compare
les bits du registre W avec le registre situé en l’adresse mémoire en RAM et indiquée de suite.
L’utilisation reste la même. Pareil, cette instruction affecte le bit Z du registre d’état STATUS
et consomme un cycle d’horloge.
XLIX. Un mot sur TRIS : TRIState port
cette instruction est spécifique au 16F84. Microchip recommande de ne pas l’utiliser, dans le
but de laisser les programmes (écrits pour ce type de microcontrôleur) compatibles avec ceux
écrits pour d’autres modèles de PIC. Donc cette instruction permet de valiser la direction des
posrts (PORTA et PORTB) soit en sortie soit en entrées : Ce registre configure, c’est à dire
définit le sens de fonctionnement de chacune des lignes des ports A et B ; assigne à chaque ligne
soit le rôle d’entrée, soit le rôle de sortie, sans pour autant provoquer aucune entrée ni aucune
sortie. Alors charger le registre TRIS (A ou B) avec un SET met les lignes de port à haute
impédance. Il s’agit d’un registre de 8 bits, pouvant tous se programmer individuellement par 0
ou par 1 :
L. ENCODAGE des INSTRUCTIONS
Dans le datasheet, et avec chaque instruction on trouve des lettres qui font partie de
l’encodage. La signification des lettres utilisées dans l’encodage des instructions sont :
w = registre W (accumulateur)
LI. Bibliographie
[1] Micrichip, PIC16F84A Data Sheet 18-pin Enhanced FLASH/EEPROM 8-bit
Microcontroller.
[2] Bignoff ; La programmation des PIC, première partie-révision R35 Démarrer les
PIC avecle PIC 16F84.
[4] Marc Spencer WA8S. MEPIC pgramming for bigginers. The American Radio
Relay League, Inc, 2010.
[7] Michael A. Covington. PIC Assembly Language for the Complete Beginner.
Copyright c 1999, 2004 Michael A. Covington.