Introduction

La famille PIC16FXXX, se compose de plusieurs gammes de produits.  Nous nous proposons de présenter uniquement le microcontrôleur PIC16F877A, ce choix s’explique d’une part par son nombre d’entrées/sorties (E/S), mais aussi parce que les exemples proposés seront basés sur ce composant.

Le PIC16F877A est un microcontrôleur 8 bits en technologie CMOS, cadencé par une horloge allant de 0 à 20 MHz ; et son alimentation varie entre 2 V et 5,5 V.

Il est vendu soit  sous forme de boîtier DIP (Dual In Package) 40 broches ou QFP (Quad Flat Package) 44 broches ou encore en boitier plastique carré PLCC (Plastic Leaded Chip Carrier) 44 broches.

La figure ci-après donne une vue du PIC16F877A en boitier DIP

microcpic16f877dip

 

Sur un certain nombre de broches plusieurs fonctions cohabitent :   les ports d’E/S classiques, les périphériques spéciaux (communications, conversion de signaux, …) et les fonctions système.

Autour de l’unité centrale (CPU), on trouve les ressources suivantes :

  • la mémoire programme Flash capable de stocker 8192 instructions;
  • la mémoire de données RAM ayant une capacité de 368 octets;
  • la mémoire EEPROM (Programmable et effaçable électriquement) de 256 octets;
  • 5 ports d’E/S, dont 3 de 8 broches, 1 de 6 broches, et 1 de 3 broches. Soit 33 E/S en tout;

Et d’autres périphériques :

  • 2 Timers 8 bits ;
  • 1 Timers 16 bits;
  • 2 Comparateurs analogiques;
  • 1 Interface de communication série asynchrone (USART) ;
  • 2 modules de capture/comparaison/PWM ;
  • 8 canaux de conversions analogiques numériques de 10 bits de résolution ;
  • 1 module de référence de tension interne ;
  • 1 Interface série synchrone (SPI) ;
  • 1 Interface série synchrone (I2C) ;
  • 1 Interface parallèle en mode esclave.

Comparé aux microcontrôleurs bâtis sur une architecture du type Von-Neumann, dans laquelle le bus de données et le bus d’adresses sont multiplexés, ce composant quant à lui est basé sur une architecture de type Harvard, qui opte pour une séparation entre les bus d’adresses et de données. Cela permet  à l’unité centrale de fonctionner avec un jeu d’instructions réduit : 35 Instructions.

Le PIC16F877A appartient à la famille des microcontrôleurs RISC (Reduced Instruction Set Computer).

 

Architecture

 

architecturepic16f877a

 

D’après ce schéma architectural extrait de la documentation du constructeur, on peut diviser  le PIC16F877A en trois sous-ensembles principaux :

                 Le noyau, les périphériques, les fonctions spéciales.

Le noyau :

Ce terme peut être définit comme étant l’ensemble des éléments de base requis pour faire fonctionner le composant.  

Parmi ces éléments on a :

Le circuit d’oscillateur ;  le circuit de remise à zéro (Reset) ; L’unité centrale (CPU) ; l’unité arithmétique et logique (ALU) ; la mémoire interne ; et les interruptions.

On présentera aussi  le jeu d’instruction du PIC16F877A, puisqu’il fait aussi partie des éléments nécessaires au fonctionnement du microcontrôleur.

 

Le circuit d’oscillateur :

Pour exécuter les instructions et  piloter les différents périphériques, le microcontrôleur a besoin d’un signal d’horloge. Pour un PIC16F877A, l’utilisateur a la possibilité de choisir quatre modes de configuration d’horloge :

  • LP: Low-Power Crystal;
  • XT: Crystal/Resonator;
  • HS: High Speed Crystal/Resonator;
  • RC: Resistor capacitor.

La valeur des bits Fosc1 et Fosc0 du mot de configuration, permet de choisir l’un des modes. 

La figure ci-après présente l’architecture de mot de configuration pour le cas du PIC16F877A:

motconfigpic16f877a

 

Du point de vue matériel, le signal d’horloge, dans le mode LP, XT ou HS, sera obtenu à l’aide d’un résonateur à quartz ou au cristal  connecté entre les broches OSC1/CLK1 et OSC2/CLK0 du composant ;  la figure ci-après propose un exemple de branchement :

oscxtalpic16f877a 
  1.  Les valeurs préconisées des condensateurs C1 et C2 se trouvent dans la documentation technique ;
  2.  Le constructeur propose aussi la valeur de la résistance Rs selon le type de résonateur ;
  3.  La résistance interne RF aura, selon le constructeur, une valeur différente selon le type de résonateur choisi.

 

Pour une configuration en mode RC,  la fréquence d’horloge  dépend de la tension d’alimentation, des valeurs de REXT et de CEXT, sans perdre de vue la tolérance de ces deux composants (Résistance et condensateur), mais aussi leur sensibilité aux variations de températures.

Exemple de branchement d’une horloge RC:

 

oscrcpic16f877a

 

Valeurs recommandées :  3 KΩ ≤ REXT ≤ 100 KΩ ;  et  CEXT > 20 pF.

 

Le circuit de remise à zéro (Reset) :

Le Reset du microcontrôleur a pour but de placer le composant dans un état connu.

Différentes causes peuvent provoquer un Reset :

  • A la mise sous tension (POR : Power On Reset) ;
  • Par appui d’un bouton « Reset » par l’opérateur (/MCLR) ;
  • Pendant le mode « sommeil » du composant (/MCLR) ;
  • Par le chien de garde électronique, qui surveille le bon déroulement du programme (WDT) ;
  • Lors de la phase « d’éveil » du composant (WTD) ;
  • Par détection d’une défaillance de l’alimentation (BOR).

Certains registres du microcontrôleur ne sont pas affectés par le Reset, même lors de la phase de mise sous tension. Ils sont donc dans un état indéterminé. Ceci  est très important à noter, car il faut en tenir compte lors de la phase d’initialisation, dans un programme.

Mais la majorité des registres n’est pas non plus affectée par la phase  « d’éveil » déclenchée par le chien de garde (WDT) ; ceci est considéré comme normal,  car lors de cette phase le composant doit poursuivre les opérations arrêtées avant  la mise en sommeil.

Des informations, plus détaillées sur les registres concernés, sont données dans la documentation technique du composant.

 

Exemple de circuit de mise à zéro:

 

resetpic16f877a

 

D’après ce circuit, le reset peut être déclenché, soit par appui du bouton poussoir, soit à la mise sous-tension. La diode D permet de décharger rapidement le condensateur lorsque le montage est mis hors tension.

Il est recommandé d’utiliser une résistance R < 40 K, pour être sûr que la différence de potentiel à ses bornes soit inférieure à 0,2 V. Car une valeur plus élevée pourrait dégrader tout niveau logique haut sur la broche /MCLR.

 

L’unité centrale(CPU) et  l’unité arithmétique et logique (ALU) :

La CPU  considérée comme le cerveau du composant, a pour rôle de récupérer les bonnes instructions à exécuter, de décoder ces instructions puis de les exécuter.

Bien souvent la CPU fonctionne en conjonction avec l’ALU afin de compléter l’exécution des instructions (lors des opérations arithmétiques ou logiques).

La CPU contrôle les bus d’adresses de la mémoire programme, de la mémoire  données, et  aussi l’accès à la pile.

Chaque instruction occupe quatre cycles d’horloge pour être exécutée.  C’est ce qu’on entend par cycle d’exécution d’une instruction ou simplement  cycle d’instruction.

Soit  Tcy la durée d’un cycle d’instruction,  et  les quatre cycles d’horloge (Q1, Q2, Q3, Q4), sachant qu’un cycle d’horloge est égal à une période d’horloge, Tcy est répartie comme suit :

 

Q1 : correspond au décodage de l’instruction ou au forçage du « no-operation » ;

Q2 : correspond à la lecture de la données ou au forçage du « no-operation » ;

Q3 : correspond au traitement des données ;

Q4 : correspond au cycle d’écriture ou du « no-operation ».

 

Dans la présentation de la documentation technique sur chaque instruction, y figure aussi son cycle d’exécution.

La figure ci-dessous donne sous forme de chronogramme un exemple de cycle d’exécution d’instructions:

tcyclepic16f877a

 

La CPU fonctionne en mode Pipeline (fois deux) ; ce qui lui permet d’exécuter potentiellement une instruction par cycle ; cette cadence n’est plus respectée lors du saut à un sous-programme. La Pipeline devra ainsi être vidée (flush), avant d’exécuter le sous-programme.

Un exemple illustrant ce fonctionnement est présenté par la figure suivante, dans laquelle les instructions proposées sont écrites en langage machine :

 

pipelinepic16f877a

D'après doc technique.

 

L’ALU :

Les microcontrôleurs de la famille PIC16FXXX, possèdent une ALU de 8 bits et un registre de travail (W) de 8 bits.

L’ALU est une unité arithmétique et logique à usage général.  Elle est capable d’effectuer des opérations  arithmétiques tels que : l’addition, la soustraction, les décalages ; mais aussi des opérations logiques, telles que des fonctions booléennes  entre le registre de travail (W) et tout autre registre du microcontrôleur.

En fonction  du résultat de l’instruction exécutée, les valeurs des bits de retenue ( C ), de la retenue décimale (DC),  et du bit de zéro (Z) du registre d’état (STATUS Register) peuvent être modifiés par l’ALU. Pour plus d’informations à ce sujet, il faut se reporter à la documentation technique du composant.

Le schéma ci-après représente un exemple d’interaction  entre  l’ALU,  le registre W  et les autres registres du microcontrôleur:

 

alupic16f877a

D'après doc technique

 

 

La mémoire interne :

Pour cette famille de composants, la mémoire interne est organisée en deux blocks distincts :

                   La mémoire programme et la mémoire données.

Chacun de ces blocs mémoire contient son propre bus ;  et  pour cette raison l’accès à chaque block peut avoir lieu durant le même cycle d’horloge.

 

Mémoire programme :

Le PIC16F877A  dispose d’un compteur programme à 13 bits capable d’adresser  8 K  x 14 bits d’espace mémoire. La largeur de bus de la mémoire programme étant de 14 bits, on peut dire que cet espace mémoire peut accueillir 8192 instructions. Une telle répartition permet de savoir si le composant dispose de la mémoire suffisante pour l’application désirée.

Les 13 bits du compteur programme sont scindés en deux partie : une partie basse de 8 bits contenue dans le registre PCL,  et une partie haute de 5 bits accessible indirectement par le registre PCLATH (Program Counter Latch High).

Un schéma du PC est proposé par la figure ci-après ; cet exemple représente une instruction ayant PCL pour destination :

compteurprogpic16f877a

 

L’espace mémoire programme est divisé en en quatre pages  de deux kilo mots chacune ; en hexadécimal cela donne les plages d’adresses suivantes :

  • Page 0 :  0000h – 07FFh ; 
  • Page 1 :  0800h – 0FFFh ;
  • Page 2 :  1000h – 17FFh ;
  • Page 3 :  1800h – 1FFFh.

Pour passer d’une page à une autre, les bits de poids fort compteur programme  (PC), devront être modifiés. Cette opération est réalisée en écrivant la valeur désirée dans le registre  PCLATH.

Dans la figure ci-après présente l'organisation de la mémoire programme:

 

mempgmpic16f877a

 

D’après la figure, les cinq premières adresses mémoire sont réservées au vecteur de Reset, et au vecteur d’interruption.

 

Vecteur de Reset (Reset Vector) :

Lors du Reset, le compteur programme (PC) prend la valeur 0h. Cette valeur est appelée vecteur de Reset.  Dans le même temps, le contenu du registre PCLATH est effacé ; ce qui signifie que tout branchement au vecteur  Reset d’adresse 0h, se traduira par un saut à la page 0 de la mémoire programme.

 

Vecteur d’interruption (Interrupt Vector) :

Lorsqu’une interruption est confirmée, le contenu du compteur programme (PC) est forcé à la valeur 0004h ; cette valeur est appelée  vecteur d’interruption ;  le registre PCLATH n’est pas modifié.

Une fois dans la routine d’interruption, c'est-à-dire avant toute écriture dans le PC, le registre PCLATH devra être chargé par l’adresse à laquelle on souhaite se rendre dans la mémoire programme.  Le contenu de PCLATH devra être sauvé avant toute modification par la routine d’interruption. Pour ainsi assurer une bonne récupération avant de sortir de la routine d’interruption.

En outre toujours selon la figure précédente, on a la pile.  Elle pour rôle de faire des appels aux sous-programmes, et de gérer la présence d’interruption.  La famille PIC16FXXX possède une pile à 8 niveaux.

 

Mémoire de données :

La mémoire données est répartie entre les registres à fonctions spéciales et les registres à usages général.

Les registres à fonctions spéciales contrôlent les fonctions du composant.  Ils assurent  la configuration et la surveillance de l'état du processeur et des périphériques. Certains sont accessibles en lecture ou en écriture selon la fonction qu’ils assurent.

Les registres à usage général, peuvent être utilisés par le programme pour le stockage temporaire de données, ou de variables. Ils sont accessibles en lecture et en écriture.  

L’adressage de ces registres ne peut se faire que sur 7 bit soit 128 registres. L’espace mémoire est alors décomposé en quatre bancs de 128 registres. La figure ci-après en donne la cartographie, avec en gris les zones non utilisées:

 

memdonnepic16f877a

 

On ne présentera pas ces différents registres dans cet article.

 

Les interruptions :

Les microcontrôleurs de la famille PIC16FXXX, disposent de quinze sources d’interruptions :

  • Externe : à partir de la broche RB0 ;
  • Débordement duTimer0 ;
  • Débordement du Timer1 ;
  • Débordement du Timer2 ;
  • Changement d'état des broches RB[7..4] ;
  • Changement d'état du comparateur ;
  • Port parallèle ;
  • USART (en émission et réception) ;
  • Fin de conversion analogique numérique ;
  • Module de comparaison capture ;
  • Liaison série synchrone ;
  • Fin d’écriture dans l’EEPROM

Toutes ces interruptions sont masquables individuellement,  ou en groupe, ou encore en totalité.

Le registre INTCON (Interrupt Control), enregistre les demandes d’interruption individuelles dans des drapeaux (flag bits). Ce registre possède des bits de validation individuelle ou globale des interruptions. D’autres registres comme PIR1 ,  PIR2 et PIE assurent aussi la gestion des drapeaux d’interruption.

Chaque source d’interruption est contrôlée par un « ENABLE » et génère ainsi un drapeau (flag).

 

Jeu d’instructions :

 

jeuinstructpic16f877a 

Signification des abréviations:

  • f : Registre (file Register);
  • d : Destination de l’instruction (Celle-ci sera soit W, dans ce cas d = 0, soit f, dans ce cas d = 1) ;
  • k  : Valeur immédiate (Literal value) ;
  • b  : postion du bit dans l’octet.

 

Dans le tableau précédent on retrouve listées, les 35 instructions du processeur PIC. Ce jeu est commun à la plupart des microcontrôleurs PIC.

 

Les périphériques :

Ce sont des circuits électroniques internes qui permettent de différentier chaque processeur de la famille PIC16FXXX.  Leur rôle est d’assurer l’interfaçage du microcontrôleur avec l’environnement extérieur (par exemple : des E/S à usage général, les pilotes d’afficheurs à cristaux liquides LCD, les entrées de conversion analogique numérique, les sorties d’impulsions modulées en largeur PWM),  et des tâches internes telles que la gestion des bases de temps (c’est le cas des Timers).

Citons ici les différents types de périphériques pour le cas du PIC16F877A, quelques uns seront présentés par la suite :

 

Les E/S d’usage général ; un Timer0 ; un Timer1 ; un Timer2 ; un module ce capture/comparaison et PWM ; un port série synchrone ; un port série synchrone de base ; un port série universel asynchrone USART ; des comparateurs analogiques ; des entrées de conversions analogiques numériques 10 bits ; un port parallèle en mode esclave ; une EEPROM de stockage de données ; une référence de tension.

 

Ports d’E/S :

La figure suivante illustre la structure d’une broche d’un port considérée comme une E/S, sans prendre en compte les fonctions additionnelles qui pourraient être multiplexées à celle-ci :

 

portpic16f877a 

 

D’après la figure, la lecture du registre associé au port permet de lire l’état des broches associées.  Tandis que l’opération d’écriture se fera uniquement sur chacune des bascules associées au port.

Le PIC16F877a dispose de 5 ports d’E/S  bidirectionnels :

  • Le port A : 6 broches d’E/S, multiplexées avec d’autres fonctions ;
  • Le port B : 8 broches d’E/S, dont  4 sont multiplexées avec d’autres fonctions ;
  • Le port C : 8 broches d’E/S, multiplexées avec d’autres fonctions ;
  • Le port D : 8 broches d’E/S, multiplexées avec d’autres fonctions ;
  • Le port E : 3 broches d’E/S, multiplexées avec d’autres fonctions.

Le détail de toutes les fonctions additionnelles des ports d’E/S, est donné dans la documentation technique du composant.

 

Timer 0 (TMR0):

Le Timer0 est un module de comptage sur 8 bits. La source de ce comptage est assurée par une horloge interne ou externe, par l’intermédiaire d’un pré diviseur.   Le Timer0 est accessible en lecture et en écriture. 

Une retenue est immédiatement générée lors du dépassement de capacité du Timer.  Celle-ci alimente le drapeau d’interruption.

 

timer0pic16f877a 

 

 

EEPROM :

C’est un périphérique assurant un rôle de mémoire non-volatile pour le microcontrôleur. Une EEPROM peut servir à stocker, des numéros de série, un code…etc. 

Elle n’est accessible que par adressage indirect, via un registre dédié. 

 

Son fonctionnement est assez particulier :

En lecture, elle se comporte comme une mémoire d’usage générale (ou une RAM).

En écriture, il faut un certain temps avant que l’opération soit réalisée (mise en route du niveau de tension requis pour programmer ou effacer la cellule mémoire). Tout en respectant un protocole imposé. 

Tous les détails sur les registres impliqués, et le protocole de programmation, sont disponibles dans la documentation technique du microcontrôleur.

 

Les fonctions spéciales :

Leur implémentation a pour but principal de réduire les coûts de fabrication ; améliorer la fiabilité et la flexibilité du design.

Les différentes fonctions spéciales qu’on trouve dans cette famille sont :

  • La configuration des broches pour une utilisation système ou pour l’utilisateur;
  • Le système de remise à zéro à la mise sous tension (Power On Reset : POR) ;
  • Le chien de garde électronique (Watch dog Timer), pour surveiller le bon déroulement du programme ;
  • La gestion de fonctionnement en basse tension (Low Power Mode) ;
  • Le système d’horloge interne ;
  • Le système de détection de défaillance de l’alimentation (Brown-out Reset BOR) ; 
  • La programmation du composant « In Circuit » ;
  • La protection du code.

Le mot de configuration est stocké dans un registre spécial situé à l’adresse 2007h.  Ce registre, qui sert aussi à configurer les modes de fonctionnement de l’horloge, a déjà été présenté dans le paragraphe sur l’horloge de ce microcontrôleur.

 

Conclusion

La description du PIC16F877A, est très longue et ne peut suffire que par ces quelques lignes, tellement il y a des choses à dire sur ce composant.  Pour l’utiliser et profiter au maximum de ses possibilités, il ne faut pas hésiter à se reporter à sa documentation technique, comme cela a d’ailleurs été mentionné maintes fois dans les lignes précédentes. Tout dépend de votre projet. Nous essayerons de donner plus de détails sur quelques une de ces fonctions (registre, ports…) , du moins celles dont nous en aurons l’usage dans les exemples de prise en main.