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