Vous êtes sur la page 1sur 14

Informatique Industrielle Microcontrôleur 16F877

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.

diaomar35@gmail.com page 1/14


Informatique Industrielle Microcontrôleur 16F877

Brochage du PIC 16F877 :

Le boitier ci-contre décrit


l’architecture externe du 16F877qui
comprend 40 pins dont :
33 pins d’entrées/sorties multiplexées
avec d’autres fonctions.
4 pins pour l’alimentation :
VDD et VSS.
2 pins pour l’oscillateur :
OSC0 et OSC1.
1 pin pour le RESET : MCLR.

Architecture interne : [4]


Une fois le programme est stocké dans la mémoire (Program Memory) et le μC est initialisé,l’instruction à
exécuter est désignée par le PC (Program Counter) et sera chargée dans le registre d’instruction (Instruction
reg) au moyen d’un bus de programme sur 14-bits, puis elle sera décodée dans le décodeur et le contrôleur
d’instruction (Instruction Decode & Control) et ensuite dirigée vers l’UAL (ALU) avec les données chargées à
partir des pins configurées comme entrées, l’UAL fera l’opération nécessaire et sauvegardera le résultat
temporairement dans le registre de travail (W reg) sur 8-bits, ce résultat sera aussi mit dans la RAM à l’aide
d’un bus de données sur 8-bits.

diaomar35@gmail.com page 2/14


Informatique Industrielle Microcontrôleur 16F877

Registres de Fonction Spéciale (SFR : Special Function Registers) : [4]


Les SFR sont des registres utilisés par l’unité centrale et les modules périphériques, ils sont implémentés
comme une RAM statique. Ils jouent le rôle d’un tableau de bord pour configurer les différentes ressources
internes du PIC, parmi ces registres il y a :
Registre STATUS :( adresses: 03h, 83h, 103h, 183h)
Contient les différents bits flags liés aux opérations arithmétiques, les indicateurs de RESET et le bit de
sélection de la BANK mémoire.
Registre OPTION_REG :(adresses : 81h, 181h)
Ce registre peut être lu et écrit, il contient les bits de contrôle qui permettent de configurer le
prédiviseur, les interruptions externes, le TMR0 et le pull-up sur le PORTB.
Registre INTCON :(adresses : 0Bh, 8Bh, 10Bh, 18Bh). C’est le registre de contrôle des interruptions.

diaomar35@gmail.com page 3/14


Informatique Industrielle Microcontrôleur 16F877

Différents types de mémoire :


Le 16F877 possède 3 types de mémoire :
Une mémoire FLASH pour stocker le programme.
Une RAM pour les données.
Une EEPROM pour les données.
La mémoire FLASH :
Est une mémoire qui peut être écrite et effacée électriquement. Elle est conçue pour stocker le
programme et elle est sur 8k mots (1 mot=14-bits).

Organisation mémoire programmable

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 :

PIC16F877/876 REGISTER FILE MAP

diaomar35@gmail.com page 4/14


Informatique Industrielle Microcontrôleur 16F877

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.

diaomar35@gmail.com page 5/14


Informatique Industrielle Microcontrôleur 16F877

HS : High Speed crystal/resonator : quartz à haute fréquence/résonateur en céramique HF.


RC : circuit RC.
Chacun de ces modes peut être sélectionné à travers les bits de configuration FOSC1 et FOSC0 (registre :
CONFIGURATION WORD à 2007h), comme suit :

- Oscillateur en Quartz ou à Résonateur Céramique :


En mode LP, XT ou HS, un quartz ou un résonateur en céramique est connecté aux pins OSC1/CLKIN et
OSC2/CLKOUT pour établir l’oscillation. La figure suivante montre comment ce quartz ou ce résonateur en
céramique est connecté au microcontrôleur :

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 :

Ports d’Entrées/Sorties : [4]


Le PIC 16F877 dispose de 5 ports entrées/sorties (au total 33 pins) : port A, B, C, D et E. De plus il y a le
PSP (Parallel Slave Port) : le Port Parallèle Esclave.
- PORT A :
Le PORTA est un port bidirectionnel de 6-bits (6 entrées/sorties) : de RA0 jusqu'à RA5; le registre
correspondant qui définit la direction des données est le TRISA, la mise à ‘1’ d’un bit du
TRISA configura la broche correspondante à ce bit comme entrée, et la mise à ‘0’ de ce bit mettra la broche
correspondante comme sortie.
La broche RA4 est multiplexée avec une autre fonction qui est l’entrée pour l’horloge du TIMER0, cette
broche deviendra donc RA4/T0CKI. Les autres pins sont multiplexées avec les entrées analogiques du CAN et
l’entrée VREF, pour cela, le registre ADCON1 permet de déterminer la fonction de chaque pin.

diaomar35@gmail.com page 6/14


Informatique Industrielle Microcontrôleur 16F877

Résumé des registres associés avec le PORTA

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.

diaomar35@gmail.com page 7/14


Informatique Industrielle Microcontrôleur 16F877

Résumé des registres associés avec le PORTD

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.

diaomar35@gmail.com page 8/14


Informatique Industrielle Microcontrôleur 16F877

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.

Schéma interne du Timer0


- Timer1 :
Le Timer1 est un temporisateur/compteur 16-bits, il possède 2 registres : TMR1H et TMR1L chacun est
sur 8-bits qui s’incrémentent de 0000h à FFFFh. Le Timer1 déclenche une interruption sur un passage de FFFFh
à 0000h (débordement du Timer1), cette interruption est signalée par la mise à ‘1’ du bit TMR1IF (registre
PIR1). Cette interruption peut être activée/désactivée en mettant à’1’/’0’ le bit TMR1IE (registre PIE1). Ce
module peut être activé/désactivé à l’aide du bit TMR1ON (registre T1CON) ,1/0.
Le Timer1 fonctionne en deux modes :
a. Mode temporisateur :
Dans ce cas le Timer1 est incrémenté chaque cycle d’instruction. Ce mode est sélectionné en mettant à
‘0’ le bit TMR1CS (registre T1CON), cependant l’horloge du timer est FOSC/4 et le bit de contrôle de
synchronisation avec l’horloge interne 㨥‫ڵ‬㨤㨪㨟㨔 (registre T1CON) n’a pas d’effet puisque l’horloge utilisée est
l’interne.
b. Mode compteur :
Ce mode est sélectionné en mettant à ‘1’ le bit TMR1CS. Et dès que le Timer1 est activé en mode
compteur, le module doit avoir un front descendant avant que l’incrémentation ne commence. Cependant le
Timer1 fonctionne soit en mode synchrone, soit en mode asynchrone.
En mode synchrone, sélectionné en mettant à ‘0’ le bit 㨥‫ڵ‬㨤㨪㨟㨔, le timer est incrémenté chaque front
montant de l’horloge externe sur la patte RC1/T1OSI/CCP2 si le bit T1OSCEN est mis à ‘1’, ou sur la patte
RC0/T1OSO/T1CKI si le bit T1OSCEN est mis à ‘0’. Dans ce cas l’horloge externe est synchronisée avec la phase
de l’horloge interne. Dans cette configuration et durant le mode SLEEP (mode sommeil), l’incrémentation du
timer est arrêtée puisque le circuit de synchronisation est arrêté.
En mode asynchrone, sélectionné en mettant à ‘1’ le bit 㨥‫ڵ‬㨤㨪㨟㨔, le timer est incrémenté à chaque
front montant de l’horloge externe sans que cette dernière ne soit synchronisée avec l’horloge interne. Dans
cette configuration et durant le mode SLEEP (mode sommeil), le timer continu l’incrémentation et peut générer
une interruption sur un débordement qui réveille le μC de son sommeil.
Remarque : [3]
Il existe deux sources d’horloge externe : un signal externe appliqué à la patte RC0/T1OSO/T1CKI, ou il
peut utiliser le signal d’un oscillateur qui lui est propre en mettant à ‘1’ le bit T1OSCEN, réalisé en connectant
un quartz entre les pattes RC0/T1OSO/T1CKI et RC1/T1OSI/CCP2.
Registre T1CON :(adresse : 10h)

diaomar35@gmail.com page 9/14


Informatique Industrielle Microcontrôleur 16F877

Bit 7 Non-implémenté : Lire comme ‘0’.


Bit 6 Non-implémenté : Lire comme ‘0’.
Bit 5:4 T1CKPS1:T1CKPS0 : Bits de sélection du taux de pré-division de l’horloge du Timer1.
11 = 1:8
10 = 1:4
01 = 1:2
00 = 1:1
Bit 3 T1OSCEN : Bit de contrôle de validation de l’oscillateur du Timer1.
1 = Oscillateur activé.
0 = Oscillateur désactivé.
Bit 2 㲅㷥㲄㲊㱿㱴 : Bit de contrôle de synchronisation de l’horloge externe du Timer1.
Quand TMR1CS = 1 :
1 = Ne pas synchroniser l’horloge externe entrante.
0 = Synchroniser l’horloge externe entrante.
Quand TMR1CS = 0 :
Ce bit est ignoré. Le Timer1 utilise l’horloge interne quand TMR1CS = 0.
Bit 1 TMR1CS : Bit de sélection de source d’horloge du Timer1.
1 = Horloge externe sur la pin RC0/T1OSO/T1CKl (sur le front montant).
0 = Horloge interne (FOSC / 4).
Bit 0 TMR1ON : Bit de mise en marche du Timer1.
1 = Active le Timer1.
0 = Stoppe le Timer1.

- 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)

Bit 7 Non-implémenté : Lire comme ‘0’.


Bit 6:3 TOUTPS3:TOUTPS0 : Bits de sélection du taux de post-division de la sortie du Timer2.
0000 = 1:1 valeur de post-division.
0001 = 1:2 valeur de post-division.
1111 = 1:16 valeur de post-division.
Bit 2 TMR2ON : Bit de mise en marche du Timer2.
1 = Active le Timer2.
0 = Stoppe le Timer2.
Bit 1:0 T2CKPS1:T2CKPS0 : Bits de sélection du taux de pré-division de l’horloge du Timer2.
Figure1.6.2 : Schéma interne du Timer1
00 = Pré-division par 1.
01 = Pré-division par 4.

diaomar35@gmail.com page 10/14


Informatique Industrielle Microcontrôleur 16F877

1x = Pré-division par 16.

Interface MSSP: (Master Synchronous Serial Port): [4]


Le MSSP est une interface de communication série, qui permet une communication série avec des
microcontrôleurs et d’autres composants périphériques (EEPROMs séries, afficheurs LCD, CAN…).
Le MSSP fonctionne en deux modes :
Mode SPI (Serial Peripheral Interface).
Mode I2C (Inter-Inegrated Circuit).
- Mode SPI:
Ce mode permet, de façon synchrone, de transmettre et de recevoir simultanément des données sur 8-bits,
ceci en utilisant 3 pattes et peut être 4 :
La patte SDO (Serial Data Out): est la sortie des données.
La patte SDI (Serial Data In): est l’entrée des données.
La patte SCK (Serial Clock) : est utilisée pour synchroniser l’échange des données, elle est en sortie sur le
maitre et une entrée sur l’esclave. La mise à ‘1’ du bit CPK (registre SSPCON adresse : 14h) permettra de valider
les données sur front descendant, et sur front montant si ‘0’.
La patte 㨤㨤 (Slave Select) : permet de sélectionner soit le mode maître, soit le mode esclave.
Le port MSSP est activé en mettant à ‘1’ le bit SSPEN (registre SSPCON). Pour redémarrer et reconfigurer le
mode SPI, on mit à ‘0’ le bit SSPEN, réinitialise le registre SSPCON, ensuite on mit à ‘1’ le bit SSPEN. Ceci
configure les pattes SDO, SDI, SCK et 㨤㨤 pour le MSSP.
Une donnée est reçue/transmise s’il y aura une écriture dans le registre SSPBUF, et quand cette opération est
établie, le bit SSPIF se mit à ‘1’ pour le signaler (déclanchement d’une interruption). En mode maître, le μC peut
transférer les données à m’importe quel moment parce que c’est lui qui contrôle l’horloge (SCK). Tandis qu’en
mode esclave, les données sont reçues ou transmises à chaque coup de l’horloge (SCK).Cependant, il peut
recevoir/transmettre des données en mode SLEEP, le μC s’éveillera lors de la réception de données.
- Mode I2C :
Dans ce cas deux pattes sont utilisées pour le transfert des données, SCL qui est la patte de l’horloge, et
SDA qui est la patte des données. Ce mode est activé an mettant à ‘1’ le bit SSPEN (registre SSPCON).
Le transfert de données se fait à travers le registre SSPSR qui n’est accessible qu’à partir le registre SSPBUF,
donc les données qui seront transmises/reçues, seront écrites dans le registre SSPBUF. Vu qu’on peut
connecter plusieurs maîtres/esclaves dans ce cas, le μC utilise des adresses pour l’information envoyée ne sera
prise en compte que par le composant de destination.
Interface USART :( Universal Synchronous Asynchronous Receiver Transmitter): [4]
Le module USART est un module de communication série, il est connu aussi sous SCI (Serial
Communications Interface). L’USART peut être configuré en 3 modes de fonctionnement :
Asynchrone (Full Duplex).
Synchrone Maître (Half Duplex).
Synchrone Esclave (Half Duplex).
Le bit SPEN (registre RCSTA) et les bits 6 et 7 du registre TRISC doivent être à ‘1’ pour que les deux
pattes RC6/TX/CK et RC7/RX/DT soient configurées en USART.
- Mode Asynchrone :
En mode asynchrone (Full Duplex) l’USART peut communiquer avec les micro-ordinateurs, on peut
sélectionner ce mode en mettant à ‘0’ le bit SYNC (du registre TXSTA à l’adresse 98h).
Émission asynchrone :
Elle suit la procédure suivante :
Initialisation du registre SPBRG par une valeur pour déterminer la vitesse de transmission.

diaomar35@gmail.com page 11/14


Informatique Industrielle Microcontrôleur 16F877

Validation du port asynchrone série.


Si on désire des interruptions, on doit mettre à ‘1’ le bit TXIE (bit de validation de l’interruption de
transmission de l’USART) (registre PIE1 à l’adresse 8Ch).
Si on désire transmettre 9-bits, on doit mettre à ‘1’ le bit TX9 (registre TXSTA).
Validation de la transmission en mettant à ‘1’ le bit TXEN (registre TXSTA), ce qui mettra le bit TXIF (registre
PIR1, adresse 0Ch) à ‘1’.
Ecriture du 9ème bit dans TX9D (registre TXSTA), si la transmission 9-bits est sélectionnée.
Ecriture de l’octet à transmettre dans le registre TXREG (début de la transmission).
Si on utilise les interruptions, il faut s’assurer que les bits GIE et PEIE (registre INTCON) sont à‘1’.
Réception asynchrone :
Elle suit la procédure suivante :
Initialisation du registre SPBRG par une valeur pour déterminer la vitesse d’émission.
Validation du port asynchrone série.
Si on désire des interruptions, on doit mettre à ‘1’ le bit RCIE (bit de validation de l’interruption de réception
de l’USART) (registre PIE1 à l’adresse 8Ch).
Si on désire recevoir 9-bits, on doit mettre à ‘1’ le bit TX9 (registre RCSTA, adresse 18h).
Validation de la réception en mettant à ‘1’ le bit CREN (registre RCSTA).
Génération d’une interruption lors de la fin de réception, qui sera signalée par la mise à ‘1’ du bit RCIF
(registre PIR1). Cette interruption ne sera générer que lorsque le bit de validation de l’interruption RCIE
(registre PIE1) est ‘1’.
Lecture du registre RCSTE pour avoir le 9ème bit (si la réception 9-bits est validée).
Lecture du registre RCREG pour avoir l’octet reçu.
Si on utilise les interruptions, il faut s’assurer que les bits GIE et PEIE (registre INTCON) sont à‘1’.
- Mode synchrone :
En mode synchrone (Half Duplex) l’USART peut communiquer avec des composants périphériques tels
que les circuits intégrés CAN et CNA, les EEPROMs séries ect.
Le principe est le même que celui du mode asynchrone avec deux différences majeures :
Émission et réception simultanées ne sont pas possibles, le fait d’activer l’une désactive automatiquement
l’autre.
Lorsque l’USART est en mode maître, c’est lui qui fournit l’horloge sur la patte RC6/TX/CK à une fréquence
fixée par le contenu du registre SPBRG ; lorsqu’il est en mode esclave, il reçoit l’horloge sur cette même patte
RC6/TX/CK.
Convertisseur Analogique-Numérique : [4]
Ce module de conversion convertit un signal analogique présent sur l’une de ces 8 entrées à son
équivalent numérique sur 10-bits. Le CAN a deux tensions de référence : haute et basse, qui sont choisis par
programmation parmi VDD, VSS, RA2 ou RA3.De plus, il y a 4 registres qui lui sont associés:
ADCON0 : qui est un registre de contrôle des opérations du CAN, il est disponible à l’adresse1Fh.
ADCON1 : qui est un registre de configuration du CAN, il est disponible à l’adresse 9Fh.
ADRESL : registre de résultat de la conversion, il contient les bits du poids faible, disponible à l’adresse 9Eh.
ADRESH : registre de résultat de la conversion, il contient les bits du poids fort, disponible à l’adresse 1Eh.
Pour effectuer une conversion A/N, voici les étapes à suivre :
1. Configuration du module CAN :
Configuration du port entrée pour le CAN et les tensions de référence (par le registre
ADCON1 bits 3 :0).
Sélection du canal d’entrée analogique (par le registre ADCON0 bits 5 :3).
Sélection de l’horloge de conversion (par le registre ADCON0 bits 7 :6).
Mise en route du module CAN (par le registre ADCON0 bit 0).
2. Configuration de l’interruption (cette étape n’est pas obligatoire) :
Mise à ‘0’ du bit ADIF (registre PIR1).
Mise à ‘1’ du bit ADIE (registre PIE1).
Mise à ‘1’ du bit PEIE (registre INTCON).
Mise à ‘1’ du bit GIE (registre INTCON).
3. Attendre à ce que l’acquisition soit faite (temps d’acquisition).
4. Démarrer la conversion :
Mettre à ‘1’ le bit GO/㨕㨠㨟㨖 (registre ADCON0).

diaomar35@gmail.com page 12/14


Informatique Industrielle Microcontrôleur 16F877

5. Attendre à ce que la conversion soit terminée :


Signalée par la mise à ‘0’ du bit GO/㨕㨠㨟㨖, ou par une interruption.
6. Lire le résultat de la conversion. Le résultat est stocké dans les registres ADRESH : ADRESL, et mettre à ‘0’ le
bit ADIF si c’est nécessaire.
7. Pour effectuer une deuxième conversion, il faut attendre au moins 2 fois le temps de conversion par bit.
Remarque :
Du fait que le registre pair du résultat (ADRESH : ADRESL) est sur 16-bits, on a donc la possibilité de justifier le
résultat (qui est sur 10-bits) soit à gauche en mettant à ‘0’ le bit ADFM (registre ADCON1), soit à droite en
mettant le bit ADFM à ‘1’.
Choix de l’horloge de conversion :
C’est le temps de conversion par bit (TAD), il existe 4 possibilités pour effectuer ce choix, le tableau suivant
montre comment ce temps est choisi :
Valeurs de TAD.

Le fonctionnement du CAN continu durant un SLEEP à condition d’utiliser l’horloge RC interne.

Schéma du module de conversion analogique-numérique.


Modules CCP (Capture/Compare/PWM) : [4]
Le PIC 16F877 possède deux modules CCP qui fonctionnent de la même façon. Chaque module contient
un registre sur 16-bits qui peut fonctionner en un des modes suivants :
Registre de capture.
Registre de comparaison.
Registre de la PWM.
Ce registre de 16-bits CCPR1 pour le module CCP1 (ou CCPR2 pour le module CCP2) est constitué de
deux registres de 8-bits chacun : CCPR1L (CCPR2L) qui contient l’octet bas et CCPR1H (CCPR2H) qui contient
l’octet haut.
Registre CCP1CON/CCP2CON :( adresse : 17h/1Dh)

Bit 7 Non-implémenté : Lire comme ‘0’.

diaomar35@gmail.com page 13/14


Informatique Industrielle Microcontrôleur 16F877

Bit 6 Non-implémenté : Lire comme ‘0’.


Bit 5:4 CCPxX:CCPxY : Bits de poids faible du PWM.
Mode capture et comparaison:
Inutilisés.
Mode PWM :
Ces bits sont les deux bits de poids faible du temps de cycle PWM. Les huit bits de poids fort se trouvent
dans CCPRxL.
Bit 3:0 CCPxM3:CCPxM0 : Bit de sélection du mode CCP.
0000 = module Capture/Compare/PWM désactivé (Reset le module CCPx).
0100 = Mode capture, à chaque front descendant.
0101 = Mode capture, à chaque front montant.
0110 = Mode capture, à chaque 4ème front montant.
0111 = Mode capture, à chaque 16ème front montant.
1000 = Mode comparaison, mise à ‘1’ de la sortie lors d’une égalité (le bit CCPxIF (registre PIRx) est mit à ‘1’).
1001 = Mode comparaison, mise à ‘0’ de la sortie lors d’une égalité (le bit CCPxIF est mis à‘1’).
1010 = Mode comparaison, génère une interruption lors d’une égalité (le bit CCPxIF est mis à ‘1’, la pin CCPx est
non-affecté).
1011 = Mode comparaison, événement spécial trigger (le bit CCP1IF est positionné, la pin CCPx est non-affecté)
; Le CCPx reset le TMR1, le CCP2 démarre le CAN (s’il est activé).
11xx = Mode PWM.
Vu que les deux modules sont identiques, on ne décrira qu’un seul : CCP1.
- Mode capture :
Dans ce cas, le registre CCPR1 (CCPR1H :CCPR1L) capture le contenu du registre TMR1 (duTimer1) quand l’un
des événements suivants se produit sur la patte RC2/CCP1 :
Tous les fronts descendants.
Tous les fronts montants
Tous les 4 fronts montants.
Tous les 16 fronts montants.
Quand une capture est faite, il y aura génération d’une interruption signalée par le bit CCP1IF.
Le Timer1 étant associé au mode capture, il doit fonctionner en mode temporisateur ou compteur synchronisé.
La patte RC2/CCP1 doit être configurée en entrée.
- Mode comparaison :
Dans ce mode, la valeur du registre CCPR1 est comparée à celle du registre TMR1. Quand une égalité aura lieu,
l’un des cas suivants se produira :
Passage à ‘0’ de la patte RC2/CCP2.
Passage à ‘1’ de la patte RC2/CCP2.
Aucun changement sur cette patte.
En ce même temps, le bit CCP1IF se mit à ‘1’ pour signaler une interruption.
Même chose pour le Timer1, il doit être configuré en temporisateur ou en compteur synchronisé, tandis que la
patte RC2/CCP1 doit être configurée en sortie.
- Mode PWM :
Dans ce mode le module CCP permet de générer une PWM (Pulse Width Modulation) avec une
résolution de 10-bits. La patte RC2/CCP1 doit être configurée en sortie.
a- Période de la PWM :
La période de la PWM est spécifiée en écrivant une valeur dans le registre PR2 (registre période du
Timer2) et qui sera calculée en utilisant la formule suivante :
Période de la PWM = [(PR2) + 1] x 4 x TOSC x (la valeur du pré-diviseur du Timer2)
b- Rapport cyclique :
Le rapport cyclique est spécifié en écrivant une valeur dans le registre CCPR1L (sur 8-bits) qui détermine
les bits du poids fort et dans CCP1CON (bit 4 et 5) qui détermine les bits du poids faible donc on a 10-bits. La
formule suivante permet de déterminer ce rapport cyclique :
Rapport cyclique = (CCPR1L:CCP1CON<5:4>) x TOSC x (la valeur du pré-diviseur du Timer2)
Le registre CCPR1H est utilisé comme esclave du CCPR1L et ne peut être écrit par le programmateur, il sert,
avec les deux autres bits, à sauvegarder la valeur du rapport cyclique pour ensuite générer une même période
que la précédente, cette sauvegarde ne se produit que lorsque la valeur du PR2 soit égale à celle du TMR2
(cette égalité signifie qu’une période est terminée).

diaomar35@gmail.com page 14/14

Vous aimerez peut-être aussi