Présentation PICs

publicité
Introduction
L'activité pratique de l'enseignement de microprocesseur EN105 porte sur l'étude des
microcontrôleurs PICs de la firme MICROCHIP. Ce choix s'explique par la simplicité du
processeur ce qui le rend abordable avec peu de connaissances. De plus, les PICs sont très
utilisés dans l'industrie et on les retrouve beaucoup sur le marché principalement dans les
appareils grands publics (appareils électroménagers, …). Ce sont donc des microcontrôleurs
utiles à connaître pour un ingénieur en électronique.
Les connaissances nécessaires à la compréhension de ce document sont enseignées
dans le cours générale du même module. Un résumé des concepts les plus importants est
donné en annexe 1, extrait du cours synthétique mais complet de Thierry DUMARTIN
(on pourra en consulter l'intégralité sur le net : http://www.geea.org/IMG/pdf/Cours_II.pdf)
Ce document présente tout d'abord les différentes familles de PICs en insistant sur leur
architecture commune. On se focalisera ensuite sur l'étude du PIC 16F84 qui est un grand
standard dans la gamme des PICs car disposant des ressources essentielles pour un coût
modique. C'est cette référence qui sera étudié en TP pour la phase d'initiation. Un autre PIC
plus évolué (16F877) sera étudié dans le projet qui s'en suivra.
SOMMAIRE
I) DESCRIPTION
1) Architecture
2) Différentes familles
3) Espace mémoire
2
2
4
II) PROGRAMMER AVEC LES PICS
1) Principaux registres
2) Modes d'adressage
3) Types d'instruction
4) Jeu d'instructions
5) Déroulement d'une instruction
7
10
11
12
13
III) ETUDE DU PIC 16F84
1) Description rapide
2) Registres SFR
3) Architecture interne
4) Les ports d'entrée / sortie A et B
5) Le timer TIMER 0
6) Les interruptions
7) Le chien de garde
8) Le mode SLEEP
9) Les accès en mémoire EEPROM
ANNEXE 1 : Extrait du cours "architecture des ordinateurs" de T. DUMARTIN
ANNEXE 2 : Jeu d'instructions des PICs
ANNEXE 3 : Complément doc du 16F84
15
16
17
17
18
21
27
28
29
Le fabricant de circuits intégrés MICROCHIP propose une gamme importante de
microcontrôleurs sous l'appellation "PIC", depuis le début des années 90. Il a battit son succès
grâce à son PIC 8 bits, disponible en 3 gammes avec de multiples versions (environ 200 !),
permettant ainsi à l'utilisateur de disposer d'un petit microcontrôleur RISC avec des ressources
internes répondant au mieux à son application, pour un prix taillé au plus juste (à partir de
0,4 $ !). On trouve ainsi des PICs incorporant une EEPROM, des timers, des contrôleurs de
bus, un module de débuggage… mais aussi des fonctions analogiques telles que CAN, ampli
OP, référence de tension, oscillateurs… Il n'est donc pas étonnant de retrouver ses produits
dans bon nombre de systèmes embarqués grand public.
MICROCHIP a plus récemment complété sa gamme de produits avec des
microcontrôleurs 16 et 32 bits ainsi que des DSP 16 bits. Il fabrique également un grand
nombre de circuits intégrés (capteurs de température, ampli à gain programmable…) destinés
à être interfacés avec ses microcontrôleurs. Le site du constructeur www.microchip.com
illustre bien la diversité de ses produits et la volonté de proposer des solutions "clés en main"
dans un domaine d'application donné.
Nous nous intéresserons dans le cadre de l'activité pratique du module EN105 aux
PICs 8 bits 16F84 pour la partie initiation, et 16F877 en ce qui concerne le projet.
1
I) DESCRIPTION
1) Architecture
Les PICs les plus répandus, dits "8 bits", sont bâtis autour d'un processeur 8 bits, c'està-dire que les registres et le bus de données internes ont un format de 8 bits. Ils ont une
architecture Harvard et possèdent donc un bus "programme" distinct du bus de données ce qui
leur permet d'accéder et manipuler une donnée et simultanément aller lire l'instruction
suivante. Ce parallélisme est possible grâce à un pipeline à 2 niveaux (voir section III-5
"déroulement d'une instruction").
Le processeur est de type RISC (Reduced Instruction Set Computer) et ne possède
donc que peu d'instructions (35 pour les 2 PICs que nous utiliserons). Cette caractéristique
permet de les coder dans un seul emplacement mémoire pour chaque instruction, ce qui
permet un accès et un décodage plus rapide. Une instruction s'exécute ainsi en 1 cycle
d'horloge soit 4 périodes de celle-ci. Les PICs permettent ainsi une cadence de plusieurs
MIPS (Million Instructions Per Second), jusqu'à 5 MIPS pour la série PIC16 que nous
utiliserons. La contrepartie de ce gain de rapidité se situe au niveau de la simplicité des
instructions qui nécessite d'en associer souvent plusieurs pour réaliser une opération même
basique. Un autre inconvénient concerne l'accès aux registres plus complexe puisqu'on ne
code qu'une partie de leur adresse dans le champ de l'instruction afin de limiter la taille des
emplacements de la mémoire programme, l'autre partie définissant une page mémoire
("banque") sélectionnée au moyen d'un registre spécifique.
2) Différentes familles
Les PICs sont aujourd'hui découpés en 4 séries (PIC10, PIC12, PIC16 et PIC18)
classées par "puissance" en termes de ressources internes, d'entrées/sorties et, ce qui est
étroitement lié, en capacité de mémoire programme d'autant plus étendue qu'il y aura de
ressources à contrôler. Certains PICs ont aujourd'hui disparu (PIC14, PIC16C5 en voie
d'obsolescence…) et il faut être conscient que les PICs sont en constante évolution avec une
pérennité donc réduite, mais les références supprimées du catalogue sont en général
remplacées par de nouvelles généralement compatibles et plus performantes. Il est bien clair
que les PICs sont avant tout destinés aux produits grands publics à faible durée de vie plutôt
qu'aux applications militaires…
2
MICROCHIP a dès le départ défini 3 classes d'architecture pour ses PICs, qui se
distinguent par la taille des instructions :
Baseline : instructions codées sur 12 bits
Mid-Range : instructions codées sur 14 bits
High performance (ou high end) : instructions codées sur 16 bits
Une taille plus élevée permet un plus grand nombre d'instructions mais surtout
d'augmenter le champ alloué à l'adresse du registre à manipuler et donc de disposer de plus de
registres. Ceux-ci sont effet d'autant plus nombreux qu'il y a de ressources (entrées/sorties,
timer…) à contrôler.
Une 4e classe intermédiaire entre la Mid-Range et la High performance a récemment
vu le jour : la classe Enhanced Midrandge, de même gabarit que la midrange mais offrant
plus de possibilité et de performance au niveau de la programmation.
.
3
Les 2 PICs étudiés dans le module EN105 font partie de la famille intermédiaire
mid-range qui est la plus étoffée en nombre de références et donc la plus répandue. Nous nous
limiterons à l'exemple du PIC16F84 pour définir l'espace mémoire de programme et de
données, les autres références étant calquées sur la même organisation, avec plus ou moins
d'emplacements.
3) Espace mémoire
a) Mémoire code programme
Il s'agit d'une mémoire de type FLASH (= EEPROM à accès rapide) sur les PICs de
type F tel que le 16F84, c'est-à-dire sur les PICs les plus récents. On trouve encore des
versions OTPROM (One Time Programming ROM) pour les PICs de type C tel que le
16C84 devenu obsolète, et des versions ROM (type CR) programmé en usine par
MICROCHIP.
Mémoire programme PIC 16F84
4
Le PIC 16F84 possède une mémoire FLASH de 1 Kmots (= 1024 mots !) de 14 bits et
l'espace maximum adressable pour la famille midrange est de 8 Kmots (cas du 16F877). Le
compteur programme PC (Program Counter) est donc un registre de 13 bits dont seuls les 10
bits de poids faibles sont utiles sur le 16F84. Le registre PC contient à tout instant l'adresse de
l'instruction qui sera exécutée au prochain cycle d'horloge.
La pile ("Stack") est une zone mémoire qui sert à stocker des adresses utiles au
déroulement du programme. Par exemple lorsqu'on effectue un appel de sous-programme
(appel de fonction en langage C) l'adresse de l'instruction courante est stockée
automatiquement dans la pile permettant ainsi de reprendre le déroulement du programme
après cette instruction une fois le sous-programme exécuté. Le processeur effectue pour cela
des copies PC→pile (appel) ou pile→PC (retour). La pile est une mémoire à accès séquentiel
de type LIFO (Last In First Out) dont le nom fait référence à une pile d'assiette : la dernière
posée sera la première à être reprise. Cette zone mémoire n'est pas accessible par l'utilisateur
sur les PICs, et ne contient que 8 emplacements ce qui est très peu. Toute récursivité est pour
cela interdite par les compilateurs C. La pile étant ici circulaire, la 9e écriture écrase la 1ère
définitivement perdue.
2 adresses sont particulières pour tous les PICs :
0000h : adresse de l'instruction qui sera exécutée à la mise sous tension ou après un RESET
0004h : adresse de l'instruction qui sera exécutée si une interruption survient (voir partie …)
Remarque : Microchip utilise ici le terme "vecteur" ce qui est un abus de langage car un
vecteur est en principe un pointeur en microinformatique c'est-à-dire qu'il
contient l'adresse de la case mémoire qu'il pointe. Les PICs accèdent à cette
adresse de la même manière que pour tout autre emplacement en mémoire
programme, c'est-à-dire qu'il décode la valeur lue pour obtenir une instruction. En
pratique, on place à ses 2 adresses une instruction GOTO add où add désigne
l'adresse de la routine RESET ou ISR (Interrupt Service Routine).
Certains PICs (famille High performance) possèdent une table de vecteurs, c'est-àdire qu'ils disposent de plusieurs vecteurs utilisés pour les interruptions (cf doc MICROCHIP)
5
b) Mémoire données (8 bits)
c RAM
Mémoire données PIC 16F84
Elle contient les registres à fonction dédiée (SFR). Attention, ces registres sont divisés
en 2 banques (voire 4 sur certains PICs) sélectionnables par le bit RP0 (+RP1) du registre
STATUS) ou directement par un registre dédié (BANK REGISTER sur les PICs de la famille
High performance).
A la suite de ces registres se trouve de la RAM utilisable pour stocker des variables
"GPR" (General Purpose Registers). Attention : souvent banque 1 = banque 0 mais pas
toujours !.
PIC 16F84 : La RAM s'étend jusqu'à 0x4F → 68 octets de libre pour les GPR.
6
d EEPROM (selon circuit)
Certains PICs disposent d'une mémoire EEPROM pour stocker des constantes
accessibles au moment de la programmation mais aussi par le programme. Attention, cette
dernière procédure est assez lourde (surtout en écriture) et le temps d'accès en écriture est
relativement long (10 ms). Ces octets ne sont donc pas à utiliser pour stocker des variables
temporaires évoluant souvent dans le programme.
Pour le PIC 16F84, on trouve 64 octets à partir de l'adresse 0x2100
II) PROGRAMMER AVEC LES PICS
1) Principaux registres
Certains registres sont indispensables au déroulement du programme. En voici une
description rapide.
a) Le registre de travail W (Working)
Le processeur ne peut déplacer une donnée ou effectuer une opération arithmétique ou
logique sur un registre (SFR ou GPR) qu'en utilisant le registre de travail W (Work). C'est un
registre 8 bits indépendant des registres SFR et qui est directement associé à l'ALU
(Arithmetic Logic Unit) comme on peut le voir sur le schéma interne du PIC (cf section IV-2).
b) Le registre d'état STATUS (0x03/0x83)
C’est un registre qui fournit des indications liées à l'exécution de la dernière
instruction par le processeur. On y trouve en particulier les bits d'état qui renseignent sur la
valeur de la dernière opérande (=donnée manipulée par une instruction). Ce registre contient
également les bits qui permettent de sélectionner les différentes pages mémoires en RAM
("banques").
7
C (b0) : Carry (report).
Ce bit est en fait le 9ème bit d’une opération. Par exemple, si une
addition de 2 octets donne une valeur > 255 (FFh), ce bit sera
positionné.
DC (b1) : Digit Carry.
Ce bit est utilisé principalement lorsque l’on travaille avec des
nombres BCD : il indique un report du bit 3 vers le bit 4 dans
une opération.
Z (b2) : Zero.
Ce bit est positionné à 1 si le résultat de la dernière opération
vaut 0.
/PD (b3) : Power down
Indique quel événement a entraîné le dernier arrêt du PIC
(instruction sleep ou dépassement du temps du watchdog).
/TO (b4) : Time-Out bit
Ce bit indique (si 0), que la mise en service suit un arrêt
provoqué par un dépassement de temps ou une mise en sommeil.
Dans ce cas, /PD effectue la distinction.
RP0 (b5) : Register Bank Select 0
Permet d’indiquer dans quelle banque de RAM on
travaille (0 = banque 0).
RP1 (b6) : Register Bank Select 1
Permet la sélection des banques 2 et 3. Inutilisé pour le
16F84, doit être laissé à 0 pour garantir la compatibilité
ascendante (portabilité du programme).
IRP (b7) : Indirect RP
Permet de décider quelle banque on adresse dans le cas
de l’adressage indirect pour les PICs disposant de plus de
2 banques (inutile pour le 16F84).
8
c) Le compteur programme
Il pointe sur la prochaine instruction à exécuter. Comme il est codé sur 13 bits (accès à
toute la mémoire de codes programmes) il nécessite d'être représenté par 2 registres :
PCL
PCLATH
(PC Low)
(PC LATch counter High)
(0x02/0x82) :
(0x0A/0x8A) :
8 bits de poids faible
5 bits de poids fort b4 à b0
NB : pour le 16F84, 1Kmot de mémoire programme ⇒ b4, b3, b2 de PCLATH non utilisés.
Chargement du PC dans différentes situations
9
2) Modes d'adressage
Le mode d'adressage désigne la manière de désigner la donnée à manipuler
(opérande). Il n'existe que 3 modes d'adressage sur les PICs, qui sont les plus usuels sur les
processeurs :
¾ literal (= immédiat) : la valeur de l'opérande est directement donnée dans l'instruction
ex : MOVLW
k
charge la valeur k dans W
¾ direct : l'opérande est le contenu de l'adresse (registre) spécifié
ex : MOVWF
0x05
charge le contenu de W dans l'adresse 05h
(registre PORTA)
¾ indirect : l'opérande est le contenu de la case mémoire dont l'adresse est elle-même
contenue dans le registre spécifié (= pointeur en langage C). Sur les PICs
l'utilisation de ce mode d'adressage est particulier : le pointeur est unique, il
s'agit du registre FSR (0x04/0x84). Pour utiliser ce mode d'adressage on fait
appel dans l'instruction à un registre spécial, le registre INDF (0x00/0x80) qui
n'existe pas vraiment.
ex :
MOVLW
MOVWF
MOVF
0x05
0x04
INDF,W
charge la valeur 05h (adresse de PORTA) dans W
charge la valeur 05h dans le registre FSR
charge le contenu de PORTA dans W
10
3) Types d'instruction
a) Instruction qui porte sur 1 octet : manipule l'octet contenu dans un registre
NB : le 8e bit de l'adresse du registre est le bit RP0 (b5 de STATUS) qui permet donc de
changer de banque.
b) Instruction qui porte sur un bit : manipule directement un des 8 bits d'un registre
c) Instruction literal : manipule des données codées dans l'instruction même (adressage
immédiat)
d) Sauts et appel de sous-programme : 3 bits pour coder l'instruction, les 11 bits restant pour
coder l'adresse de destination. Si la mémoire programme est supérieure 2 Kmots
(16F877…) on positionne les bits 3, 4 de PCLATH.
11
4) Jeu d'instructions
(exemple de la famille mid-range avec 35 instructions,
détaillées en annexe 2)
12
5) Déroulement d'une instruction
Le signal d'horloge externe est divisé par 4 à l'intérieur du PIC pour obtenir 4 horloges
internes en quadrature nommées Q1, Q2, Q3 et Q4. Le PC est incrémenté par Q1 et
l'instruction est chargée dans le registre instruction par Q4 (délai nécessaire à cause du temps
d'accès de la mémoire programme). Le cycle suivant effectue l'exécution de l'instruction
avec, dans le cas le plus fréquent :
Q1 : décodage de l'instruction
Q2 : lire l'opérande (W, registre en RAM, donnée immédiate…)
Q3 : effectuer un éventuel traitement (addition, …)
Q4 : stocker le résultat (dans l'opérande source, W…)
Une instruction nécessite 1 cycle pour que le PIC aller la chercher en mémoire
programme et un autre pour l'exécuter. Un pipeline à 2 niveaux permet de mener ces 2 types
d'opération en parallèle : dans un même cycle de 4 périodes d'horloge, le PIC va chercher
l'instruction n tout en exécutant l'instruction n+1. Une instruction s'exécute donc en un seul
cycle, sauf lorsqu'il y a déroutement (changement du PC par une instruction, cf exemple cidessous) où il faut rajouter un cycle "mort" pour charger la nouvelle instruction avant son
exécution.
13
III) ETUDE DU PIC 16F84
14
1) Description rapide
Le PIC 16F84 est aujourd'hui remplacé par le 16F84A qui lui est complètement
équivalent (mémoire FLASH améliorée avec 10000 écritures possibles au lieu de 1000).
Résumé des caractéristiques du PIC 16F84 (A)
- Boitier 18 broches (DIP ou SOIC)
- Alimentation :
(2 V <
< 5,5 V)
- Fréquence d'horloge ≤ 20 MHz (quartz ou circuit RC selon programmation)
(1 cycle d'horloge = 4 périodes d'horloge)
- Mémoire programme : 1 Kmots de 14 bits (bit 3 et 4 de PCLATH inutilisés)
de type FLASH (16F84) ou EEPROM (16C84)
- Mémoire de données : ¾ RAM : 2 banques de 64 octets dont certains sont identiques (!) et
d'autres inutilisables.
→ 15 registres SFR
→ 68 octets libres pour stocker des variables
¾ EEPROM : 64 octets
- Périphériques :
¾ 2 ports d'entrée/sortie
A (5 bits)
B (8 bits)
¾ 1 timer
(avec prédiviseur 8 bits programmable)
¾ 1 chien de garde
- 4 sources d'interruption (1 seul vecteur)
- pile à 8 niveaux
- mode standby
…
15
2) Registres SFR
En plus des registres principaux décrits dans la section II-1, on trouve des registres
dédiés à la gestion des périphériques internes associés au processeur (cf schéma architecture
interne section III-3).
Le tableau ci-dessous récapitule tous les registres du PIC16F84 (A), avec la
désignation de chacun de leurs 8 bits ainsi que leur état au démarrage et après un reset. Ces
différents registres vont être décrits dans les sections suivantes.
16
3) Architecture interne
4) Les ports d'entrée/sortie A et B
Chaque port est géré par les registres :
¾ PORT (A:0x05 , B:0x06) qui est le "contenu" du port correspondant (= image de l'état des
bits du port).
¾ TRIS (A:0x85 , B:0x86) qui configure indépendamment les bits du port en entrée (1) ou en
sortie (0).
ex : TRISB = 0x0F
PB7, PB6, PB5, PB4 en sortie
PB3, PB2, PB1, PB0 en entrée
¾ le registre commun OPTION (0x81) qui permet grâce au bit RPU (b7) de mettre en service
(si RPU = 0) les résistances de rappel à + 5V (pull up) sur tous les bits du port B.
17
NB :
- Certaines broches de ces ports ont une double fonction. Par exemple RB0/INT peut
aussi servir pour provoquer une interruption externe (matérielle).
- Tous les bits des ports sont compatibles avec les niveaux TTL (sorties push-pull).
Attention RA4 a une sortie en drain ouvert (nécessité de placer une résistance de
pull up en externe)
- courant max de sortie : 25 mA / broche avec un total de 50 mA (port A)
100 mA (port B)
5) Le timer TIMER 0
C'est un compteur 8 bits dont la valeur en sortie est accessible par l'intermédiaire du
registre TMR0 (0x01) en lecture mais aussi en écriture. Il peut être incrémenté de 2 façons :
c par les cycles d'horloge du PIC (attention 1 cycle = 4 périodes de H) : c'est le mode TIMER
d par les impulsions reçues sur la broche RA4/TOCKI : c'est le mode COMPTEUR
18
Le TIMER 0 est lui aussi géré par le registre OPTION (0x81) :
¾ le bit TOCS (b5) permet de choisir le mode :
- TOCS = 0 → mode TIMER
- TOCS = 1 → mode COMPTEUR
¾ le bit TOSE (b4) permet de choisir sue quelle transition de la broche RA4/TOCKI le
comptage est effectué en mode COMPTEUR :
- TOSE = 0 : comptage si l'entrée RA4/TOCKI passe de 0 à 1
- TOSE = 1 : comptage si l'entrée RA4/TOCKI passe de 1 à 0
¾ les bits PS2 (b2), PS1 (b1), PS0 (b0) permettent de définir le rapport de division du
prédiviseur (prescaler)
NB : Le prescaler peut aussi être utilisé pour le chien de garde (voir plus loin) mais il ne peut
plus alors être utilisé par le TIMER 0.
¾ le bit PSA (b3) permet d'affecter le prescaler :
- au TIMER 0 (PSA = 0)
- ou au chien de garde (PSA = 1)
NB : - Pour désactiver le prescaler il faut l'affecter au chien de garde avec un rapport 1 : 1
(PS2=PS1=PS0=0)
- Les 8 bits du prescaler ne sont pas accessibles en lecture ni en écriture
ex :
fhorloge = 4 MHz
cycle d'horloge de durée = 1 μs
TOSC = 0
PSA = 0
(PS2, PS1, PS0) = 010
mode TIMER
prescaler affecté au TIMER 0
:8
⇒ TIMER 0 incrémenté toutes les 8 μs
19
Utilisation du TIMER 0
Le TIMER 0 peut être utilisé de 2 façons :
c Par scrutation du flag TOIF
Lorsque le TIMER 0 déborde (passage de la valeur 255 à 0) le bit TOIF (b2) du
registre INTCON (0x0B, 0x8B) passe à 1 (et reste à 1 tant qu'il n'a pas été remis à 0 par le
programme !). Il suffit donc de scruter le bit TOIF pour savoir si 256 incrémentations ont eu
lieu.
Inconvénient de cette méthode : on perd du temps à attendre et tester le TIMER 0. De plus, le
programme risque de ne pas réagir assez rapidement (si la
fréquence des tests est inférieure à celle de l'incrémentation
de TMR0)
NB : Si l'on souhaite tester un nombre d'incrémentation
N < 256 : on préférera initialiser le registre TMR0 à la valeur de N codée en
complément à 2 plutôt que de scruter la valeur de TMR0 et de la
comparer à N (test plus rapide)
N ≥ 256 : on utilise une ou plusieurs boucles incrémentées par le débordement du
TIMER 0
d Par interruption
Cette méthode résoud le problème posé par la précédente car le programme principal
n'a pas à tester le TIMER 0 : le débordement du TIMER 0 génère une interruption (si le
registre INTCON est bien configuré…) qui déroute "aussitôt" le PIC du programme principal
pour traiter un sous-programme prévu. C'est donc cette méthode qui est de loin la plus
utilisée.
20
6) Les interruptions
a) Principe
On parle d'interruption lorsqu'un événement survient et interrompt le déroulement
normal du programme afin de pouvoir traiter immédiatement l'événement. Une fois
l'événement traité (routine d'interruption terminée) le programme principal reprend à l'endroit
où il avait été interrompu, comme si l'interruption n'avait pas eu lieu.
Le déroulement classique d'une procédure d'interruption a lieu selon le schéma :
Instruction n-1
événement
(figurant dans la liste des
sources d'interruption autorisées
et prioritaire devant l'éventuelle
interruption
en cours
de
traitement)
Instruction n
Instruction n+1
Sauvegarde du contexte dans la
pile
- PC (instruction suivante)
- registre d'état
- autres registres…
Traitement du sous-programme
d'interruption
selon le vecteur associé à
la source d'interruption
Restauration du contexte
b) Mécanisme d'interruption sur les PICs
-
Tout d’abord, l’adresse de début de toute interruption est fixe (un seul vecteur). Il s’agit
toujours de l’adresse 0x04. Toute interruption provoquera le saut du programme vers cette
adresse.
-
Toutes les sources d’interruption arrivant à cette adresse, si le programmeur utilise
plusieurs sources d’interruptions, il lui faudra déterminer lui-même laquelle il va devoir
traiter.
-
Les PICs en se connectant à cette adresse, ne sauvent rien automatiquement, hormis le
contenu du PC, qui servira à connaître l’adresse du retour de l’interruption. C’est donc à
l’utilisateur de se charger de la sauvegarde des registres. (ceci n'est plus nécessaire sur la
toute dernière classe d'architecture Enhanced Midrandge et bein sûr avec la High
performance)
21
-
Le contenu du PC est sauvé sur la pile interne (8 niveaux). Donc, si on utilise des
interruptions, on ne dispose plus que de 7 niveaux d’imbrication pour les sousprogrammes (moins si on utilise des sous-programmes dans les interruptions).
-
Le temps de réaction d’une interruption est calculé de la manière suivante : le cycle
courant de l’instruction est terminé, le flag d’interruption est lu au début du cycle suivant.
Celui-ci est achevé, puis le processeur s’arrête un cycle pour charger l’adresse 0x04 dans
PC. Le processeur se connecte alors à l’adresse 0x04 où il lui faudra un cycle
supplémentaire pour charger l’instruction à exécuter. Le temps mort total sera donc
compris entre 3 et 4 cycles.
-
Une interruption ne peut pas être interrompue par une autre interruption. Les interruptions
sont donc invalidées automatiquement lors du saut à l’adresse 0x04 par l’effacement du
bit GIE (voir plus loin).
-
Les interruptions sont remises en service automatiquement lors du retour de l’interruption.
L’instruction RETFIE agit donc exactement comme l’instruction RETURN, mais elle
repositionne en même temps le bit GIE.
Les interruptions sur les PICs :
Sauvegarder
le contexte
Restaurer
le contexte
22
Exemple du déclenchement d'une interruption par le débordement du TIMER0
c) Les interruptions avec le PIC 16F84
Le 16F84 est très pauvre à ce niveau, puisqu’il ne dispose que de 4 sources
d’interruptions possibles (contre 13 pour le 16F877 par exemple). Les événements
susceptibles de déclencher une interruption sont les suivants :
- TIMER0 : Débordement du TIMER 0. Une fois que le contenu de TMR0 passe de 0xFF à
0x00, une interruption peut être générée.
- EEPROM : Cette interruption peut être générée lorsque l’écriture dans une case EEPROM
interne est terminée.
- RB0/INT : Une interruption peut être générée lorsque la broche RB0, encore appelée
INTerrupt pin, étant configurée en entrée, celle-ci reçoit un front. Le front actif
est défini par le bit INTEDG (b6) du registre OPTION (0x81) :
INTEDG = 1 → front montant
INTEDG = 0 → front descendant
23
- PORTB : De la même manière, une interruption peut être générée si un changement de
niveau (front montant ou descendant) se produit sur une des broches RB4 à RB7.
Il n’est pas possible de limiter l’interruption à une seule de ces broches.
L’interruption sera effective pour les 4 broches ou pour aucune.
Les interruptions sont gérées par le registre INTCON (0x0B, 0x8B) :
GIE (b7) : Global Interrupt Enable bit. Il permet de valider ou d’invalider toutes les
interruptions en une seule fois.
EEIE (b6) : EEprom write complete Interrupt Enable bit. Ce bit permet de valider
l’interruption de fin d’écriture en EEPROM (voir paragraphe 7).
T0IE (b5) : Tmr0 Interrupt Enable bit : Valide l’interruption générée par le débordement du
TIMER 0.
INTE (b4) : INTerrupt pin Enable bit : Valide l’interruption dans le cas où un front actif se
présente sur la broche RB0.
RBIE (b3) : RB port change Interrupt Enable bit : Valide les interruptions si il y a un
changement de niveau sur une des entrées RB4 à RB7.
T0IF (b2) : Tmr0 Interrupt Flag bit : C’est un Flag (indicateur), donc il signale. Ici c’est le
débordement du TIMER 0.
INTF (b1) : INTerrupt pin Flag bit : signale une transition sur la pin RB0 dans le sens
déterminé par INTEDG (b6) du registre OPTION.
RBIF (b0) : RB port Interrupt Flag bit : signale qu’une des entrées RB4 à RB7 a été modifiée.
24
La validation des sources d'interruption peut être représentée par le schéma :
source
d'interruption
Flag
validation de
l'interruption
dévalidation de toutes
les l'interruptions
Remarques :
- Les indicateurs (flags) permettent de connaître la source qui a provoqué l'interruption
(attention ils doivent être remis à 0 par le sous-programme d'IT).
- Les bits EEIF, TOIE, RBIE, INTE permettent de valider la source d'IT correspondante.
- Le bit GIE permet de dévalider toutes les sources d'IT. Comme les PICs ne peuvent traiter
qu'une seule IT à la fois, le bit GIE est automatiquement mis à 0 au début du traitement de
l'IT (il est restauré à 1 automatiquement par l'instruction RETFIE)
- Le bit EEIF (indicateur de fin d'écriture en EEPROM) est le bit 4 du registre EECON1
(0x88)
d) Sauvegarde et restauration du contexte
Le PC est sauvegardé dans la pile et restauré automatiquement à la fin de l'IT. Le sousprogramme d'IT doit donc gérer la sauvegarde des registres STATUS et W. On ne peut,
comme on le fait en général pour stocker ces registres, utiliser la pile car elle n'est pas
accessible. On utilise donc 2 emplacements en RAM.
25
Problème : l'instruction permettant de sauvegarder le STATUS ne doit pas le modifier en
effectuant l'opération !
MOVF (F → d) affecte le STATUS
MOVWF (W → F)
mais
et
SWAPF (interchange les 4 bits de poids faible avec ceux de poids fort et stocke
le résultat dans d)
ne l'affecte pas.
En conséquence, le corps de la routine d'IT incluant les procédures de sauvegarde et
restauration de W et STATUS pourra être le suivant :
;sauvegarde des registres
;-------------------------movwf
w_temp
; sauver registre W
swapf
STATUS,w
; swap status avec résultat dans w
movwf
status_temp
; sauver status swappé
; "switch" vers différentes interruptions
; ---------------------------------------; ici, on teste éventuellement de quelle interruption il s’agit
; traitement des interruptions
; ---------------------------------; ici, on peut traiter l'interruption puis effacer son flag
;restauration des registres
;---------------------swapf
status_temp,w
; swap ancien status, résultat dans w
movwf
STATUS
; restaurer status
swapf
w_temp,f
; Inversion L et H de l'ancien W
; sans modifier Z
swapf
w_temp,w
; Ré-inversion de L et H dans W
; W restauré sans modifier status
retfie
; retour de l'interruption
26
7) Le chien de garde (Watch Dog)
C'est un mécanisme de protection du programme qui en théorie ne doit pas servir mais
qui en pratique peut permettre de sortir d'une boucle d'attente infinie (événement attendu qui
ne se produit pas…) et de vérifier si le programme ne s'est pas égaré. Le Watch-Dog (WD)
sert également à réveiller un PIC placé en mode SLEEP (voir paragraphe 6).
a) Description
Il s'agit en fait d'un timer ("WDT") qui possède sa propre horloge dont la fréquence
dépend de la température et de la tension d'alimentation (mais pas de fhorloge !). Le
constructeur donne :
7 ms ≤ périodicité du débordement du timer WD = 18 ms typique ≤ 33 ms
Le temps de débordement peut être allongé grâce au prescaler (qui fonctionne ici en
post-diviseur), si PSA = 1, qui peut multiplier ce temps au maximum × 128 :
b) Principe
Chaque fois que l'instruction CLRWDT est exécutée par le PIC, le WDT est remis à 0
ainsi que la valeur contenue dans le prédiviseur. Si, pour une raison anormale, cette
instruction n'est pas exécutée avant le débordement du WDT, le PIC est redémarré à l'adresse
0x00 et le bit /TO (b4) de STATUS est mis à 0. En lisant ce bit en début de programme il est
de plus possible de détecter si le PIC vient d'être mis sous tension ou si ce démarrage est dû à
un "plantage" du programme.
27
c) Utilisation
Le WDT est donc une protection intéressante mais qu'il faut gérer par le programme.
Pour cela il suffit de placer des instructions CLRWDT à intervalle inférieure au temps de
débordement du WD.
Δ Tmax = rapport prescaler (d'après PS2 ,PS1, PS0) × 7 ms (cas le plus défavorable)
Il est à choisir en fonction de l'application selon le compromis :
ΔTmax faible (réaction rapide face au plantage) ↔ peu d'instructions CLRWDT à insérer
NB : - Le WD est mis en service par la directive CONFIG _WDT _ON à préciser au moment
de la programmation (met le bit WDTE à 1, voir annexe 3) et ne peut être désactivé
par le programme.
- Ne jamais placer un CLRWDT dans une routine d'IT sinon l'IT risque de neutraliser la
protection offerte par le WD sans pour autant bien sûr réinitialiser le PIC.
8) Le mode SLEEP
L'instruction SLEEP permet de placer le PIC en mode SLEEP (ou Standby), c'est-àdire que le PIC s'arrête juste après l'instruction en attendant d'être réveillé. L'intérêt de ce
mode est de diminuer la consommation du PIC (Icc < 0,5 µA). Pour profiter au maximum de
la chute de consommation, Microchip recommande que les broches en sortie des ports soient
traversées par un courant minimal ce qui peut être obtenu en choisissant convenablement les
niveaux logiques programmée compte tenu de l'électronique reliée.
Principe
Lorsque l'instruction SLEEP est exécutée :
-
Le WDT est remis à 0, exactement comme le ferait une instruction CLRWDT.
-
Le bit /TO du registre STATUS est mis à 1.
-
Le bit /PD du registre STATUS est mis à 0.
-
L’oscillateur est mis à l’arrêt, le PIC n’exécute plus aucune instruction.
28
Une fois dans cet état, le PIC est à l’arrêt. La consommation du circuit est réduite au
minimum. Si le TIMER 0 est synchronisé par l’horloge interne, il est également mis dans
l’incapacité de compter. Par contre, il est très important de se rappeler que le timer du
watchdog possède son propre circuit d’horloge; il continue donc de compter comme
normalement.
Plusieurs événements peuvent faire sortir le PIC du mode SLEEP :
-
Application d’un niveau 0 sur la broche /MCLR. Le PIC effectuera un reset classique à
l’adresse 0x00. L’utilisateur pourra tester les bits /TO et /PD lors du démarrage pour
vérifier l’événement concerné (reset, watch-dog, ou mise sous tension).
-
Ecoulement du temps du timer du watchdog. Pour que cet événement réveille le PIC, il
faut que le watchdog ait été mis en service dans les bits de configuration.
Dans ce cas particulier, le débordement du WDT ne provoque pas un reset du PIC, il se
contente de le réveiller. L’instruction qui suit est alors exécutée au réveil.
-
Une interruption RB0/INT, RB, ou EEPROM est survenue. Pour qu’une telle interruption
puisse réveiller le processeur, il faut que les bits de mise en service de l’interruption aient
été positionnés. Le PIC se réveille et exécute l'instruction suivant SLEEP. On peut noter
que si le bit GIE = 1 (interruptions activées) le PIC traite en plus l'IT qui l'a réveillé, sinon
il continue.
9) Les accès en mémoire EEPROM
a) Ecriture lors de la programmation
Le PIC 16F84 dispose de 64 octets implantés à partir de l'adresse 0x2100 accessibles
directement uniquement lors de la programmation à l'aide de la directive DE (Data Eeprom)
du logiciel MPLAB (voir TP).
ex :
ORG 0x2100
DE
0x10
écrit la valeur 10h dans la 1ère adresse de l'EEPROM
29
b) Accès par le programme
L'EEPROM est gérée par les registres :
- EEDATA (0x08) : C’est dans ce registre que va transiter la donnée à écrire vers, ou la
donnée lue en provenance de l’Eeprom.
- EEADR (0x09): Dans ce registre doit être précisée sur 8 bits l’adresse concernée par
l’opération de lecture ou d’écriture en EEPROM. On voit déjà que pour
cette famille de PICs, on ne peut pas dépasser 256 emplacements
d’EEPROM. Pour le 16F84, la zone admissible va de 0x00 à 0x3F (codé
en relatif par rapport à l'adresse de début de zone physique 0x2100), soit
64 emplacements.
EECON1 (0x88) : Ce registre contient 5 bits qui définissent ou indiquent le fonctionnement
des cycles de lecture/écriture en EEPROM :
bits 7/6/5 : non utilisés
EEIF (b4) : EEprom write operation Interrupt Flag bit. C’est le flag qui est en liaison avec
l’interruption EEPROM. Il passe à 1 une fois l’écriture en EEPROM
terminée. Si le bit EEIE du registre INTCON est à 1, une interruption sera
générée.
WRERR (b3) : WRite Error. C’est un bit d’erreur. Il passe à 1 si une opération d’écriture
en EEPROM a été interrompue, par exemple par un reset.
WREN (b2) : WRite ENable. Autorisation de démarrage du cycle d’écriture
WR (b1) : WRite. Démarrage du cycle d’écriture. Est remis à 0 automatiquement une
fois l’écriture terminée.
RD : ReaD. Démarrage d’un cycle de lecture. Reste à 1 durant un cycle, puis est remis à
0 automatiquement.
NB : Dans le cas où le cycle d’écriture serait interrompu suite au dépassement du watchdog
ou à un reset, il est possible de s'en apercevoir en lisant le bit WRERR. Dans ce cas les
registres EEDATA et EEADR demeurent inchangés et on peut relancer le cycle
d’écriture. Ceci ne fonctionne évidemment pas pour une coupure de tension.
30
EECON2 (0x89): Il s’agit tout simplement d’une adresse, qui sert à envoyer des commandes
au PIC concernant les procédures d'écriture en EEPROM. On ne
peut l’utiliser qu’en respectant la routine donnée par le constructeur
(voir d).
c Lecture
Pour lire une donnée en EEPROM, il suffit de placer l'adresse concernée dans le
registre EEADR, puis de positionner le bit RD à 1. On peut ensuite récupérer la donnée lue
dans le registre EEDATA. (Ne pas oublier d'effectuer les différents changements de banque !)
ex :
movlw
movwf
bsf
bsf
bcf
movf
adeeprom
EEADR
STATUS , RP0
EECON1 , RD
STATUS , RP0
EEDATA , w
; charger adresse eeprom
; adresse à lire dans registre EEADR
; passer en banque1
; lancer la lecture EEPROM
; repasser en banque 0
; charger valeur lue dans W
d Ecriture
La procédure à suivre consiste d’abord à placer la donnée dans le registre EEDATA et
l’adresse dans EEADR. Ensuite une séquence spécifique imposée par le constructeur (voir
ligne de codes en gras dans l'exemple suivant) doit être chargée dans le registre EECON2.
Remarques
-
Microchip recommande que cette procédure spécifique ne soit pas interrompue par
une interruption, donc il vaut mieux couper les interruptions durant cette phase.
-
A la fin de la procédure d’écriture, la donnée n’est pas encore enregistrée dans
l’EEPROM. Elle le sera approximativement 10 ms plus tard (ce qui représente tout de
même pas loin de 10.000 instructions !). On ne peut donc pas écrire une nouvelle
valeur en EEPROM, ou lire cette valeur avant d’avoir vérifié la fin de l’écriture
précédente.
-
La fin de l’écriture peut être constatée par la génération d’une interruption (si le bit
EEIE est positionné), ou par la lecture du flag EEIF (s’il avait été remis à 0 avant
l’écriture), ou encore par consultation du bit WR qui est à 1 durant tout le cycle
d’écriture.
31
Voici un exemple d'écriture (en gras ce qu'il est impératif de respecter selon MICROCHIP) :
movlw
movwf
movlw
movwf
bsf
bcf
bsf
data
EEDATA
addwrite
EEADR
STATUS , RP0
EECON1 , EEIF
EECON1 , WREN
; charger la donnée à écrire dans W
; placer data dans registre
; charger adresse d'écriture dans W
; placer dans registre
; passer en banque1
; effacer flag de fin d'écriture
; autoriser accès écriture
movlw
movwf
movlw
movwf
bsf
bcf
bsf
bcf
0x55
EECON2
0xAA
EECON2
EECON1 , WR
EECON1 , WREN
INTCON , GIE
STATUS , RP0
; charger 0x55
; envoyer commande
; charger 0xAA
; envoyer commande
; lancer cycle d'écriture
; verrouiller prochaine écriture
; réautoriser interruptions
; repasser en banque0
NB : Avant d'écrire dans l'EEPROM il faut vérifier qu'une autre écriture n'est pas en cours en
s'assurant que le bit WR du registre EECON1 est bien à 0
32
ANNEXE 1
extrait du cours "architecture des ordinateurs"
de T. DUMARTIN
Chapitre
4 Le microprocesseur
4
Un microprocesseur est un circuit intégré complexe caractérisé par une très
grande intégration et doté des facultés d'interprétation et d'exécution des instructions d'un programme.
Il est chargé d’organiser les tâches précisées par le programme et d’assurer leur exécution. Il doit
aussi prendre en compte les informations extérieures au système et assurer leur traitement. C’est le
cerveau du système.
A l’heure actuelle, un microprocesseur regroupe sur quelques millimètre carré des
fonctionnalités toujours plus complexes. Leur puissance continue de s’accroître et leur encombrement
diminue régulièrement respectant toujours, pour le moment, la fameuse loi de Moore (1).
4.1 Architecture de base d’un microprocesseur
Un microprocesseur est construit autour de deux éléments principaux :
ƒ Une unité de commande
ƒ Une unité de traitement
associés à des registres chargées de stocker les différentes informations à traiter. Ces trois éléments
sont reliés entre eux par des bus interne permettant les échanges d’informations.
Bus d’adresses
@
Programme
Unité de
traitement
Unité de
commande
Données
D
Bus de données
Remarques :
Il existe deux types de registres :
ƒ les registres d'usage général permettent à l'unité de traitement de manipuler des
données à vitesse élevée. Ils sont connectés au bus données interne au
microprocesseur.
ƒ les registres d'adresses (pointeurs) connectés sur le bus adresses.
4.1.1 L’unité de commande
Elle permet de séquencer le déroulement des instructions. Elle effectue la recherche en
mémoire de l'instruction. Comme chaque instruction est codée sous forme binaire, elle en assure le
décodage pour enfin réaliser son exécution puis effectue la préparation de l'instruction suivante. Pour
cela, elle est composée par :
ƒ le compteur de programme constitué par un registre dont le contenu est initialisé avec
l'adresse de la première instruction du programme. Il contient toujours l’adresse de
l’instruction à exécuter.
(1) Moore (un des co-fondateurs de la société Intel) a émis l'hypothèse que les capacités technologiques permettraient de
multiplier par 2 tous les 18 mois le nombre de transistors intégrés sur les circuits.
ƒ le registre d'instruction et le décodeur d'instruction : chacune des instructions à exécuter
est rangée dans le registre instruction puis est décodée par le décodeur d’instruction.
ƒ Bloc logique de commande (ou séquenceur) : Il organise l'exécution des instructions au
rythme d’une horloge. Il élabore tous les signaux de synchronisation internes ou externes (bus
de commande) du microprocesseur en fonction des divers signaux de commande provenant
du décodeur d’instruction ou du registre d’état par exemple. Il s'agit d'un automate réalisé soit
de façon câblée (obsolète), soit de façon micro-programmée, on parle alors de micromicroprocesseur.
4.1.2 L’unité de traitement
C’est le cœur du microprocesseur. Elle regroupe les circuits qui assurent les traitements nécessaires
à l'exécution des instructions :
ƒ L’Unité Arithmétique et Logique (UAL) est un circuit complexe qui assure les fonctions
logiques (ET, OU, Comparaison, Décalage , etc…) ou arithmétique (Addition, soustraction).
ƒ Le registre d'état est généralement composé de 8 bits à considérer individuellement. Chacun
de ces bits est un indicateur dont l'état dépend du résultat de la dernière opération effectuée
par l’UAL. On les appelle indicateur d’état ou flag ou drapeaux. Dans un programme le
résultat du test de leur état conditionne souvent le déroulement de la suite du programme. On
peut citer par exemple les indicateurs de :
o retenue (carry : C)
o retenue intermédiaire (Auxiliary-Carry : AC)
o signe (Sign : S)
o débordement (overflow : OV ou V)
o zéro (Z)
o parité (Parity : P)
ƒ Les accumulateurs sont des registres de travail qui servent à stocker une opérande au début
d'une opération arithmétique et le résultat à la fin de l'opération.
4.1.3 Schéma fonctionnel
Bus d’adresses
Registre d’@
Acc.
Registre
d’états
PC
Programme
UAL
Bus de
commande
Bloc logique de commande
Données
Registre
d’instruction
Décodeur
d’instruction
Registre Données
H
Bus de données
4.2 Cycle d’exécution d’une instruction
Le microprocesseur ne comprend qu’un certain nombre d’instructions qui sont codées en
binaire. Le traitement d’une instruction peut être décomposé en trois phases. ƒ Phase 1: Recherche de l'instruction à traiter
1. Le PC contient l'adresse de l'instruction suivante du programme. Cette valeur est placée sur le
bus d'adresses par l'unité de commande qui émet un ordre de lecture.
2. Au bout d'un certain temps (temps d'accès à la mémoire), le contenu de la case mémoire
sélectionnée est disponible sur le bus des données.
3. L'instruction est stockée dans le registre instruction du processeur.
1
microprocesseur
PC
$2000
mémoire
@ $2000
RI
Instr. 1
3
Décodeur
d’instruction
2
$2000
Instr. 1
$2001
Opér. 1
$2002
Instr. 2
$2003
Instr. 3
$2004
Inst. 1
$FFFF
ƒ Phase 2 : Décodage de l’instruction et recherche de l'opérande
Le registre d'instruction contient maintenant le premier mot de l'instruction qui peut être codée sur
plusieurs mots. Ce premier mot contient le code opératoire qui définit la nature de l'opération à
effectuer (addition, rotation,...) et le nombre de mots de l'instruction.
1. L'unité de commande transforme l'instruction en une suite de commandes élémentaires
nécessaires au traitement de l'instruction.
2. Si l'instruction nécessite une donnée en provenance de la mémoire, l'unité de commande
récupère sa valeur sur le bus de données.
3. L’opérande est stockée dans un registre.
2
microprocesseur
Bloc
logique de
commande
PC
$2000
mémoire
@ $2001
Instr. 1
RI
Décodeur
d’instruction
$2000
Instr. 1
$2001
Opér. 1
$2002
Instr. 2
$2003
Instr. 3
$2004
1
UAL
3
Opér. 2
Opér. 1
Opér. 1
$FFFF
ƒ Phase 3 : Exécution de l'instruction
1. Le micro-programme réalisant l'instruction est exécuté.
2. Les drapeaux sont positionnés (registre d'état).
3. L'unité de commande positionne le PC pour l'instruction suivante.
microprocesseur
Bloc
logique de
commande
PC
$2002
3
RI
Instr. 1
Décodeur
d’instruction
mémoire
$2000
Instr. 1
$2001
Opér. 1
$2002
Instr. 2
$2003
Instr. 3
$2004
UAL
Z=1 C=0 …
1
Result.
2
Opér. 1
$FFFF
4.3 Jeu d’instructions
4.3.1 Définition
La première étape de la conception d’un microprocesseur est la définition de son jeu
d’instructions. Le jeu d’instructions décrit l’ensemble des opérations élémentaires que le
microprocesseur pourra exécuter. Il va donc en partie déterminer l’architecture du microprocesseur à
réaliser et notamment celle du séquenceur. A un même jeu d’instructions peut correspondre un grand
nombre d’implémentations différentes du microprocesseur.
4.3.2 Type d’instructions
Les instructions que l’on retrouve dans chaque microprocesseur peuvent être classées en 4
groupes :
ƒ Transfert de données pour charger ou sauver en mémoire, effectuer des
transferts de registre à registre, etc…
ƒ Opérations arithmétiques : addition, soustraction, division, multiplication
ƒ Opérations logiques : ET, OU, NON, NAND, comparaison, test, etc…
ƒ Contrôle de séquence : branchement, test, etc…
4.3.3 Codage
Les instructions et leurs opérandes (paramètres) sont stockés en mémoire principale. La taille
totale d’une instruction (nombre de bits nécessaires pour la représenter en mémoire) dépend du type
d’instruction et aussi du type d’opérande. Chaque instruction est toujours codée sur un nombre entier
d’octets afin de faciliter son décodage par le processeur. Une instruction est composée de deux
champs :
ƒ le code instruction, qui indique au processeur quelle instruction réaliser
ƒ le champ opérande qui contient la donnée, ou la référence à une donnée en
mémoire (son adresse).
Exemple :
Code
instruction
Code
opérande
1001 0011
0011 1110
Le nombre d'instructions du jeu d'instructions est directement lié au format du code instruction.
Ainsi un octet permet de distinguer au maximum 256 instructions différentes.
4.3.4 Mode d’adressage
Un mode d'adressage définit la manière dont le microprocesseur va accéder à l’opérande. Les
différents modes d'adressage dépendent des microprocesseurs mais on retrouve en général :
ƒ l'adressage de registre où l’on traite la données contenue dans un registre
ƒ l'adressage immédiat où l’on définit immédiatement la valeur de la donnée
ƒ l'adressage direct où l’on traite une données en mémoire
Selon le mode d’adressage de la donnée, une instruction sera codée par 1 ou plusieurs octets.
4.3.5 Temps d’exécution
Chaque instruction nécessite un certain nombre de cycles d’horloges pour s’effectuer. Le
nombre de cycles dépend de la complexité de l’instruction et aussi du mode d’adressage. Il est plus
long d’accéder à la mémoire principale qu’à un registre du processeur. La durée d’un cycle dépend de
la fréquence d’horloge du séquenceur.
4.4 Langage de programmation
Le langage machine est le langage
compris par le microprocesseur. Ce langage
Langage haut niveau
est difficile à maîtriser puisque chaque
(for, if…then, write, etc…)
instruction est codée par une séquence
propre de bits. Afin de faciliter la tâche du
compilation
programmeur, on a créé différents langages
Langage assembleur
plus ou moins évolués.
(sta,
lda, cmp, mov, bra, etc…)
Le langage assembleur est le langage
le plus « proche » du langage machine. Il est
assemblage
composé par des instructions en général
assez rudimentaires que l’on appelle des
Langage machine
mnémoniques. Ce sont essentiellement des
(0001
1101, 1111 0110, etc…)
opérations de transfert de données entre les
registres et l'extérieur du microprocesseur
(mémoire ou périphérique), ou des opérations arithmétiques ou logiques. Chaque instruction
représente un code machine différent. Chaque microprocesseur peut posséder un assembleur
différent.
La difficulté de mise en œuvre de ce type de langage, et leur forte dépendance avec la machine
a nécessité la conception de langages de haut niveau, plus adaptés à l'homme, et aux applications
qu'il cherchait à développer. Faisant abstraction de toute architecture de machine, ces langages
permettent l'expression d'algorithmes sous une forme plus facile à apprendre, et à dominer (C, Pascal,
Java, etc…). Chaque instruction en langage de haut niveau correspondra à une succession
d’instructions en langage assembleur. Une fois développé, le programme en langage de haut niveau
n’est donc pas compréhensible par le microprocesseur. Il faut le compiler pour le traduire en
assembleur puis l’assembler pour le convertir en code machine compréhensible par le
microprocesseur. Ces opérations sont réalisées à partir de logiciels spécialisés appelés compilateur et
assembleur.
Exemple de programme :
Code machine ( 68HC11 )
@00
@01
@03
@04
@05
C6 64
B6 00
1B
5A
26 03
Assembleur ( 68HC11 )
Langage C
LDAB #100
LDAA #0
ABA
DECB
BNE ret
A=0 ;
for ( i=1 ; i<101 ; i++) A=A+i ;
ret
4.5 Performances d’un microprocesseur
On peut caractériser la puissance d’un microprocesseur par le nombre d’instructions qu’il est
capable de traiter par seconde. Pour cela, on définit :
ƒ le CPI (Cycle Par Instruction) qui représente le nombre moyen de cycles d’horloge
nécessaire pour l’exécution d’une instruction pour un microprocesseur donné.
ƒ le MIPS (Millions d'Instructions Par Seconde) qui représente la puissance de
traitement du microprocesseur.
MIPS=
FH
CPI
avec FH en MHz
Pour augmenter les performances d’un microprocesseur, on peut donc soit augmenter la fréquence
d'horloge (limitation matérielle), soit diminuer le CPI (choix d'un jeu d'instruction adapté).
4.6 Notion d’architecture RISC et CISC
Actuellement l’architecture des microprocesseurs se composent de deux grandes familles :
ƒ L’ architecture CISC (Complex Instruction Set Computer)
ƒ L’architecture RISC (Reduced Instruction Set Computer)
4.6.1 L’architecture CISC
4.6.1.1 Pourquoi
Par le passé la conception de machines CISC était la seule envisageable. En effet, vue que la
mémoire travaillait très lentement par rapport au processeur, on pensait qu’il était plus intéressant de
soumettre au microprocesseur des instructions complexes. Ainsi, plutôt que de coder une opération
complexe par plusieurs instructions plus petites (qui demanderaient autant d’accès mémoire très lent),
il semblait préférable d’ajouter au jeu d’instructions du microprocesseur une instruction complexe qui
se chargerait de réaliser cette opération. De plus, le développement des langages de haut niveau
posa de nombreux problèmes quant à la conception de compilateurs. On a donc eu tendance à
incorporer au niveau processeur des instructions plus proches de la structure de ces langages.
4.6.1.2 Comment
C’est donc une architecture avec un grand nombre d’instructions où le microprocesseur doit
exécuter des tâches complexes par instruction unique. Pour une tâche donnée, une machine CISC
exécute ainsi un petit nombre d’instructions mais chacune nécessite un plus grand nombre de cycles
d’horloge. Le code machine de ces instructions varie d’une instruction à l’autre et nécessite donc un
décodeur complexe (micro-code)
4.6.2 L’architecture RISC
4.6.2.1 Pourquoi
Des études statistiques menées au cours des années 70 ont clairement montré que les
programmes générés par les compilateurs se contentaient le plus souvent d'affectations, d'additions et
de multiplications par des constantes. Ainsi, 80% des traitements des langages de haut niveau
faisaient appel à seulement 20% des instructions du microprocesseur. D’où l’idée de réduire le jeu
d’instructions à celles le plus couramment utilisées et d’en améliorer la vitesse de traitement.
4.6.2.2 Comment
C’est donc une architecture dans laquelle les instructions sont en nombre réduit (chargement,
branchement, appel sous-programme). Les architectures RISC peuvent donc être réalisées à partir de
séquenceur câblé. Leur réalisation libère de la surface permettant d’augmenter le nombres de
registres ou d’unités de traitement par exemple. Chacune de ces instructions s’exécutent ainsi en un
cycle d’horloge. Bien souvent, ces instructions ne disposent que d’un seul mode d’adressage. Les
accès à la mémoire s’effectue seulement à partir de deux instructions (Load et Store). Par contre, les
instructions complexes doivent être réalisées à partir de séquences basées sur les instructions
élémentaires, ce qui nécessite un compilateur très évolué dans le cas de programmation en langage
de haut niveau.
ANNEXE 2
Jeu d'instructions des PICs (sauf 16C5X)
PIC16F8X
9.1
Instruction Descriptions
ADDLW
Add Literal and W
ANDLW
Syntax:
[label] ADDLW
Syntax:
[label] ANDLW
Operands:
0 ≤ k ≤ 255
Operands:
0 ≤ k ≤ 255
Operation:
(W) + k → (W)
Operation:
(W) .AND. (k) → (W)
C, DC, Z
Status Affected:
Z
Status Affected:
Encoding:
11
k
111x
kkkk
kkkk
AND Literal with W
Encoding:
11
The contents of the W register are
added to the eight bit literal 'k' and the
result is placed in the W register.
Description:
Words:
1
Words:
1
Cycles:
1
Cycles:
1
Description:
Q Cycle Activity:
Example:
Q1
Q2
Q3
Q4
Decode
Read
literal 'k'
Process
data
Write to
W
ADDLW
0x15
=
Example
=
ADDWF
Add W and f
Syntax:
[label] ADDWF
Operands:
kkkk
kkkk
Q1
Q2
Q3
Q4
Decode
Read
literal "k"
Process
data
Write to
W
ANDLW
0x5F
Before Instruction
W
0x10
=
0xA3
After Instruction
After Instruction
W
1001
The contents of W register are
AND’ed with the eight bit literal 'k'. The
result is placed in the W register.
Q Cycle Activity:
Before Instruction
W
k
W
0x25
ANDWF
=
0x03
AND W with f
Syntax:
[label] ANDWF
0 ≤ f ≤ 127
d ∈ [0,1]
Operands:
0 ≤ f ≤ 127
d ∈ [0,1]
Operation:
(W) + (f) → (destination)
Operation:
(W) .AND. (f) → (destination)
Status Affected:
C, DC, Z
Status Affected:
Z
Encoding:
Description:
00
f,d
0111
dfff
ffff
Encoding:
00
Add the contents of the W register with
register 'f'. If 'd' is 0 the result is stored
in the W register. If 'd' is 1 the result is
stored back in register 'f'.
Description:
Words:
1
Words:
1
Cycles:
1
Cycles:
1
Q Cycle Activity:
Example
Q1
Q2
Q3
Q4
Decode
Read
register
'f'
Process
data
Write to
destination
ADDWF
FSR, 0
Before Instruction
W =
FSR =
© 1998 Microchip Technology Inc.
Example
0101
dfff
ffff
AND the W register with register 'f'. If 'd'
is 0 the result is stored in the W register. If 'd' is 1 the result is stored back in
register 'f'.
Q1
Q2
Q3
Q4
Decode
Read
register
'f'
Process
data
Write to
destination
ANDWF
FSR, 1
Before Instruction
0x17
0xC2
After Instruction
W =
FSR =
Q Cycle Activity:
f,d
W =
FSR =
0x17
0xC2
After Instruction
0xD9
0xC2
W =
FSR =
0x17
0x02
DS30430C-page 55
PIC16F8X
BCF
Bit Clear f
Syntax:
[label] BCF
BTFSC
Bit Test, Skip if Clear
Syntax:
[label] BTFSC f,b
Operands:
0 ≤ f ≤ 127
0≤b≤7
Operands:
0 ≤ f ≤ 127
0≤b≤7
Operation:
0 → (f<b>)
Operation:
skip if (f<b>) = 0
Status Affected:
None
Status Affected:
None
Encoding:
Description:
01
f,b
00bb
bfff
ffff
Bit 'b' in register 'f' is cleared.
Words:
1
Cycles:
1
Q Cycle Activity:
Example
Description:
Q1
Q2
Q3
Q4
Decode
Read
register
'f'
Process
data
Write
register 'f'
BCF
Encoding:
Words:
1
Cycles:
1(2)
Q Cycle Activity:
FLAG_REG, 7
01
Before Instruction
10bb
bfff
ffff
If bit 'b' in register 'f' is '1' then the next
instruction is executed.
If bit 'b', in register 'f', is '0' then the next
instruction is discarded, and a NOP is
executed instead, making this a 2TCY
instruction.
Q1
Q2
Q3
Q4
Decode
Read
register 'f'
Process
data
No-Operat
ion
Q3
Q4
FLAG_REG = 0xC7
If Skip:
After Instruction
FLAG_REG = 0x47
(2nd Cycle)
Q1
Q2
No-Operati No-Opera No-Operat
on
tion
ion
No-Operat
ion
Example
HERE
FALSE
TRUE
BTFSC
GOTO
•
•
•
FLAG,1
PROCESS_CODE
Before Instruction
PC =
address HERE
After Instruction
BSF
Bit Set f
Syntax:
[label] BSF
Operands:
0 ≤ f ≤ 127
0≤b≤7
Operation:
1 → (f<b>)
Status Affected:
None
Encoding:
Description:
01
1
Cycles:
1
Example
f,b
01bb
bfff
ffff
Bit 'b' in register 'f' is set.
Words:
Q Cycle Activity:
if FLAG<1> = 0,
PC =
address TRUE
if FLAG<1>=1,
PC =
address FALSE
Q1
Q2
Q3
Q4
Decode
Read
register
'f'
Process
data
Write
register 'f'
BSF
FLAG_REG,
7
Before Instruction
FLAG_REG = 0x0A
After Instruction
FLAG_REG = 0x8A
DS30430C-page 56
© 1998 Microchip Technology Inc.
PIC16F8X
BTFSS
Bit Test f, Skip if Set
CALL
Call Subroutine
Syntax:
[label] BTFSS f,b
Syntax:
[ label ] CALL k
Operands:
0 ≤ f ≤ 127
0≤b<7
Operands:
0 ≤ k ≤ 2047
Operation:
(PC)+ 1→ TOS,
k → PC<10:0>,
(PCLATH<4:3>) → PC<12:11>
Status Affected:
None
Operation:
skip if (f<b>) = 1
Status Affected:
None
Encoding:
Description:
01
1
Cycles:
1(2)
If Skip:
bfff
ffff
If bit 'b' in register 'f' is '0' then the next
instruction is executed.
If bit 'b' is '1', then the next instruction is
discarded and a NOP is executed
instead, making this a 2TCY instruction.
Words:
Q Cycle Activity:
11bb
Q1
Q2
Q3
Q4
Decode
Read
register 'f'
Process
data
No-Operat
ion
(2nd Cycle)
Q1
Q2
HERE
FALSE
TRUE
BTFSC
GOTO
•
•
•
Q3
10
Words:
1
Cycles:
2
Q Cycle Activity:
FLAG,1
PROCESS_CODE
2nd Cycle
Example
0kkk
kkkk
kkkk
Call Subroutine. First, return address
(PC+1) is pushed onto the stack. The
eleven bit immediate address is loaded
into PC bits <10:0>. The upper bits of
the PC are loaded from PCLATH. CALL
is a two cycle instruction.
Q1
Q2
Q3
Q4
Decode
Read
literal 'k',
Push PC
to Stack
Process
data
Write to
PC
Q4
No-Opera
tion
HERE
No-Opera No-Opera No-Operat
tion
tion
ion
CALL
THERE
Before Instruction
PC = Address HERE
After Instruction
Before Instruction
PC =
Description:
1st Cycle
No-Operati No-Opera No-Operat
on
tion
ion
No-Operat
ion
Example
Encoding:
address HERE
PC = Address THERE
TOS = Address HERE+1
After Instruction
if FLAG<1> = 0,
PC =
address FALSE
if FLAG<1> = 1,
PC =
address TRUE
© 1998 Microchip Technology Inc.
DS30430C-page 57
PIC16F8X
CLRF
Clear f
Syntax:
[label] CLRF
Operands:
CLRW
Clear W
Syntax:
[ label ] CLRW
0 ≤ f ≤ 127
Operands:
None
Operation:
00h → (f)
1→Z
Operation:
00h → (W)
1→Z
Status Affected:
Z
Status Affected:
Z
Encoding:
Description:
00
f
0001
1fff
ffff
Encoding:
00
The contents of register 'f' are cleared
and the Z bit is set.
Description:
Words:
1
Words:
1
Cycles:
1
Cycles:
1
Q Cycle Activity:
Example
Q1
Q2
Q3
Q4
Decode
Read
register
'f'
Process
data
Write
register 'f'
CLRF
Q Cycle Activity:
Example
FLAG_REG
=
0x5A
xxxx
Q1
Q2
Q3
Q4
Decode
No-Opera
tion
Process
data
Write to
W
CLRW
=
=
0x00
1
W
=
0x5A
After Instruction
After Instruction
FLAG_REG
Z
0xxx
Before Instruction
Before Instruction
FLAG_REG
0001
W register is cleared. Zero bit (Z) is
set.
W
Z
CLRWDT
=
=
0x00
1
Clear Watchdog Timer
Syntax:
[ label ] CLRWDT
Operands:
None
Operation:
00h → WDT
0 → WDT prescaler,
1 → TO
1 → PD
Status Affected:
TO, PD
Encoding:
Description:
00
Words:
1
Cycles:
1
Q Cycle Activity:
Example
0000
0110
0100
CLRWDT instruction resets the Watchdog Timer. It also resets the prescaler
of the WDT. Status bits TO and PD are
set.
Q1
Q2
Q3
Q4
Decode
No-Opera
tion
Process
data
Clear
WDT
Counter
CLRWDT
Before Instruction
WDT counter =
?
After Instruction
WDT counter =
WDT prescaler=
TO
=
PD
=
DS30430C-page 58
0x00
0
1
1
© 1998 Microchip Technology Inc.
PIC16F8X
COMF
Complement f
Syntax:
[ label ] COMF
Operands:
DECFSZ
Decrement f, Skip if 0
Syntax:
[ label ] DECFSZ f,d
0 ≤ f ≤ 127
d ∈ [0,1]
Operands:
0 ≤ f ≤ 127
d ∈ [0,1]
Operation:
(f) → (destination)
Operation:
Status Affected:
Z
(f) - 1 → (destination);
skip if result = 0
Status Affected:
None
Encoding:
Description:
00
f,d
1001
dfff
ffff
The contents of register 'f' are complemented. If 'd' is 0 the result is stored in
W. If 'd' is 1 the result is stored back in
register 'f'.
Words:
1
Cycles:
1
Q Cycle Activity:
Q1
Q2
Q3
Q4
Decode
Read
register
'f'
Process
data
Write to
destination
Encoding:
Description:
Words:
1
Cycles:
1(2)
Q Cycle Activity:
Example
COMF
00
REG1,0
REG1
=
0x13
REG1
W
=
=
0x13
0xEC
If Skip:
DECF
[label] DECF f,d
Operands:
0 ≤ f ≤ 127
d ∈ [0,1]
Operation:
(f) - 1 → (destination)
Status Affected:
Z
Q1
Q2
Q3
Q4
Read
register 'f'
Process
data
Write to
destination
Q3
Q4
Description:
0011
dfff
ffff
Decrement register 'f'. If 'd' is 0 the
result is stored in the W register. If 'd' is
1 the result is stored back in register 'f'.
1
Cycles:
1
Example
Example
HERE
DECFSZ
GOTO
CONTINUE •
•
•
CNT, 1
LOOP
Before Instruction
00
Words:
Q Cycle Activity:
(2nd Cycle)
Q1
Q2
PC
Encoding:
ffff
No-Opera No-Operat No-Operati
tion
ion
on
No-Operat
ion
Decrement f
Syntax:
dfff
Decode
Before Instruction
After Instruction
1011
The contents of register 'f' are decremented. If 'd' is 0 the result is placed in the
W register. If 'd' is 1 the result is placed
back in register 'f'.
If the result is 1, the next instruction, is
executed. If the result is 0, then a NOP is
executed instead making it a 2TCY instruction.
Q1
Q2
Q3
Q4
Decode
Read
register
'f'
Process
data
Write to
destination
DECF
=
address HERE
After Instruction
CNT
if CNT
PC
if CNT
PC
=
=
=
≠
=
CNT - 1
0,
address CONTINUE
0,
address HERE+1
CNT, 1
Before Instruction
CNT
Z
=
=
0x01
0
=
=
0x00
1
After Instruction
CNT
Z
© 1998 Microchip Technology Inc.
DS30430C-page 59
PIC16F8X
Unconditional Branch
INCF
Syntax:
[ label ]
Syntax:
[ label ]
Operands:
0 ≤ k ≤ 2047
Operands:
Operation:
k → PC<10:0>
PCLATH<4:3> → PC<12:11>
0 ≤ f ≤ 127
d ∈ [0,1]
Operation:
(f) + 1 → (destination)
Status Affected:
None
Status Affected:
Z
GOTO
Encoding:
10
GOTO k
1kkk
kkkk
kkkk
Increment f
Encoding:
Description:
00
GOTO is an unconditional branch. The
eleven bit immediate value is loaded
into PC bits <10:0>. The upper bits of
PC are loaded from PCLATH<4:3>.
GOTO is a two cycle instruction.
Words:
1
Words:
1
2
Cycles:
1
Q Cycle Activity:
1st Cycle
2nd Cycle
Q1
Decode
No-Operat
ion
Q2
Read
literal 'k'
Q3
Process
data
Q4
Q Cycle Activity:
Write to
PC
1010
dfff
ffff
The contents of register 'f' are incremented. If 'd' is 0 the result is placed in
the W register. If 'd' is 1 the result is
placed back in register 'f'.
Description:
Cycles:
INCF f,d
Q1
Q2
Q3
Q4
Decode
Read
register
'f'
Process
data
Write to
destination
INCF
CNT, 1
No-Operat No-Opera No-Operat
ion
tion
ion
Example
Before Instruction
Example
GOTO THERE
CNT
Z
After Instruction
PC =
DS30430C-page 60
Address THERE
=
=
0xFF
0
=
=
0x00
1
After Instruction
CNT
Z
© 1998 Microchip Technology Inc.
PIC16F8X
INCFSZ
Increment f, Skip if 0
IORLW
Syntax:
[ label ]
Syntax:
[ label ]
Operands:
0 ≤ f ≤ 127
d ∈ [0,1]
Operands:
0 ≤ k ≤ 255
Operation:
(f) + 1 → (destination),
skip if result = 0
(W) .OR. k → (W)
Operation:
Status Affected:
Z
Status Affected:
00
1
Cycles:
1(2)
If Skip:
ffff
Q1
Q2
Q3
Q4
Decode
Read
register 'f'
Process
data
Write to
destination
Q3
Q4
(2nd Cycle)
Q1
Q2
No-Operat
ion
Example
dfff
The contents of register 'f' are incremented. If 'd' is 0 the result is placed in
the W register. If 'd' is 1 the result is
placed back in register 'f'.
If the result is 1, the next instruction is
executed. If the result is 0, a NOP is executed instead making it a 2TCY instruction.
Words:
Q Cycle Activity:
1111
Inclusive OR Literal with W
Encoding:
None
Encoding:
Description:
INCFSZ f,d
Description:
11
1
Cycles:
1
Example
1000
kkkk
kkkk
The contents of the W register is
OR’ed with the eight bit literal 'k'. The
result is placed in the W register.
Words:
Q Cycle Activity:
IORLW k
Q1
Q2
Q3
Q4
Decode
Read
literal 'k'
Process
data
Write to
W
IORLW
0x35
Before Instruction
W
=
0x9A
After Instruction
W
Z
=
=
0xBF
1
No-Opera No-Opera No-Operati
tion
tion
on
HERE
INCFSZ
GOTO
CONTINUE •
•
•
CNT, 1
LOOP
Before Instruction
PC
=
address HERE
After Instruction
CNT =
if CNT=
PC
=
if CNT≠
PC
=
© 1998 Microchip Technology Inc.
CNT + 1
0,
address CONTINUE
0,
address HERE +1
DS30430C-page 61
PIC16F8X
IORWF
Inclusive OR W with f
MOVLW
Move Literal to W
Syntax:
[ label ]
Syntax:
[ label ]
Operands:
0 ≤ f ≤ 127
d ∈ [0,1]
Operands:
0 ≤ k ≤ 255
Operation:
(W) .OR. (f) → (destination)
Operation:
k → (W)
Status Affected:
Z
Status Affected:
None
Encoding:
IORWF
00
f,d
0100
dfff
ffff
Description:
Inclusive OR the W register with register 'f'. If 'd' is 0 the result is placed in the
W register. If 'd' is 1 the result is placed
back in register 'f'.
Words:
1
Cycles:
1
Q Cycle Activity:
Example
Encoding:
Description:
11
Q2
Q3
Q4
Decode
Read
register
'f'
Process
data
Write to
destination
IORWF
00xx
kkkk
kkkk
The eight bit literal 'k' is loaded into W
register. The don’t cares will assemble
as 0’s.
Words:
1
Cycles:
1
Q Cycle Activity:
Q1
MOVLW k
Example
Q1
Q2
Q3
Q4
Decode
Read
literal 'k'
Process
data
Write to
W
MOVLW
0x5A
After Instruction
RESULT, 0
W
=
0x5A
Before Instruction
RESULT =
W
=
0x13
0x91
After Instruction
RESULT =
W
=
Z
=
MOVF
Move f
Syntax:
[ label ]
0x13
0x93
1
MOVWF
MOVF f,d
Move W to f
Syntax:
[ label ]
0 ≤ f ≤ 127
MOVWF
Operands:
0 ≤ f ≤ 127
d ∈ [0,1]
Operands:
Operation:
(W) → (f)
Operation:
(f) → (destination)
Status Affected:
None
Status Affected:
Z
Encoding:
Encoding:
Description:
00
dfff
ffff
The contents of register f is moved to a
destination dependant upon the status
of d. If d = 0, destination is W register. If
d = 1, the destination is file register f
itself. d = 1 is useful to test a file register since status flag Z is affected.
Words:
1
Cycles:
1
Q Cycle Activity:
1000
Q1
Q2
Q3
Q4
Decode
Read
register
'f'
Process
data
Write to
destination
Description:
00
1
Cycles:
1
Example
1fff
ffff
Move data from W register to register
'f'.
Words:
Q Cycle Activity:
0000
f
Q1
Q2
Q3
Q4
Decode
Read
register
'f'
Process
data
Write
register 'f'
MOVWF
OPTION_REG
Before Instruction
OPTION =
W
=
0xFF
0x4F
After Instruction
Example
MOVF
FSR, 0
After Instruction
OPTION =
W
=
0x4F
0x4F
W = value in FSR register
Z =1
DS30430C-page 62
© 1998 Microchip Technology Inc.
PIC16F8X
NOP
No Operation
RETFIE
Return from Interrupt
Syntax:
[ label ]
Syntax:
[ label ]
Operands:
None
Operands:
None
Operation:
No operation
Operation:
Status Affected:
None
TOS → PC,
1 → GIE
Status Affected:
None
Encoding:
00
NOP
0000
Description:
No operation.
Words:
1
Cycles:
1
Q Cycle Activity:
0000
Encoding:
Description:
Q1
Decode
Example
0xx0
Q2
Q3
Q4
No-Opera No-Opera No-Operat
tion
tion
ion
NOP
00
1
Cycles:
2
1st Cycle
2nd Cycle
Example
0000
0000
1001
Return from Interrupt. Stack is POPed
and Top of Stack (TOS) is loaded in the
PC. Interrupts are enabled by setting
Global Interrupt Enable bit, GIE
(INTCON<7>). This is a two cycle
instruction.
Words:
Q Cycle Activity:
RETFIE
Q1
Q2
Q3
Q4
Decode
No-Opera
tion
Set the
GIE bit
Pop from
the Stack
No-Operat
ion
No-Opera No-Opera No-Operat
tion
tion
ion
RETFIE
After Interrupt
PC =
GIE =
OPTION
Load Option Register
Syntax:
[ label ]
Operands:
None
Operation:
(W) → OPTION
TOS
1
OPTION
Status Affected: None
Encoding:
00
0000
0110
0010
Description:
The contents of the W register are
loaded in the OPTION register. This
instruction is supported for code compatibility with PIC16C5X products.
Since OPTION is a readable/writable
register, the user can directly address
it.
Words:
1
Cycles:
1
Example
To maintain upward compatibility
with future PIC16CXX products,
do not use this instruction.
© 1998 Microchip Technology Inc.
DS30430C-page 63
PIC16F8X
RETLW
Return with Literal in W
RETURN
Syntax:
[ label ]
Syntax:
[ label ]
Operands:
0 ≤ k ≤ 255
Operands:
None
Operation:
k → (W);
TOS → PC
Operation:
TOS → PC
Status Affected:
None
Status Affected:
RETLW k
None
Encoding:
Encoding:
11
Description:
01xx
kkkk
kkkk
The W register is loaded with the eight
bit literal 'k'. The program counter is
loaded from the top of the stack (the
return address). This is a two cycle
instruction.
Words:
1
Cycles:
2
Q Cycle Activity:
1st Cycle
2nd Cycle
Return from Subroutine
Description:
1
Cycles:
2
Q1
Q2
Read
literal 'k'
Q3
Q4
No-Opera Write to W,
tion
Pop from
the Stack
No-Opera No-Opera No-Operat
tion
tion
ion
No-Operat
ion
1st Cycle
2nd Cycle
Example
0000
0000
1000
Return from subroutine. The stack is
POPed and the top of the stack (TOS)
is loaded into the program counter. This
is a two cycle instruction.
Words:
Q Cycle Activity:
Decode
00
RETURN
Q1
Decode
No-Operat
ion
Q2
Q3
Q4
No-Opera No-Opera Pop from
tion
tion
the Stack
No-Opera No-Opera No-Opera
tion
tion
tion
RETURN
After Interrupt
Example
CALL TABLE
;W contains table
;offset value
;W now has table value
•
•
•
TABLE ADDWF PC
RETLW k1
RETLW k2
PC =
TOS
;W = offset
;Begin table
;
•
•
•
RETLW kn
; End of table
Before Instruction
W
=
0x07
After Instruction
W
DS30430C-page 64
=
value of k8
© 1998 Microchip Technology Inc.
PIC16F8X
RLF
Rotate Left f through Carry
RRF
Rotate Right f through Carry
Syntax:
[ label ]
Syntax:
[ label ]
Operands:
0 ≤ f ≤ 127
d ∈ [0,1]
Operands:
0 ≤ f ≤ 127
d ∈ [0,1]
Operation:
See description below
Operation:
See description below
Status Affected:
C
Status Affected:
C
Encoding:
Description:
RLF
00
1101
f,d
dfff
ffff
The contents of register 'f' are rotated
one bit to the left through the Carry
Flag. If 'd' is 0 the result is placed in the
W register. If 'd' is 1 the result is stored
back in register 'f'.
C
Encoding:
Description:
00
Register f
C
1
Words:
1
Cycles:
1
Cycles:
1
Example
Q1
Q2
Q3
Q4
Decode
Read
register
'f'
Process
data
Write to
destination
RLF
REG1,0
© 1998 Microchip Technology Inc.
dfff
ffff
Register f
Q1
Q2
Q3
Q4
Decode
Read
register
'f'
Process
data
Write to
destination
RRF
REG1,0
Before Instruction
=
=
1110 0110
0
=
=
=
1110 0110
1100 1100
1
After Instruction
REG1
W
C
Q Cycle Activity:
Example
Before Instruction
REG1
C
1100
The contents of register 'f' are rotated
one bit to the right through the Carry
Flag. If 'd' is 0 the result is placed in the
W register. If 'd' is 1 the result is placed
back in register 'f'.
Words:
Q Cycle Activity:
RRF f,d
REG1
C
=
=
1110 0110
0
=
=
=
1110 0110
0111 0011
0
After Instruction
REG1
W
C
DS30430C-page 65
PIC16F8X
SLEEP
SUBLW
Subtract W from Literal
Syntax:
[ label ]
Syntax:
[ label ]
Operands:
None
Operands:
0 ≤ k ≤ 255
Operation:
00h → WDT,
0 → WDT prescaler,
1 → TO,
0 → PD
Operation:
k - (W) → (W)
Status Affected:
C, DC, Z
Status Affected:
SLEEP
Encoding:
Description:
TO, PD
Encoding:
00
0000
0110
0011
11
Words:
1
Cycles:
1
Words:
1
Example 1:
Cycles:
1
Q Cycle Activity:
Q Cycle Activity:
110x
kkkk
kkkk
The W register is subtracted (2’s complement method) from the eight bit literal 'k'.
The result is placed in the W register.
The power-down status bit, PD is
cleared. Time-out status bit, TO is
set. Watchdog Timer and its prescaler
are cleared.
The processor is put into SLEEP
mode with the oscillator stopped. See
Section 14.8 for more details.
Description:
SUBLW k
Q1
Q2
Q3
Q4
Decode
Read
literal 'k'
Process
data
Write to W
SUBLW
0x02
Before Instruction
Q1
Decode
Q2
Q3
No-Opera No-Opera
tion
tion
Q4
W
C
Z
Go to
Sleep
=
=
=
1
?
?
After Instruction
Example:
SLEEP
W
C
Z
Example 2:
=
=
=
1
1; result is positive
0
Before Instruction
W
C
Z
=
=
=
2
?
?
After Instruction
W
C
Z
Example 3:
=
=
=
0
1; result is zero
1
Before Instruction
W
C
Z
=
=
=
3
?
?
After Instruction
W =
C
=
tive
Z
=
DS30430C-page 66
0xFF
0; result is nega0
© 1998 Microchip Technology Inc.
PIC16F8X
SUBWF
Subtract W from f
SWAPF
Swap Nibbles in f
Syntax:
[ label ] SWAPF f,d
Syntax:
[ label ]
Operands:
0 ≤ f ≤ 127
d ∈ [0,1]
Operands:
0 ≤ f ≤ 127
d ∈ [0,1]
Operation:
(f) - (W) → (destination)
Operation:
(f<3:0>) → (destination<7:4>),
(f<7:4>) → (destination<3:0>)
Status Affected:
None
SUBWF f,d
Status Affected: C, DC, Z
Encoding:
Description:
00
1
Cycles:
1
Example 1:
dfff
ffff
Subtract (2’s complement method) W register from register 'f'. If 'd' is 0 the result is
stored in the W register. If 'd' is 1 the
result is stored back in register 'f'.
Words:
Q Cycle Activity:
0010
Q1
Q2
Q3
Q4
Decode
Read
register 'f'
Process
data
Write to
destination
SUBWF
Description:
00
Words:
1
Cycles:
1
Q Cycle Activity:
Example 2:
Example
=
=
=
=
Q1
Q2
Q3
Q4
Read
register 'f'
Process
data
Write to
destination
SWAPF REG,
=
=
=
=
=
=
=
=
Example 3:
=
=
=
=
REG1
=
=
=
=
© 1998 Microchip Technology Inc.
=
=
=
=
0xA5
=
=
0xA5
0x5A
1
2
1; result is positive
0
2
2
?
?
TRIS
Load TRIS Register
Syntax:
[label]
Operands:
5≤f≤7
Operation:
(W) → TRIS register f;
TRIS
f
Status Affected: None
0
2
1; result is zero
1
1
2
?
?
After Instruction
REG1
W
C
Z
=
After Instruction
Encoding:
0xFF
2
0; result is negative
0
00
0000
0110
0fff
Description:
The instruction is supported for code
compatibility with the PIC16C5X products. Since TRIS registers are readable and writable, the user can directly
address them.
Words:
1
Cycles:
1
Before Instruction
REG1
W
C
Z
0
REG1
W
After Instruction
REG1
W
C
Z
ffff
Before Instruction
3
2
?
?
Before Instruction
REG1
W
C
Z
dfff
Decode
After Instruction
REG1
W
C
Z
1110
The upper and lower nibbles of register
'f' are exchanged. If 'd' is 0 the result is
placed in W register. If 'd' is 1 the result
is placed in register 'f'.
REG1,
Before Instruction
REG1
W
C
Z
Encoding:
Example
To maintain upward compatibility
with future PIC16CXX products,
do not use this instruction.
DS30430C-page 67
PIC16F8X
XORLW
Exclusive OR Literal with W
XORWF
Exclusive OR W with f
Syntax:
[label]
Syntax:
[label]
Operands:
0 ≤ k ≤ 255
Operands:
Operation:
(W) .XOR. k → (W)
0 ≤ f ≤ 127
d ∈ [0,1]
Status Affected:
Z
Operation:
(W) .XOR. (f) → (destination)
Status Affected:
Z
Encoding:
11
XORLW k
1010
kkkk
kkkk
Description:
The contents of the W register are
XOR’ed with the eight bit literal 'k'.
The result is placed in the W register.
Words:
1
Cycles:
1
Q Cycle Activity:
Example:
Q1
Q2
Q3
Q4
Decode
Read
literal 'k'
Process
data
Write to
W
XORLW
Encoding:
Description:
00
0110
f,d
dfff
ffff
Exclusive OR the contents of the W
register with register 'f'. If 'd' is 0 the
result is stored in the W register. If 'd' is
1 the result is stored back in register 'f'.
Words:
1
Cycles:
1
Q Cycle Activity:
XORWF
Q1
Q2
Q3
Q4
Decode
Read
register
'f'
Process
data
Write to
destination
0xAF
Before Instruction
W
=
Example
0xB5
After Instruction
W
=
0x1A
XORWF
REG
1
Before Instruction
REG
W
=
=
0xAF
0xB5
=
=
0x1A
0xB5
After Instruction
REG
W
DS30430C-page 68
© 1998 Microchip Technology Inc.
ANNEXE 3
complément doc du 16F84
PIC16F8X
FIGURE 8-1:
CONFIGURATION WORD - PIC16CR83 AND PIC16CR84
R-u
R-u
R-u
R-u
R-u
R-u
R/P-u
R-u
R-u
R-u
CP
bit13
CP
CP
CP
CP
CP
DP
CP
CP
CP
R-u
R-u
R-u
R-u
PWRTE WDTE FOSC1 FOSC0
bit0
R = Readable bit
P = Programmable bit
- n = Value at POR reset
u = unchanged
bit 13:8 CP: Program Memory Code Protection bit
1 = Code protection off
0 = Program memory is code protected
bit 7
DP: Data Memory Code Protection bit
1 = Code protection off
0 = Data memory is code protected
bit 6:4
CP: Program Memory Code Protection bit
1 = Code protection off
0 = Program memory is code protected
bit 3
PWRTE: Power-up Timer Enable bit
1 = Power-up timer is disabled
0 = Power-up timer is enabled
bit 2
WDTE: Watchdog Timer Enable bit
1 = WDT enabled
0 = WDT disabled
bit 1:0
FOSC1:FOSC0: Oscillator Selection bits
11 = RC oscillator
10 = HS oscillator
01 = XT oscillator
00 = LP oscillator
FIGURE 8-2:
CONFIGURATION WORD - PIC16F83 AND PIC16F84
R/P-u R/P-u R/P-u R/P-u R/P-u R/P-u R/P-u R/P-u R/P-u
CP
CP
CP
CP
CP
CP
CP
CP
CP
bit13
R/P-u
CP
R/P-u
R/P-u R/P-u
R/P-u
PWRTE WDTE FOSC1 FOSC0
bit0
R = Readable bit
P = Programmable bit
- n = Value at POR reset
u = unchanged
bit 13:4 CP: Code Protection bit
1 = Code protection off
0 = All memory is code protected
bit 3
PWRTE: Power-up Timer Enable bit
1 = Power-up timer is disabled
0 = Power-up timer is enabled
bit 2
WDTE: Watchdog Timer Enable bit
1 = WDT enabled
0 = WDT disabled
bit 1:0
FOSC1:FOSC0: Oscillator Selection bits
11 = RC oscillator
10 = HS oscillator
01 = XT oscillator
00 = LP oscillator
DS30430C-page 38
© 1998 Microchip Technology Inc.
PIC16F8X
8.2
Oscillator Configurations
8.2.1
OSCILLATOR TYPES
TABLE 8-1
The PIC16F8X can be operated in four different
oscillator modes. The user can program two
configuration bits (FOSC1 and FOSC0) to select one of
these four modes:
•
•
•
•
LP
XT
HS
RC
Low Power Crystal
Crystal/Resonator
High Speed Crystal/Resonator
Resistor/Capacitor
8.2.2
CAPACITOR SELECTION
FOR CERAMIC RESONATORS
Ranges Tested:
Mode
Freq
XT
455 kHz
2.0 MHz
4.0 MHz
8.0 MHz
10.0 MHz
HS
Note :
CRYSTAL OSCILLATOR / CERAMIC
RESONATORS
In XT, LP or HS modes a crystal or ceramic resonator
is connected to the OSC1/CLKIN and OSC2/CLKOUT
pins to establish oscillation (Figure 8-3).
OSC1/C1
OSC2/C2
47 - 100 pF 47 - 100 pF
15 - 33 pF 15 - 33 pF
15 - 33 pF 15 - 33 pF
15 - 33 pF 15 - 33 pF
15 - 33 pF 15 - 33 pF
Recommended values of C1 and C2 are identical to
the ranges tested table.
Higher capacitance increases the stability of the
oscillator but also increases the start-up time.
These values are for design guidance only. Since
each resonator has its own characteristics, the user
should consult the resonator manufacturer for the
appropriate values of external components.
Resonators Tested:
FIGURE 8-3:
CRYSTAL/CERAMIC
RESONATOR OPERATION
(HS, XT OR LP OSC
CONFIGURATION)
C1(1)
OSC1
XTAL
RF(3)
OSC2
C2(1)
Note1:
2:
3:
To
internal
logic
PIC16FXX
See Table 8-1 for recommended values of
C1 and C2.
A series resistor (RS) may be required for
AT strip cut crystals.
RF varies with the crystal chosen.
The PIC16F8X oscillator design requires the use of a
parallel cut crystal. Use of a series cut crystal may give
a frequency out of the crystal manufacturers
specifications. When in XT, LP or HS modes, the device
can have an external clock source to drive the
OSC1/CLKIN pin (Figure 8-4).
EXTERNAL CLOCK INPUT
OPERATION (HS, XT OR LP
OSC CONFIGURATION)
OSC1
Clock from
ext. system
PIC16FXX
Open
Panasonic EFO-A455K04B
Murata Erie CSA2.00MG
Murata Erie CSA4.00MG
Murata Erie CSA8.00MT
Murata Erie CSA10.00MTZ
± 0.3%
± 0.5%
± 0.5%
± 0.5%
± 0.5%
None of the resonators had built-in capacitors.
TABLE 8-2
CAPACITOR SELECTION
FOR CRYSTAL OSCILLATOR
SLEEP
RS(2)
FIGURE 8-4:
455 kHz
2.0 MHz
4.0 MHz
8.0 MHz
10.0 MHz
OSC2
© 1998 Microchip Technology Inc.
Mode
Freq
OSC1/C1
OSC2/C2
LP
32 kHz
200 kHz
100 kHz
2 MHz
4 MHz
4 MHz
10 MHz
68 - 100 pF
15 - 33 pF
100 - 150 pF
15 - 33 pF
15 - 33 pF
15 - 33 pF
15 - 33 pF
68 - 100 pF
15 - 33 pF
100 - 150 pF
15 - 33 pF
15 - 33 pF
15 - 33 pF
15 - 33 pF
XT
HS
Note :
Higher capacitance increases the stability of
oscillator but also increases the start-up time.
These values are for design guidance only. Rs may
be required in HS mode as well as XT mode to
avoid overdriving crystals with low drive level specification. Since each crystal has its own characteristics, the user should consult the crystal
manufacturer for appropriate values of external
components.
For VDD > 4.5V, C1 = C2 ≈ 30 pF is recommended.
Crystals Tested:
32.768 kHz
100 kHz
200 kHz
1.0 MHz
2.0 MHz
4.0 MHz
10.0 MHz
Epson C-001R32.768K-A
Epson C-2 100.00 KC-P
STD XTL 200.000 KHz
ECS ECS-10-13-2
ECS ECS-20-S-2
ECS ECS-40-S-4
ECS ECS-100-S-4
± 20 PPM
± 20 PPM
± 20 PPM
± 50 PPM
± 50 PPM
± 50 PPM
± 50 PPM
DS30430C-page 39
PIC16F8X
8.2.3
EXTERNAL CRYSTAL OSCILLATOR
CIRCUIT
8.2.4
Either a prepackaged oscillator can be used or a simple
oscillator circuit with TTL gates can be built.
Prepackaged oscillators provide a wide operating
range and better stability. A well-designed crystal
oscillator will provide good performance with TTL
gates. Two types of crystal oscillator circuits are
available; one with series resonance, and one with
parallel resonance.
Figure 8-5 shows a parallel resonant oscillator circuit.
The circuit is designed to use the fundamental
frequency of the crystal. The 74AS04 inverter performs
the 180-degree phase shift that a parallel oscillator
requires. The 4.7 kΩ resistor provides negative
feedback for stability. The 10 kΩ potentiometer biases
the 74AS04 in the linear region. This could be used for
external oscillator designs.
FIGURE 8-5:
EXTERNAL PARALLEL
RESONANT CRYSTAL
OSCILLATOR CIRCUIT
+5V
To Other
Devices
PIC16FXX
10k
74AS04
4.7k
CLKIN
74AS04
10k
XTAL
10k
20 pF
RC OSCILLATOR
For timing insensitive applications the RC device option
offers additional cost savings. The RC oscillator
frequency is a function of the supply voltage, the
resistor (Rext) values, capacitor (Cext) values, and the
operating temperature. In addition to this, the oscillator
frequency will vary from unit to unit due to normal
process parameter variation. Furthermore, the
difference in lead frame capacitance between package
types also affects the oscillation frequency, especially
for low Cext values. The user needs to take into
account variation due to tolerance of the external
R and C components. Figure 8-7 shows how an R/C
combination is connected to the PIC16F8X. For Rext
values below 4 kΩ, the oscillator operation may
become unstable, or stop completely. For very high
Rext values (e.g., 1 MΩ), the oscillator becomes
sensitive to noise, humidity and leakage. Thus, we
recommend keeping Rext between 5 kΩ and 100 kΩ.
Although the oscillator will operate with no external
capacitor (Cext = 0 pF), we recommend using values
above 20 pF for noise and stability reasons. With little
or no external capacitance, the oscillation frequency
can vary dramatically due to changes in external
capacitances, such as PCB trace capacitance or
package lead frame capacitance.
See the electrical specification section for RC
frequency variation from part to part due to normal
process variation. The variation is larger for larger R
(since leakage current variation will affect RC
frequency more for large R) and for smaller C (since
variation of input capacitance has a greater affect on
RC frequency).
See the electrical specification section for variation of
oscillator frequency due to VDD for given Rext/Cext
values as well as frequency variation due to
operating temperature.
20 pF
Figure 8-6 shows a series resonant oscillator circuit.
This circuit is also designed to use the fundamental
frequency of the crystal. The inverter performs a
180-degree phase shift. The 330 kΩ resistors provide
the negative feedback to bias the inverters in their
linear region.
The oscillator frequency, divided by 4, is available on
the OSC2/CLKOUT pin, and can be used for test
purposes or to synchronize other logic (see Figure 3-2
for waveform).
FIGURE 8-7:
RC OSCILLATOR MODE
VDD
FIGURE 8-6:
EXTERNAL SERIES
RESONANT CRYSTAL
OSCILLATOR CIRCUIT
330 kΩ
330 kΩ
74AS04
74AS04
To Other
Devices
Rext
OSC1
Cext
PIC16FXX
74AS04
CLKIN
Internal
clock
PIC16FXX
VSS
Fosc/4
Recommended values:
0.1 μF
OSC2/CLKOUT
5 kΩ ≤ Rext ≤ 100 kΩ
Cext > 20pF
XTAL
Note:
DS30430C-page 40
When the device oscillator is in RC mode,
do not drive the OSC1 pin with an external
clock or you may damage the device.
© 1998 Microchip Technology Inc.
PIC16F8X
8.3
Reset
The PIC16F8X differentiates between various kinds
of reset:
•
•
•
•
•
Power-on Reset (POR)
MCLR reset during normal operation
MCLR reset during SLEEP
WDT Reset (during normal operation)
WDT Wake-up (during SLEEP)
Figure 8-8 shows a simplified block diagram of the
on-chip reset circuit. The MCLR reset path has a noise
filter to ignore small pulses. The electrical specifications state the pulse width requirements for the MCLR
pin.
FIGURE 8-8:
Some registers are not affected in any reset condition;
their status is unknown on a POR reset and unchanged
in any other reset. Most other registers are reset to a
“reset state” on POR, MCLR or WDT reset during
normal operation and on MCLR reset during SLEEP.
They are not affected by a WDT reset during SLEEP,
since this reset is viewed as the resumption of normal
operation.
Table 8-3 gives a description of reset conditions for the
program counter (PC) and the STATUS register.
Table 8-4 gives a full description of reset states for all
registers.
The TO and PD bits are set or cleared differently in different reset situations (Section 8.7). These bits are
used in software to determine the nature of the reset.
SIMPLIFIED BLOCK DIAGRAM OF ON-CHIP RESET CIRCUIT
External
Reset
MCLR
WDT
Module
SLEEP
WDT
Time_Out
Reset
VDD rise
detect
Power_on_Reset
S
10-bit Ripple counter
R
VDD
OST/PWRT
OST
Chip_Reset
Q
OSC1/
CLKIN
PWRT
On-chip
RC OSC(1)
10-bit Ripple counter
Enable PWRT
Note 1: This is a separate oscillator from the
RC oscillator of the CLKIN pin.
© 1998 Microchip Technology Inc.
See Table 8-5
Enable OST
DS30430C-page 41
PIC16F8X
TABLE 8-3
RESET CONDITION FOR PROGRAM COUNTER AND THE STATUS REGISTER
Program Counter
Condition
STATUS Register
Power-on Reset
000h
MCLR Reset during normal operation
000h
000u uuuu
MCLR Reset during SLEEP
000h
0001 0uuu
WDT Reset (during normal operation)
000h
0000 1uuu
WDT Wake-up
PC + 1
Interrupt wake-up from SLEEP
PC + 1
0001 1xxx
uuu0 0uuu
(1)
uuu1 0uuu
Legend: u = unchanged, x = unknown.
Note 1: When the wake-up is due to an interrupt and the GIE bit is set, the PC is loaded with the interrupt vector
(0004h).
TABLE 8-4
Register
W
RESET CONDITIONS FOR ALL REGISTERS
Address
Power-on Reset
MCLR Reset during:
– normal operation
– SLEEP
WDT Reset during normal operation
Wake-up from SLEEP:
– through interrupt
– through WDT Time-out
—
xxxx xxxx
uuuu uuuu
uuuu uuuu
INDF
00h
---- ----
---- ----
---- ----
TMR0
01h
xxxx xxxx
uuuu uuuu
uuuu uuuu
PCL
02h
0000h
0000h
quuu(3)
PC + 1(2)
uuuq quuu(3)
STATUS
03h
0001 1xxx
000q
FSR
04h
xxxx xxxx
uuuu uuuu
uuuu uuuu
PORTA
05h
---x xxxx
---u uuuu
---u uuuu
PORTB
06h
xxxx xxxx
uuuu uuuu
uuuu uuuu
EEDATA
08h
xxxx xxxx
uuuu uuuu
uuuu uuuu
EEADR
09h
xxxx xxxx
uuuu uuuu
uuuu uuuu
PCLATH
0Ah
---0 0000
---0 0000
---u uuuu
INTCON
0Bh
0000 000x
0000 000u
uuuu uuuu(1)
INDF
80h
---- ----
---- ----
OPTION_REG
81h
1111 1111
1111 1111
uuuu uuuu
PCL
82h
0000h
0000h
PC + 1
STATUS
83h
0001 1xxx
000q quuu(3)
uuuq quuu(3)
FSR
84h
xxxx xxxx
uuuu uuuu
uuuu uuuu
TRISA
85h
---1 1111
---1 1111
---u uuuu
TRISB
86h
1111 1111
1111 1111
uuuu uuuu
EECON1
88h
---0 x000
---0 q000
---0 uuuu
EECON2
89h
---- ----
---- ----
---- ----
PCLATH
8Ah
---0 0000
---0 0000
---u uuuu
INTCON
8Bh
0000 000x
0000 000u
uuuu uuuu(1)
---- ----
Legend: u = unchanged, x = unknown, - = unimplemented bit read as '0',
q = value depends on condition.
Note 1: One or more bits in INTCON will be affected (to cause wake-up).
2: When the wake-up is due to an interrupt and the GIE bit is set, the PC is loaded with the interrupt vector
(0004h).
3: Table 8-3 lists the reset value for each specific condition.
DS30430C-page 42
© 1998 Microchip Technology Inc.
PIC16F8X
8.4
Power-on Reset (POR)
A Power-on Reset pulse is generated on-chip when
VDD rise is detected (in the range of 1.2V - 1.7V). To
take advantage of the POR, just tie the MCLR pin
directly (or through a resistor) to VDD. This will eliminate
external RC components usually needed to create
Power-on Reset. A minimum rise time for VDD must be
met for this to operate properly. See Electrical Specifications for details.
When the device starts normal operation (exits the
reset condition), device operating parameters (voltage,
frequency, temperature, ...) must be meet to ensure
operation. If these conditions are not met, the device
must be held in reset until the operating conditions
are met.
For additional information, refer to Application Note
AN607, "Power-up Trouble Shooting."
The POR circuit does not produce an internal reset
when VDD declines.
8.5
Power-up Timer (PWRT)
The Power-up Timer (PWRT) provides a fixed 72 ms
nominal time-out (TPWRT) from POR (Figure 8-10,
Figure 8-11, Figure 8-12 and Figure 8-13). The
Power-up Timer operates on an internal RC oscillator.
The chip is kept in reset as long as the PWRT is active.
The PWRT delay allows the VDD to rise to an acceptable level (Possible exception shown in Figure 8-13).
FIGURE 8-9:
EXTERNAL POWER-ON
RESET CIRCUIT (FOR SLOW
VDD POWER-UP)
VDD
VDD
D
R
R1
MCLR
C
PIC16FXX
Note 1: External Power-on Reset circuit is required
only if VDD power-up rate is too slow. The
diode D helps discharge the capacitor
quickly when VDD powers down.
2: R < 40 kΩ is recommended to make sure
that voltage drop across R does not exceed
0.2V (max leakage current spec on MCLR
pin is 5 μA). A larger voltage drop will
degrade VIH level on the MCLR pin.
3: R1 = 100Ω to 1 kΩ will limit any current
flowing into MCLR from external
capacitor C in the event of an MCLR pin
breakdown due to ESD or EOS.
A configuration bit, PWRTE, can enable/disable the
PWRT. See either Figure 8-1 or Figure 8-2 for the operation of the PWRTE bit for a particular device.
The power-up time delay TPWRT will vary from chip to
chip due to VDD, temperature, and process variation.
See DC parameters for details.
8.6
Oscillator Start-up Timer (OST)
The Oscillator Start-up Timer (OST) provides a 1024
oscillator cycle delay (from OSC1 input) after the
PWRT delay ends (Figure 8-10, Figure 8-11,
Figure 8-12 and Figure 8-13). This ensures the crystal
oscillator or resonator has started and stabilized.
The OST time-out (TOST) is invoked only for XT, LP and
HS modes and only on Power-on Reset or wake-up
from SLEEP.
When VDD rises very slowly, it is possible that the
TPWRT time-out and TOST time-out will expire before
VDD has reached its final value. In this case
(Figure 8-13), an external power-on reset circuit may
be necessary (Figure 8-9).
© 1998 Microchip Technology Inc.
DS30430C-page 43
PIC16F8X
4.2.2.1
STATUS REGISTER
The STATUS register contains the arithmetic status of
the ALU, the RESET status and the bank select bit for
data memory.
As with any register, the STATUS register can be the
destination for any instruction. If the STATUS register is
the destination for an instruction that affects the Z, DC
or C bits, then the write to these three bits is disabled.
These bits are set or cleared according to device logic.
Furthermore, the TO and PD bits are not writable.
Therefore, the result of an instruction with the STATUS
register as destination may be different than intended.
For example, CLRF STATUS will clear the upper-three
bits and set the Z bit. This leaves the STATUS register
as 000u u1uu (where u = unchanged).
FIGURE 4-1:
R/W-0
IRP
bit7
bit 7:
Only the BCF, BSF, SWAPF and MOVWF instructions
should be used to alter the STATUS register (Table 9-2)
because these instructions do not affect any status bit.
Note 1: The IRP and RP1 bits (STATUS<7:6>) are
not used by the PIC16F8X and should be
programmed as cleared. Use of these bits
as general purpose R/W bits is NOT
recommended, since this may affect
upward compatibility with future products.
Note 2: The C and DC bits operate as a borrow
and digit borrow out bit, respectively, in
subtraction. See the SUBLW and SUBWF
instructions for examples.
Note 3: When the STATUS register is the
destination for an instruction that affects
the Z, DC or C bits, then the write to these
three bits is disabled. The specified bit(s)
will be updated according to device logic
STATUS REGISTER (ADDRESS 03h, 83h)
R/W-0
RP1
R/W-0
RP0
R-1
TO
R-1
PD
R/W-x
Z
R/W-x
DC
R/W-x
C
bit0
R = Readable bit
W = Writable bit
U = Unimplemented bit,
read as ‘0’
- n = Value at POR reset
IRP: Register Bank Select bit (used for indirect addressing)
0 = Bank 0, 1 (00h - FFh)
1 = Bank 2, 3 (100h - 1FFh)
The IRP bit is not used by the PIC16F8X. IRP should be maintained clear.
bit 6-5: RP1:RP0: Register Bank Select bits (used for direct addressing)
00 = Bank 0 (00h - 7Fh)
01 = Bank 1 (80h - FFh)
10 = Bank 2 (100h - 17Fh)
11 = Bank 3 (180h - 1FFh)
Each bank is 128 bytes. Only bit RP0 is used by the PIC16F8X. RP1 should be maintained clear.
bit 4:
TO: Time-out bit
1 = After power-up, CLRWDT instruction, or SLEEP instruction
0 = A WDT time-out occurred
bit 3:
PD: Power-down bit
1 = After power-up or by the CLRWDT instruction
0 = By execution of the SLEEP instruction
bit 2:
Z: Zero bit
1 = The result of an arithmetic or logic operation is zero
0 = The result of an arithmetic or logic operation is not zero
bit 1:
DC: Digit carry/borrow bit (for ADDWF and ADDLW instructions) (For borrow the polarity is reversed)
1 = A carry-out from the 4th low order bit of the result occurred
0 = No carry-out from the 4th low order bit of the result
bit 0:
C: Carry/borrow bit (for ADDWF and ADDLW instructions)
1 = A carry-out from the most significant bit of the result occurred
0 = No carry-out from the most significant bit of the result occurred
Note:For borrow the polarity is reversed. A subtraction is executed by adding the two’s complement of
the second operand. For rotate (RRF, RLF) instructions, this bit is loaded with either the high or low
order bit of the source register.
© 1998 Microchip Technology Inc.
DS30430C-page 15
PIC16F8X
4.2.2.2
OPTION_REG REGISTER
The OPTION_REG register is a readable and writable
register which contains various control bits to configure
the TMR0/WDT prescaler, the external INT interrupt,
TMR0, and the weak pull-ups on PORTB.
FIGURE 4-1:
R/W-1
RBPU
bit7
Note:
When the prescaler is assigned to
the WDT (PSA = '1'), TMR0 has a 1:1
prescaler assignment.
OPTION_REG REGISTER (ADDRESS 81h)
R/W-1
INTEDG
R/W-1
T0CS
R/W-1
T0SE
R/W-1
PSA
R/W-1
PS2
R/W-1
PS1
R/W-1
PS0
bit0
bit 7:
RBPU: PORTB Pull-up Enable bit
1 = PORTB pull-ups are disabled
0 = PORTB pull-ups are enabled (by individual port latch values)
bit 6:
INTEDG: Interrupt Edge Select bit
1 = Interrupt on rising edge of RB0/INT pin
0 = Interrupt on falling edge of RB0/INT pin
bit 5:
T0CS: TMR0 Clock Source Select bit
1 = Transition on RA4/T0CKI pin
0 = Internal instruction cycle clock (CLKOUT)
bit 4:
T0SE: TMR0 Source Edge Select bit
1 = Increment on high-to-low transition on RA4/T0CKI pin
0 = Increment on low-to-high transition on RA4/T0CKI pin
bit 3:
PSA: Prescaler Assignment bit
1 = Prescaler assigned to the WDT
0 = Prescaler assigned to TMR0
R = Readable bit
W = Writable bit
U = Unimplemented bit,
read as ‘0’
- n = Value at POR reset
bit 2-0: PS2:PS0: Prescaler Rate Select bits
Bit Value
TMR0 Rate
WDT Rate
000
001
010
011
100
101
110
111
1:2
1:4
1:8
1 : 16
1 : 32
1 : 64
1 : 128
1 : 256
1:1
1:2
1:4
1:8
1 : 16
1 : 32
1 : 64
1 : 128
DS30430C-page 16
© 1998 Microchip Technology Inc.
PIC16F8X
4.2.2.3
INTCON REGISTER
Note:
The INTCON register is a readable and writable
register which contains the various enable bits for all
interrupt sources.
FIGURE 4-1:
R/W-0
GIE
bit7
bit 7:
Interrupt flag bits get set when an interrupt
condition occurs regardless of the state of
its corresponding enable bit or the global
enable bit, GIE (INTCON<7>).
INTCON REGISTER (ADDRESS 0Bh, 8Bh)
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-x
EEIE
T0IE
INTE
RBIE
T0IF
INTF
RBIF
bit0
R = Readable bit
W = Writable bit
U = Unimplemented bit,
read as ‘0’
- n = Value at POR reset
GIE: Global Interrupt Enable bit
1 = Enables all un-masked interrupts
0 = Disables all interrupts
Note: For the operation of the interrupt structure, please refer to Section 8.5.
bit 6:
EEIE: EE Write Complete Interrupt Enable bit
1 = Enables the EE write complete interrupt
0 = Disables the EE write complete interrupt
bit 5:
T0IE: TMR0 Overflow Interrupt Enable bit
1 = Enables the TMR0 interrupt
0 = Disables the TMR0 interrupt
bit 4:
INTE: RB0/INT Interrupt Enable bit
1 = Enables the RB0/INT interrupt
0 = Disables the RB0/INT interrupt
bit 3:
RBIE: RB Port Change Interrupt Enable bit
1 = Enables the RB port change interrupt
0 = Disables the RB port change interrupt
bit 2:
T0IF: TMR0 overflow interrupt flag bit
1 = TMR0 has overflowed (must be cleared in software)
0 = TMR0 did not overflow
bit 1:
INTF: RB0/INT Interrupt Flag bit
1 = The RB0/INT interrupt occurred
0 = The RB0/INT interrupt did not occur
bit 0:
RBIF: RB Port Change Interrupt Flag bit
1 = When at least one of the RB7:RB4 pins changed state (must be cleared in software)
0 = None of the RB7:RB4 pins have changed state
© 1998 Microchip Technology Inc.
DS30430C-page 17
Téléchargement