Vous êtes sur la page 1sur 15

Chapitre IV

LE PIC16F877:

1-Introduction

Le 16F877 est un microcontrôleur à mémoire FLASH de la famille des PIC de


Microchip. Son prédécesseur le plus connu, est le 16F84. C’est le microcontrôleur le plus
riche en périphériques de cette gamme. Il s’agit d’un circuit intégré contenu dans un boîtier
dit « DIL 40 ». Il présente donc 40 broches, 20 de chaque côté. Les broches sont virtuellement
numérotées de 1 à 40, la broche 1 étant celle qui se trouve dans le coin situé à gauche de
l’encoche de repérage.
Comme pour tout circuit intégré, chacune de ses broches a une ou plusieurs fonctions
qui sont résumées par un sigle mnémotechnique.

Fig9.Brochage du 16f877

1.1 Les broches d’alimentation :

Le 16F877 a des broches d’alimentation : 2 pour le 0V broche 11 et 32 et 2 pur le +5V


broche 12 et 31. Il suffit de connecter une de chaque à l’alimentation pour que le CI
fonctionne.
1.2 Les broches du Quartz :

Comme pour tout microcontrôleur, le 16F877 a besoin d’une horloge pour fixer la
vitesse d’exécution des instructions. On utilise pour ce faire un quartz dont le rôle est de créer
une impulsion de fréquence élevée.
Le microcontrôleur se base sur cette fréquence pour son fonctionnement interne.
Notons que le 16F877 exécute une instruction élémentaire du langage assembleur en 4 cycles
d’horloge. Il va donc pouvoir exécuter 1millions d’opérations élémentaires par seconde. Le
quartz est connecté sur les 2 broches OSC1 et OSC2.

Fig10.Architecture interne du 16f877


2- Les Ports du 16F877 :
Le 16F877 possède 5 ports différents :

- le port A (6 broches)
- le port B (8 broches)
- le port C (8 broches)
- le port D (8 broches)
- le port E (3 broches)

Les broches de chaque port sont numérotées de 0 à n.


Les broches de ports sont désignées par un R suivi de la lettre du port et du numéro de broche.
Ainsi, la broche 0 du port A est désignée par RA0, la broche 4 du port B par RB4, etc…

On a donc 33 broches d’entrées-sorties (E/S) disponibles. C’est l’un des grands avantages
du 16F877. Mais toutes ces broches ne seront pas forcément disponibles en tant que broche
E/S car presque toutes sont également utilisées par l’un ou l’autre des modules internes du
16F877. Elles ne seront pas disponibles en tant que broche E/S si le module concerné est
activé.
Toutes les broches de ces ports sont des broches E/S, on peut donc les configurer en
entrée ou en sortie.Les caractéristiques électriques de ces broches sont spécifiées dans le
datasheet du micrcontrôleur Chaque port est configuré par un registre nommé TRIS, suivi de
la lettre du port. Ainsi le port A est configuré par le registre TRISA. Chaque bit de ces
registres (TRIS) détermine le sens Entrée ou Sortie des broches du port.

2.1 Le PORTA :

Le port A contient 6 pins I/O (input/output) numérotées de RA0 à RA5. On a donc 6 bits

dans le registre PORTA et 6 bits dans le registre TRISA. Les bits 6 et 7 de ces registres ne sont
pas implémentés. Le port A est configuré comme un ensemble d’entrées analogiques. Donc,
il faut forcer une valeur dans le registre ADCON1 dans la routine d’initialisation pour pouvoir
utiliser ce port comme port d’entrée/sortie de type général.

2.2 Le PORTB :

Ce port fonctionne exactement comme celui du 16f84.

2.3 Le PORTC :

Ce port utilise un registre TRISC localisé dans la banque 1, qui permet de décider
quelles sont les entrées et quelles sont les sorties. le positionnement d’un bit à « 1 » place la
pin en entrée, le positionnement de ce bit à « 0 » place pin en sortie.

Nous trouvons également le registre PORTC, qui se trouve dans la banque 0.

2.4 Le PORTD :
Le registre TRISD comporte 8 bits de direction, pendant que le registre PORTD
correspond aux pins I/O concernées.

2.5 Le PORT E :

Il ne comporte que 3 pins, RE0 à RE2 ces pins peuvent également être utilisées comme
pins d’entrées analogiques. Le registre ADCON1 détermine si ce port sera utilisé comme port
I/O ou comme port analogique.
2.5.1 Le registre TRISE :

Le registre TRISE dispose de certains bits de configuration

b7 : IBF : Input Buffer Full status bit

b6 : OBF : Output Buffer Full status bit

b5 : IBOV : Input Buffer OVerflow detect bit

b4 : PSPMODE : Parallel Slave Port MODE select bit

b3 : 0 : Non implémenté (lu comme « 0 »)

b2 : Direction I/O pour RE2 (1 = entrée)

b1 : Direction I/O pour RE1

b0 : Direction I/O pour RE0

Ls bits 0 à 2 fonctionnent de façon identique à ceux des autres TRISx.

Un bit à « 1 » positionne le pin en entrée, un bit à « 0 » la positionne en sortie.

Le bit 4 (PSPMODE) est le bit qui détermine si le PORTD sera utilisé en port I/O. Si On
place ce bit a 1, le PORTD sera considéré comme un port d’interfaçage parallèle avec un
microprocesseur (fonctionnement esclave).

3-La mémoire du Pic :

La mémoire du 16F877 est divisée en trois parties distinctes :

3.1. Une mémoire FLASH (8K).

C’est la mémoire programme proprement dite. Chaque « case » mémoire unitaire fait 13
bits. La mémoire FLASH est un type de mémoire stable, qu’on peut reécrire à volonté cette
mémoire flash fait 8Koctet.

3.2. Une mémoire RAM ( 368 octets).

La mémoire RAM disponible du 16F877 est de 368 octets, répartie de la manière


suivante :

1) 80 octets en banque 0, adresses 0x20 à 0x6F

2) 80 octets en banque 1, adresses 0xA0 à 0XEF

3) 96 octets en banque 2, adresses 0x110 à 0x16F


4) 96 octets en banque 3, adresses 0x190 à 0x1EF

5) 16 octets communs aux 4 banques, soit 0x70 à 0x7F ; 0xF0 à 0xFF ; 0x170 à 0x17F ; 0x1F0
à 0x1FF.

La signification de ces octets communs est que si on accéde au registre (adresse mémoire
RAM) 0x70 ou au registre 0XF0, en réalité on accéde au même emplacement. Ceci à
l’avantage de permettre d’utiliser ces emplacements sans devoir connaître l’état de RP0, RP1,
et IRP.

Fig11.La RAM du 16F877

3.3 Une EEPROM Interne ( 256 Octets).


C’est une mémoire de données.

4-Les modules internes du 16F877 :


Le 16F877 comprend :
1. Trois timers / compteurs :
- le timer 0
- le timer 1
- le timer 2
2. Un convertisseur analogique-numérique (CAN) 10 bits 8 canaux

3. Deux modules de génération d’impulsion à période réglable (PWM), qui fonctionnent


aussi en mode capture et comparaison

4. Un module de communication série synchrone

5. Une USART

6. Un module de communication en « port parallèle » en mode esclave

7. Un « chien de garde »

4.1. Les Trois timers / compteurs :

L’intérêt des modules de comptage, c’est qu’ils permettent de tenir compte d’évènements
qui surviennent de façon répétée sans que le microprocesseur soit monopolisé par cette tâche.
Dans la plupart des cas, une interruption a lieu que lorsque le compteur déborde (overflow).
4.1.1. Le timer 0 : fonctionne exactement comme décrit dans la partie du microcontroleur
16F84.

4.1.2. Le timer 1 :c’est un compteur 16 bits qui peut compter (de 0 à 65535) :
- soit les impulsions de l’horloge
- soit les impulsions externes, et en particulier les impulsions d’un quartz externe.
Le débordement provoque aussi une interruption.

4.1.2.1 Caractéristiques du timer 1 :

Le timer 1 fonctionne dans son ensemble comme le timer 0.

Ce timer est capable de compter sur 16 bits, il sera donc capable de compter de D’0’ à
D’65535’. Le Comptage avec le timer 16 bits nécessite 2 registres. Ces registres se nomment
TMR1L et TMR1H.

Le contenu de TMR1L et de TMR1H n’est pas remis à 0 lors d’un reset. Donc, pour compter à
partir de 0, il faut remettre à 0 les deux registres.

Le timer 1 permet également, de générer une interruption une fois le débordement


effectué. Le timer 1 dispose, de la possibilité de mettre en service un prédiviseur. Mais ce
prédiviseur ne permet qu’une division maximale de 8. Par conséquent il peut atteindre une
valeur maximale de 65536 multiplié par 8, soit 524288.
4.1.2.2 Le timer 1 et les interruptions :

Le timer 1 permet, de générer une interruption au moment ou il déborde, c’est-à-dire


au moment où sa valeur passe de 0xFFFF à 0x0000.

Pour que le timer 1 génère une interruption les conditions suivantes doivent etre satisfaites :

- Il faut que le bit d’autorisation d’interruption du timer 1 (TMR1IE) soit mis à 1. Ce bit se

trouve dans le registre PIE1.

- Pour que le registre PIE1 soit actif, il faut que le bit PEIE d’autorisation des interruptions
périphériques soit positionné dans le registre INTCON.

- Il faut que le bit d’autorisation générale des interruptions (GIE) soit positionné dans le
registre INTCON.

Une interruption sera alors générée à chaque débordement du timer1. Cet événement sera
indiqué par le positionnement du flag TMR1IF dans le registre PIR1.

4.1.2.3 Les différents modes de fonctionnement du timer1 :

Le timer 1 peut fonctionner en mode timer, ou en mode compteur.

Cependant, le timer 1 dispose de 2 modes différents en mode comptage : un mode de type


synchrone et un mode de type asynchrone. C’est à dire en synchronisme ou non avec
l’horloge interne.

On a la possibilité, au niveau du timer 1, d’utiliser un quartz sur les pins T1OSI et T1OSO afin
de disposer d’une horloge séparée de l’horloge principale.

Le timer peut donc fonctionner en tant que :

- Timer basé sur l’horloge interne (compteur de cycles d’instruction)

- Timer basé sur une horloge auxiliaire

- Compteur synchrone

- Compteur asynchrone.

Les modes de fonctionnement sont définis en configurant correctement le registre T1CON.


4.1.2.4 Le registre T1CON :

Ce registre, situé en banque 0, va permettre de configurer le timer1 en fonction des


besoins d’utilisation .Les bits qui le composent sont :

b7 : Inutilisé

b6 : Inutilisé

b5 : T1CKPS1 : Timer 1 oscillator ClocK Prescale Select bit 1

b4 : T1CKPS0 : Timer 1 oscillator ClocK Prescale Select bit 0

b3 : T1OSCEN : Timer 1 OSCillator ENable control bit

b2 : T1SYNC : Timer 1 external clock input SYNChronisation control bit

b1 : TMR1CS : TiMeR 1 Clock Source select bit

b0 : TMR1ON : TiMeR 1 ON bit

Les bits T1CKPS1 et T1CKPS0 déterminent à eux deux la valeur du prédiviseur. Le


prédiviseur, permet, de ne pas compter chaque événement reçu, mais seulement chaque
multiple de cet événement. La valeur de ce multiple est la valeur du prédiviseur.

T1CKPS1 T1CKPS0 Valeur du prédiviseur

0 0 1

0 1 2

1 0 4

1 1 8

T1OSCEN : ce bit permet de mettre en service l’oscillateur interne, et donc permet d’utiliser
un second quartz pour disposer d’un timer précis travaillant à une fréquence distincte de la
fréquence de fonctionnement du PIC.

Si on place ce bit à « 1 », on met en service l’oscillateur interne.

T1SYNC : permet de choisir si le comptage des événements sera effectué de façon synchrone
ou asynchrone avec l’horloge principale du PIC. Lorsque TMR1 est utilisé en mode « timer ».
4.2.9. Le registre ADCON0 :

Ce registre est le dernier utilisé par le convertisseur analogique/numérique.


analogique/numérique. Il contient les
bits qu’on manipule lors de la conversion. Sur les 8 bits du registre, 7 seront utilisés.

- b7 : ADCS1 : A/D conversion Clock Select bit 1

- b6 : ADCS0 : A/D conversion Clock Select bit 0

- b5 : CHS2 : analog Channel Select bit 2

- b4 : CHS1 : analog Channel Select bit 1

- b3 : CHS0 : analog Channel Select bit 0

- b2 : GO/DONE : A/D conversion status bit

- b1 : Inutilisé : lu comme « 0 »

- b0 : ADON : A/D ON bit

Afin de déterminer l’horloge du convertisseur en fonction de la fréquenc


fréquence du quartz
utilisé. On choisi le diviseur à l’aide des bits ADCS0 et ADCS1.

Le choix et la sélection du canal analogique pour procéder à la conversion s’effectuent à


travers les bits CHS0, CHS1 et CHS2.

CHS2 CHS1 CHS0 Canal Pin

0 0 0 0 AN0/RA0

0 0 1 1 AN1/RA1

0 1 0 2 AN2/RA2
0 1 1 3 AN3/RA3

1 0 0 4 AN4/RA5

1 0 1 5 AN5/RE0

1 1 0 6 AN6/RE1

1 1 1 7 AN5/RE2

Le bit ADON permet de mettre en service le convertisseur. Si le canal a été correctement


choisi, le positionnement de ce bit permet de démarrer la charge du condensateur interne,
et

donc détermine le début du temps d’acquisition.


Le bit Go/DONE, sera placé à « 1 » à la fin du temps d’acquisition. Cette action détermine le
début de la conversion. Une fois la conversion terminée, ce bit est remis à 0 (« Done » = «
Fait ») par l’électronique du convertisseur. Cette remise à 0 est accompagnée du
positionnement du flag ADIF du registre PIR1. Ce bit permettra éventuellement de générer
une interruption.

4.2.10. La conversion analogique/numérique et les interruptions :

Cette partie ne comporte aucune difficulté particulière. En effet, l’interruption générée par

le convertisseur est une interruption périphérique, et doit donc être traitée comme telle. Les

différentes étapes de sa mise en service sont donc :

- Positionnement du bit ADIE du registre PIE1

- Positionnement du bit PEIE du registre INTCON

- Positionnement du bit GIE du registre INTCON

Moyennant quoi, toute fin de conversion analogique entraînera une interruption. Il vous

suffira de remettre à « 0 » le flag ADIF après traitement de cette interruption.

4.2.11. L’utilisation pratique du convertisseur :

Arrivé à ce stade, vous disposez de toutes les informations pour effectuer votre mesure de
grandeur analogique. Voici un résumé des opérations concrètes à effectuer pour
échantillonner votre signal :

1) Configurez ADCON1 en fonction des pins utilisées en mode analogique, ainsi que les

registres TRISA et TRISE si nécessaire.

2) Validez, si souhaitée, l’interruption du convertisseur.

3) Paramètrez sur ADCON0 le diviseur utilisé.

4) Choisissez le canal en cours de digitalisation sur ADCON0.

5) Positionnez, si ce n’est pas déjà fait, le bit ADON du registre ADCON0.

6) Attendez le temps Tacq (typiquement 19,7µs sous 5V).

7) Démarrez la conversion en positionnant le bit GO du registre ADCON0.

8) Attendez la fin de la conversion.

9) Lisez les registres ADRESH et si nécessaire ADRESL

10) Attendez un temps équivalent à 2Tad (typiquement 3,2µs).

11) Recommencez au point 4.

Notez que puisque l’acquisition redémarre automatiquement après le temps « 2 Tad »,

vous pouvez relancer l’acquisition directement, à votre charge d’attendre non pas le temps

Tacq pour la fin de l’acquisition, mais le temps Tacq + 2Tad. Ceci vous épargne une

temporisation. En effet, 2 temporisations qui se suivent peuvent être remplacées par une

temporisation unique de temps cumulé.

Si donc, nous prenons un PIC cadencée à 20Mhz, sous une tension d’alimentation de

5V, nous aurons :

1) Configurez ADCON1 en fonction des pins utilisées en mode analogique, ainsi que les

registres TRISA et TRISE si nécessaire.

2) Validez, si souhaité, l’interruption du convertisseur (PEIE, ADIE, GIE)

3) Paramètrez le diviseur 32 sur ADCON0 (B’10000000’)

4) Choisissez le canal en cours de digitalisation sur ADCON0 et lancez le convertisseur

(B’10xxx001’)
5) Attendez le temps (Tacq+2Tad), soit 19,7µs + 3,2µs = 22,9µs

6) Démarrez la conversion en positionnant le bit GO du registre ADCON0

7) Attendez la fin de la conversion

8) Lisez les registres ADRESH et si nécessaire ADRESL

9) Recommencez au point 4

Notez que vous pouvez, comme montré, réaliser plusieurs opérations en même temps.

Cependant, fort logiquement, vous ne pouvez pas positionner les bits ADON et

GO/DONE en même temps, puisque le temps Tacq doit impérativement les séparer.

Remarque :

Lorsque vous disposez de beaucoup de temps entre 2 lectures de la valeur analogique, nous

vous conseillons d’effectuer plusieurs mesures intermédiaires, et d’effectuer la moyenne de


ces mesures. Ainsi, un parasite éventuel, ou une légère fluctuation de votre tension sera
fortement atténuée.

Il est pratique dans ce cas d’effectuer un nombre de mesures qui est une puissance de 2 (2

mesures, 4,8,16…). Ainsi, pour effectuer votre moyenne, il suffira d’effectuer la somme de

toutes les valeurs, la division s’effectuant par simple décalage.

4.3. Les deux modules CCP et la génération (PWM) :

Ce module est très puissant pour créer des impulsions à des fréquences élevées. On pourra
définir la période, la durée du niveau haut pendant cette période.
Le 16F877 dispose de deux modules CCP. CCP signifie Capture, Compare, and PWM.

Ces modules CCP sont fortement liés et dépendant des timers 1 et 2. Ils sont également liés
au convertisseur A/D.

Les 2 modules CCP1 et CCP2 sont strictement identiques, excepté la possibilité, pour le
module CCP2, de démarrer automatiquement la conversion A/D.

4.3.1 Les registres CCP1CON et CCP2CON

Ces registres ont la même fonction, CCP1CON concerne le module CCP1, tandis que
CCP2CON concerne le module CCP2.

Le registre CCPxCON permet de déterminer le mode de fonctionnement du module.


CCPxCON

b7 : Inutilisé : Lu comme « 0 »

b6 : Inutilisé : Lu comme « 0 »

b5 : CCPxX : module Capture Compare and Pwm x bit X

b4 : CCPxY : module Capture Compare and Pwm x bit Y

b3 : CCPxM3 : module Capture Compare and Pwm x Mode select bit 3

b2 : CCPxM2 : module Capture Compare and Pwm x Mode select bit 2

b1 : CCPxM1 : module Capture Compare and Pwm x Mode select bit 1

b0 : CCPxM0 : module Capture Compare and Pwm x Mode select bit 0

Les bits CCPxX et CCPxY. Ces bits sont en fait les 2 bits de poids faible qui complètent le
nombre de 10 bits utilisé pour le mode de fonctionnement PWM. Dans les autres modes, ces
bits sont donc inutilisés.

Les bits CCPxM3 à CCPxM0 servent à déterminer quel sera le mode de fonctionnement

du module concerné. Les possibilités sont les suivantes :

CCPM Fonctionnement

0000 Module CCPx à l’arrêt

0100 Mode capture validé sur chaque flanc descendant

0101 Mode capture validé sur chaque flanc montant

0110 Mode capture validé sur chaque multiple de 4 flancs montants

0111 Mode capture validé sur chaque multiple de 16 flancs montants

1000 Mode compare, place la sortie à 1 sur débordement (+ bit CCPxIF = 1)

1001 Mode compare, place la sortie à 0 sur débordement (+ bit CCPxIF = 1)

1010 Mode compare, positionne CCPxIF sans affecter la sortie

1011 Mode compare, positionne CCPxIF sans affecter la sortie, et génère le trigger

11xx Mode PWM


4.3.2. Le mode « capture » :

Ce mode fait intervenir un pin comme événement déclencheur. Il s’agit donc d’une
entrée. Il est donc impératif de configurer le pin CCPx en entrée via le registre TRISC avant de
pouvoir utiliser le module CCPx en mode « capture ».

Principe de fonctionnement :
Le mode capture est en étroite liaison avec les pins RC1/CCP2 et RC2/CCP1 du PIC. le
principe est le suivant :

- Au moment de l’apparition de l’événement déclencheur sur le pin concernée, la valeur


(16bits) du timer 1 contenue dans les registres TMR1H et TMR1L est copiée dans les

registres CCPR1H et CCPR1L.

- Simultanément, le bit CCP1IF du registre PIR1 est validé, et une interruption intervient si
elle est configurée.

L’événement déclencheur est une variation du signal sur le pin CCP1/RC2 pour le module
CCP1, et sur le pin CCP2/RC1 pour le module CCP2. L’événement qui provoque la capture
dépend des bits CCPxM3 à CCPxM0.

4.3.3. Le mode « compare » :

Ce mode de fonctionnement est basé sur la correspondance de la valeur du timer


1(TMR1H/TMR1L) avec la valeur contenue dans CCPRxH/CCPRxL. L’égalité de ces valeurs
entraînera les réactions souhaitées.

4.3.4. Le mode « PWM » :

4.3.4.1 La théorie du « PWM » :

PWM signifie « Pulse Width Modulation », ce qu’on pourrait traduire par modulation de
largeur d’impulsion. Il s’agit d’un signal binaire de fréquence fixe dont le rapport cyclique
peut être modulé par logiciel.

Le module « PWM » a besoin d’un pin du PIC configurée en sortie.

Le rapport cyclique d’un signal binaire à fréquence fixe peut être défini comme étant le
rapport entre le temps où il se trouve à l’état « 1 » par rapport au temps total d’un cycle. Un
cycle n’étant constitué, par définition, que d’un état « 1 » suivi d’un état « 0 », la somme des
temps des 2 états étant constante.

Il y a donc deux paramètres qui définissent un signal « PWM » :


- La durée d’un cycle complet
- Le rapport cyclique

Donc, si on pose :

- Tc = Durée d’un cycle


- Rc le rapport cyclique

- Th = durée de l’état haut

- Tb = durée de l’état bas

Alors :

- Tc = Th + Tb (Durée d’un cycle en secondes = durée de l’état haut + durée de l’état bas)

- Fréquence du signal (en hertz) = 1/Tc


- Rc = Th / Tc (rapport cyclique en % = temps à l’état haut divisé par le temps de cycle)