Académique Documents
Professionnel Documents
Culture Documents
LE MICRICONTROLUR 16F877
INTRODUCTION :
Un microcontrôleur est un composant électronique ayant une unité de traitement de données, des mémoires,
des interfaces de communication (entrées/sorties, ports séries . . .) et de multiple ressources interne. Souvent
un microcontrôleur se contente d’un bus de données de 8-bits ou 16-bits, on peut dire alors qu’il est moins
puissant qu’un microprocesseur.
Présentation du microcontrôleur PIC 16F877
Définition d’un PIC : [1]
Un PIC (Programmable Interface Controller) est un microcontrôleur de Microchip Technology Inc. Un PIC
est un composant dit RISC (Reduced Instructions Set Computer), ou encore composant à jeu d’instruction
réduit. Ces microcontrôleurs sont conçus sur une architecture dite HAVARD, elle est basée sur deux bus, un
pour les données (bus de données) et l’autre pour les instructions (bus de programme).
Différentes familles des PICs : [2]
La famille des PICs est subdivisée en trois grandes familles :
- Base line : c’est la famille où l’unité centrale travaille sur 12bits, exemple : 12CXXX…
- Mid-Range : c’est la famille où l’unité centrale travaille sur 14bits, exemple : 16F877.
- High Performance : c’est la famille où l’unité centrale travaille sur 16bits, exemple : 18FXXX, 18CXXX
Identifier un PIC :[3]
La référence d’un microcontrôleur PIC est de la forme NN LLL XXX où :
NN désigne la famille à laquelle appartient le circuit.
LLL est un ensemble d’une, deux ou trois lettres qui indique le type de mémoire de programme contenue
dans le circuit et si la plage de tension d’alimentation est normale ou étendue.
XXX est un ensemble de deux ou trois chiffres constituant la référence du circuit.
Exemple du 16F877-20 :
16 : indique la famille Mid-Range.
F : indique le type de mémoire programme utilisée : F pour Flash.
877 : identité.
20 : indique la fréquence d’horloge.
Principales caractéristiques du PIC 16F877 : [4]
Un PIC 16F877 possède les caractéristiques suivantes :
Une fréquence de fonctionnement allant jusqu’à 20MHz.
Jeu d’instructions de 35 instructions.
Une mémoire de programme de type FLASH sur 8K mots (1 mot=14 bits).
Une mémoire de données de type RAM sur 368 octets.
Une mémoire de données de type EEPROM sur 256 octets.
Une pile (Stack) à 8 niveaux.
14 sources d’interruptions.
Un chien de garde WDT (Watch Dog Timer).
Timer0 (compteur 8-bits avec pré-diviseur).
Timer1 (compteur 16-bits avec pré-diviseur et possibilité d’utiliser une horloge externe).
Timer2 (compteur 8-bits avec pré-diviseur et post-diviseur).
Un convertisseur Analogique-Numérique 10-bits à 8 entrées multiplexées.
Deux modules de capture/comparaison/PWM.
Ports Entrées/Sorties : A, B, C, D et E.
Une interface de communication série (MSSP, USART).
Une interface de communication parallèle (PSP).
Tension de fonctionnement est entre 2.0V et 5.5V.
La RAM et l’EEPROM :
La RAM est sur 368 octets, elle sert à stocker les données temporaires (résultat de l’UAL…), elle
comprend tous les registres de fonction spéciale. Cette mémoire est partitionnée en 4 parties, chaque partie
est appelée BANK et comporte 7Fh adresses (i.e. 128 octets), chaque BANK peut être sélectionné à partir des
bits RP1 et RP0 du registre STATUS comme suit :
L’EEPROM est sur 256 octets prévue pour sauvegarder les données en cas de perte d’alimentation, le
nombre de cycle lecture/écriture est limité à l’ordre de 106 cycles.
Configuration de l’oscillateur (horloge) : [4]
Le PIC 16F877 peut fonctionner en 4 modes d’oscillateur :
LP : Low Power crystal : quartz à faible puissance.
XT : Crystal/Resonator : quartz/résonateur en céramique.
Toujours dans l’un de ces modes de fonctionnement, le microcontrôleur peut avoir une horloge externe
connectée à la broche OSC1/CLKIN comme le montre la figure suivante :
- Oscillateur RC :
La fréquence de l’oscillation dépend du voltage, des valeurs de R et C et de la température de
fonctionnement. La figure suivante montre comment connecter un circuit RC au microcontrôleur :
x : inconnu, u : inchangé, - : emplacements non implémentés (‘0’), les cellules ombragées ne sont pas utilisées
par le PORTA.
Au démarrage (Power-On Reset ‘POR’), les pins de ce port sont configurés comme des entrées
analogiques et lus comme ‘0’.
- PORT B :
Le PORTB est un port bidirectionnel de 8-bits (8 entrées/sorties) : de RB0 jusqu'à RB7; le registre
correspondant qui définit la direction des données est le TRISB, la mise à ‘1’ d’un bit du TRISB configura la
broche correspondante à ce bit comme entrée, et la mise à ‘0’ de ce bit mettra la broche correspondante
comme sortie.
En mode entrée, chaque broche du PORTB doit être maintenue à un niveau haut à l’aide des résistances
de pull-up, ceci en mettant à ‘0’ le bit 㨣㨓㨡㨦 (du registre OPTION). En mode sortie ou lors d’un POR (Power-On
Reset), ces pull-ups sont désactivés. Un changement d’état sur l’une des broches RB4, RB5, RB6 et RB7
déclenche une interruption, ceci n’est possible que pour celles qui sont configurées comme entrées.
Résumé des registres associés avec le PORTB
x : inconnu, u : inchangé, les cellules ombragées ne sont pas utilisées par le PORTB.
- PORT C :
Le PORTC est un port bidirectionnel de 8-bits (8 entrées/sorties) : de RC0 jusqu'à RC7; le registre
correspondant qui définit la direction des données est le TRISC, la mise à ‘1’ d’un bit du TRISC configura la
broche correspondante à ce bit comme entrée, et la mise à ‘0’ de ce bit mettra la broche correspondante
comme sortie.
Résumé des registres associés avec le PORTC
x : inconnu, u : inchangé.
- PORT D :
Le PORTD est un port bidirectionnel de 8-bits (8 entrées/sorties) : de RD0 jusqu'à RD7; le registre
correspondant qui définit la direction des données est le TRISD, la mise à ‘1’ d’un bit du TRISD configura la
broche correspondante à ce bit comme entrée, et la mise à ‘0’ de ce bit mettra la broche correspondante
comme sortie.
Le PORTD peut être configuré comme port parallèle esclave : PSP (Parallel Slave Port) en mettant à ‘1’ le
bit PSPMODE du registre TRISE.
x : inconnu, u : inchangé, - : emplacements non implémentés (‘0’), les cellules ombragées ne sont pas utilisées
par le PORTD.
- PORT E :
Le PORTE a 3 broches : RE0, RE1 et RE2, configurables en entrées ou en sorties à partir des trois
premiers bits du registre TRISE. Ces broches sont multiplexées avec les entrées du CAN (Convertisseur
Analogique Numérique).
Au démarrage (Power-On Reset ‘POR’), les pins de ce port sont configurés comme des entrées analogiques et
lus comme ‘0’.
Résumé des registres associés avec le PORTE
x : inconnu, u : inchangé, - : emplacements non implémentés (‘0’), les cellules ombragées ne sont pas utilisées
par le PORTE.
Port Parallèle Esclave (PSP: Parallel Slave Port) : [4]
C’est le PORTD qui fonctionne en PSP (sur 8-bits) quand le bit de contrôle PSPMODE (du registre TRISE)
est à ‘1’. La mise à 1 du bit PSPMODE activera aussi les pins 㨣㨕₩(Read),₩㨨㨣 (Write) et 㨔㨤 (Chip Select)
(physiquement sont celles du PORTE). Pour cette fonctionnalité, les broches du
PORTE doivent être configurées en entrées (mise à ‘1’ des bits 0, 1 et 2 dans TRISE) et aussi il faut mettre les 4
premiers bits du registre ADCON1 à ‘1’ pour que le PORTE soit en E/S numériques (pas de conversion A/N sur
ce port).
Le PSP peut interfacer directement avec un microprocesseur 8-bits (bus de données sur 8-bits) à l’aide
des broches :
㨔㨤 : pour valider le PIC.
㨣㨕₩: pour indiquer au PIC qu’il doit lire.
㨨㨣 : pour indiquer au PIC qu’il doit écrire.
L’écriture dans le PSP ce fait lorsque 㨔㨤 et 㨨㨣 sont à ‘0’, et quand l’une de ces broches se met à ‘1’ le
bit flag IBF (Input Buffer Full) (du registre TRISE) se met à ‘1’ pour signaler la fin de l’écriture.
La lecture du PSP ce fait lorsque 㨔㨤₩et 㨣㨕 sont à ‘0’. Dès la mise à ‘0’ de ces derniers, le bit flag OBF
(Output Buffer Full) (du registre TRISE) se met immédiatement à ‘0’ pour indiquer que le PORTD est en attente
pour être lue par le bus externe. Quand 㨔㨤 ou 㨣㨕 se met à ‘1’, c’est la fin de la lecture et qui sera signalée par
le bit PSPIF (PSP Interrupt Flag) (du registre PIR1) en se mettant à ‘1’.
Quand le mode PSP est désactivé, les bits IBF et OBF doivent être à ‘0’. Cependant, même si le bit IBOV était à
‘1’, il doit être effacé par logiciel.
Timers :[4]
- Timer0 :
Le Timer0 est un 8-bits temporisateur /compteur. En mode temporisateur, sélectionné en mettant à ‘0’ le bit
T0SC (OPTION_REG), l’incrémentation du Timer0 se produit chaque cycle d’instruction sans le pré-diviseur,
l’écriture dans le registre TMR0 fait que l’incrémentation sera arrêtée durant les deux cycles d’instruction
suivants.
Le mode compteur est sélectionné en mettant à ‘1’ le bit T0SC (OPTION_REG), dans ce cas le Timer0 sera
incrémenté soit sur front montant soit sur front descendant de l’horloge externe sur la patte RA4/T0CKI. Le
front d’incrémentation est sélectionné à partir du bit T0SE (OPTION_REG).
Le Timer0 peut engendrer une interruption lors d’un débordement de FFh à 00h, ce débordement mit à ‘1’ le
bit T0IF (INTCON) pour signaler l’interruption, après la fin de l’interruption ce bit doit être effacé par logiciel. Il
suffit de mettre à ‘0’ le bit T0IE (INTCON) pour désactiver l’interruption du Timer0. Pour ce module Timer0 un
pré-diviseur (Prescaler) est disponible et il est partagé avec le Timer Chien de garde WDT (Watchdog Timer),
l’assignation du pré-diviseur au Timer0 fait que le WDT n’a pas de pré-diviseur associé, et vice-versa.
L’assignation et la sélection de taux de division de fréquence se fait à l’aide des bits PSA (pour l’assignation) et
PS2 :PS0 (pour le taux) (registre OPTION_REG). Quand le pré-diviseur est assigné au Timer0, l’écriture dans le
registre TMR0 efface le pré-diviseur mais ne change pas son assignation, et aussi, cette écriture fait que
l’incrémentation ne reprenne qu’après un délai de trois cycles d’instructions.
- Timer2 :
Le Timer2 est un temporisateur 8-bits avec un pré-diviseur, un post-diviseur et un registre sur 8-bits PR2
dit registre de période. Le registre TMR2 est incrémenté, à l’aide de l’horloge interne (FOSC/4), de 00h jusqu’à
une valeur spécifiée dans le registre PR2, puis il recommence de 00h. Lorsqu’il y a une égalité entre le contenu
du registre TMR2 et celui du PR2, un signal sera appliqué au post-diviseur (4-bits) pour générer une
interruption.
Le Timer2 est arrêté sur la mise à ‘0’ du bit TMR2ON (du registre T2CON).
Registre T2CON :(adresse : 12h)