Vous êtes sur la page 1sur 86

Formation 21/21 sur le thme :

Assure par : ZAIDI Abdelaziz et Hmidne Ali



















Institut Suprieur des Etudes Technologiques de Sousse



Microcontrleurs
PIC16FXX
2006/2007
1






Sommaire

A- Les microprocesseurs et les microcontrleurs
1- Historique .
2- Lactualit.
3- Architectures d'une Machine
4- Diffrence entre un microprocesseur et un microcontrleur ..
5- Quelques microcontrleurs connus .
6- Microcontrleurs et applications ..


3
3
3
4
4
9


B- Composition et fonctionnement des PICs
1- Quest-ce quun PIC ?...........................................................................................
2- Les diffrentes familles des PICs.



10
11
C- Le PIC 16F84
1- Caractristiques gnrales du microcontrleur.
2- Architecture interne..
3- Organisation du 16F84.
4- Les ports dentre/sortie..
5- Les SFR (registres fonction spciale)..
6- Organisation des instructions.
7- Organisation dun fichier .asm
8- Les modes dadressage.
9- Ralisation dun programme embarqu ..
10- Les interruptions
11-Timer0
12- Les accs en mmoire eeprom .
13- Le watchdog (chien de garde)
14- Le mode Sleep (veille)


11
12
13
15
16
16
20
27
29
36
41
45
47
48
D- Le PIC 16F877
1- Introduction .
2- Les Ports du 16F877
3- La mmoire du Pic
4- Les modules internes du 16F877..
4.1. Les Trois timers / compteurs.
4.2. Un convertisseur analogique-numrique (CAN) 10 bits .
4.3. Les deux modules CCP et la gnration (PWM)
4.4 Le module MSSP en mode SPI .
4.5. Le module USART
4.6. Port D en mode PSP
4.7. liaison I2C
5- Les Interruptions du 16F877

50
52
54
55
56
60
68
72
73
79
80
85

2




A-Les microprocesseurs et les microcontrleurs

1-Historique

Avant les annes 50 John Mauchley et Prespert Eckert, construisent l'ENIAC : 18000 tubes,
1500 relais, consomme 140 kW. La mmoire de programme est un panneau de cblage. La
mmoire des donnes comporte 20 mots de 10 chiffres dcimaux.
L'Eckert-Mauchly Corporation lance son premier ordinateur, l'UNIVAC, en 1951.
BULL lance son premier ordinateur, le Gamma 2, en 1951.
IBM lance son premier ordinateur, le 701, en 1953.
L'invention du transistor en 1948 marque le vrai dpart de lindustrie informatique.
DEC lance le premier mini-ordinateur, le PDP-1 en 1961.
IBM lance le 7090 en 1961. Le plus gros du moment.
CDC lance le CDC 6600 en 1964. Le premier ordinateur parallle (conu par Seymour Cray)
restera longtemps le plus puissant.
IBM lance la mme anne la srie 360. Le premier ordinateur dot d'une unit de commande
microprogramme et d'un vrai systme d'exploitation (la premire catastrophe logicielle).
DEC invente le bus et lance le PDP-8 en 1965.
INTEL invente le microprocesseur en 1971.

2-Lactualit

Deux marques se partagent le march des processeurs destins aux ordinateurs :
INTEL, grce IBM, ses PC et tous les compatibles qui sont apparus.
MOTOROLA, grce Apple Computers et son Macintosh.

3-Architectures d'une Machine

3.1 Architecture de Von Neumann
John Von Neumann : Brillant mathmaticien, il fixe pour jusqu' prsent l'architecture d'un
ordinateur ( son poque, le mot n'est pas encore invent).
constitution : Mmoire, Unit centrale, Communications.
Dans ce cas, le traitement dune instruction et son oprande ncessite donc la lecture dau moins
deux cases mmoires (3 si loprande est code sur deux octets). Cela correspond une dure de
2 ou 3 cycles machine.

3.2 Architecture de Harvard
Cette architecture repose sur le principe de sparation de la mmoire-donnes de la mmoire-
programme.
Dans ce cas, la lecture duneseule case mmoire permet le traitement entier dune instruction et
de son oprande. Un seul cycle machine est donc ncessaire.

3.3 Architectures Parallles
Amlioration de l'unit centrale d'une architecture de Von Neumann ou de Harvard.
Nouvelles architectures de machine.


3
4-Diffrence entre un microprocesseur et un microcontrleur

Avec un microprocesseur dusage gnral, pour raliser une application bien dtermine, le
microprocesseur et ses composants annexes (mmoire RAM, ROM,) doivent tre relis des
circuits priphriques spcialiss tels que des ports parallles (entres/sorties logiques),
des convertisseurs analogiques/numriques, des transmetteurs/rcepteurs srie (UART)


Afin de rpondre ces besoins, les fabricants de semiconducteurs on eu lide de regrouper
toutes ces fonctions dans un seul circuit spcialis : le microcontrleur.





5-Quelques microcontrleurs connus

5.1 Le 80C552 de PHILIPS (noyau 8051 de Intel):

Le 80C552 est un microcontrleur de 8bits. Il est fabriqu dans un processus suprieur de CMOS
et c'est un driv de la famille des microcontrleurs 80C51. Il utilise les instructions mises pour
le 80C51 en addition des registres de la fonction spciale qui sont incorpors pour contrler les
priphriques.
Microcontrleur
4
Le schma synoptique de la figure au dessous, prsente les diffrents blocs internes du
microcontrleur qui sont les suivants:
- 8 koctets de ROM interne (mmoire programme) extensible jusqu' 64Koctets.
- 256 octets de RAM (mmoire donnes) interne extensible jusqu' 64Koctets.
- 2 Timers 16 bits standard (T0 et Tl).
- Un troisime Timer de 16 bits (T2) coupl quatre registres de capture et trois
registres de comparaison.
- Convertisseur analogique numrique quip de huit entres dont la rsolution est de 10
bits.
- 2 sorties (PWM) de rsolution 8 bits.
- 5 ports bidirectionnels.
- Un port unidirectionnel.




-Un systme de gestion d'interruption sur deux niveaux de priorit.
-Un port srie du type USART.
-Un module watchdog.
La frquence maximale dhorloge est de 24 MHz. Pour un quartz de 12 MHz, la dure dun cycle
machine est dune microseconde.




5
5.2 Le 68HC11 de Motorola :
Structure interne
Le microcontrleur Motorola 68HC11 peut fonctionner avec des horloges allant jusqu'a
12MHz. Tous les registres tant statiques, une coupure d'horloge n'entrane pas de perte de
donne. Le 68HC11 intgre de puissants priphriques :
J usqu'a 12KO de ROM ou d'EPROM (mmoire programme)
J usqu'a 1 KO de RAM (mmoire donne)
J usqu'a 8KO d'EEPROM (mmoire donne)
Ports parallles
Port de communication srie asynchrone
Port de communication srie synchrone
Ports analogiques
Timers
Chien de garde
Gnration d'interruptions temps rel

6
Le 68HC11 est disponible suivant les versions en botier DIP ou PLCC. Le modle
fonctionnel du 68HC11Ex est donn ci-dessus. Des blocs fonctionnels peuvent tre
diffrents ou absents dans certaines versions.

Modes de fonctionnement

- Single-Ship: Fonctionnement autonome, tous les ports du microcontrleur sont
disponibles, par contre la memoire est limite la capacit interne
- Expended multiplexed: Ce mode permet d'tendre la capacit mmoire ainsi que les
peripheriques. L'ensemble devient plus puissant mais le matriel est plus complexe et deux
ports 8 bits sont perdus sur Ie microcontrleur
- Special Bootstrap : Lors du RESET un logiciel interne appel BOOTLOADER
tlcharge automatiquement en RAM un programme provenant de la liaison srie
asynchrone (SCI) et excute celui-ci. Ce mode est utilis pour stocker distance des valeurs
de consigne (pour une rgulation par exemple) ou pour Ie dveloppement .
- Special Test: Destin au dpart aux tests de production de Motorola, ce mode peut tre
utilis pour le dveloppement, en particulier pour I'mulation, il permet entre autre de
modifier le registre CONFIG aprs le RESET













5.3 Le AT90S8535 de ATMEL

Description :
Le microcontrleur AT90S8535 est produit par ATMEL. Il sagit dun microcontrleur 8 bits,
qui intgre de nombreux priphriques, ainsi que diffrents types de mmoire.
La figure suivante prsente larchitecture interne du microcontrleur.













7



Constitution:
- CPU 8 Bits capable dexcuter une instruction par cycle dhorloge.
- 8 Koctets de mmoire programme EEPROM FLASH programmable in situ.
- 512 Octets dEEPROM (Stockage de donnes non volatiles)
- 512 Octets de RAM (donnes) statique.
- Convertisseur Analogique Numrique 10 bits 8 entres multiplexes.
- Liaisons sries synchrone (SPI) et asynchrone (SCI)
- 2 TIMERS 8 bits (dont 1 utilisable en RTC a laide dun oscillateur externe)
- 1 TIMER 16 bits.
- 1 Comparateur de tensions analogiques.
- 2 entres dinterruptions externes et une entre de RESET.
- 4 Ports dentres/sorties 8 bits.
La frquence maximale dhorloge est de 8MHz ce qui donne 8MIPS (8 Milliers dInstructions
Par Seconde). Le botier peut tre un botier DIL ou PLCC.
7

Espace mmoire :
La taille du bus de donnes est de 8 bits, les mmoires de donnes (SRAM et EEPROM) sont
donc organises en mot de 8 bits.
Les instructions excutables par lunit arithmtique et logique sont codes sur 16 bits, la
mmoire de programme (FLASH) est donc organise en mots de 16 bits.


Lespace de donnes est compltement spar de lespace adressable de la mmoire
programme, ils possdent chacun leur propre bus dadresses et de donnes (Architecture de
HARVARD).

Le CPU :
Le microprocesseur du AT90S8535 comporte :
- Un bloc de 32 registres, contenant les donnes traiter,
- Une unit arithmtique et logique (ALU) rapide, qui est capable dexcuter une instruction,
(de registre registre) par cycle dhorloge,
- Un compteur programme,
- Un registre dinstruction et un dcodeur dinstruction, et un cache dinstruction.
8


6- Microcontrleurs et applications

Dautres fabricants proposent dautres microcontrleurs. Par exemple :
Parallax (Srie Basic Stamp)
Arizona Microchip (Srie PIC)
Rabbit Semiconductor (Srie Rabbit)

Il sagit dun march gigantesque : Arizona Microchip dclare avoir vendu plus de 1,5
milliards dunits (2001).
Les caractristiques principales dun microcontrleur sont :
De nombreux priphriques dE/S
Une mmoire de programme
Une mmoire vive (en gnral de type SRAM)
Eventuellement une mmoire EEPROM destine la sauvegarde par programme de
donnes la coupure de lalimentation.
Un processeur 8 ou 16 bits.
Faible consommation lectrique
Les tailles mmoire sont en gnral rduites, de lordre de :
16 koctets pour la mmoire programme
Quelques octets 16 koctets pour la RAM
La puissance de calcul est aussi limite :
0.012 MIPS pour les Basic Stamp
1 5 MIPS pour les PIC
20 MIPS pour les Rabbit
Pour rfrence, un 80286 6MHz permet datteindre 0.9 MIPS, alors que la puissance de
calcul dun Pentium 4 est de lordre de 5000 MIPS. Les nouvelles gammes de
microcontrleurs prsentent des capacits importantes de calcul.
Les microcontrleurs sont conus pour lusage dans plusieurs applications :
Instrumentation
9
Contrle industriel
Contrle des automobiles
Commande des machines
Electromnager, Hi-Fi
Nous allons durant ce cours tudier les microcontrleurs PIC. Ces microcontrleurs
prsentent trois avantages majeurs : Le cot, le jeux dinstruction rduit et la facilit de
chargement du programme avec, bien sr, toutes les fonctionnalits dun microcontrleur
moderne.

B- Composition et fonctionnement des PICs


Nous allons maintenant nous pencher sur un PIC, et en particulier sur le 16F84.
Rassurez-vous, tout ce que nous verrons sur le 16F84 pourra tre directement utilis sur les
PIC16F877, qui ne sont rien dautre que des 16F84 amliores. Chaque PIC dispose des
fonctionnalits des modles infrieurs, augmentes de nouvelles fonctions.

Tout dabord, vous devez tlcharger le datasheet du 16F84, car cest un document qui
facilite la comprhension de ce cours. Durant ce cours, on vous rfre des pages voir sur le
datasheet, pour plus dinformations. Il est vivement conseill de limprimer, car vous en aurez
toujours besoin quand vous vous lancerez dans la ralisation de vos propres programmes. Le
datasheet du 16F877 vous serais aussi utile dans le cas ou vous aimeriez approfondir vos
connaisances sur ce qui se passe rllement lintrieur du PIC, pour les priphriques qui
sont intgrs dans le microcontrleur volu 16F877.


1- Quest-ce quun PIC ?

Un PIC nest rien dautre quun microcontrleur, cest dire une unit de traitement
de linformation de type microprocesseur laquelle on a ajout des priphriques internes
permettant de raliser des montages sans ncessiter lajout de composants externes.

La dnomination PIC est sous copyright de Microchip, donc les autres fabricants ont
t dans limpossibilit dutiliser ce terme pour leurs propres microcontrleurs.

Les PICs sont des composants dits RISC (Reduce Instructions Construction Set), ou
encore composant jeu dinstructions rduit. Pourquoi ? Et bien, sachez que plus on rduit le
nombre dinstructions, plus facile et plus rapide en est le dcodage, et plus vite le composant
fonctionne.

Toutes les PICs Mid-Range ont un jeu de 35 instructions, stockent chaque instruction
dans un seul mot de programme, et excutent chaque instruction (sauf les sauts) en 1 cycle.
On atteint donc des trs grandes vitesses, et les instructions sont de plus trs rapidement
assimiles.

Lhorloge fournie au PIC est prdivise par 4 au niveau de celui-ci. Cest cette base
de temps qui donne le temps dun cycle.

10
Si on utilise par exemple un quartz de 4MHz, on obtient donc 1000000 de
cycles/seconde, or, comme le pic excute pratiquement 1 instruction par cycle, hormis les
sauts, cela vous donne une puissance de lordre de 1MIPS (1 Million dInstructions Par
Seconde).

Pensez que les pics peuvent monter 20MHz. Cest donc une vitesse de traitement
plus quhonorable.

2- Les diffrentes familles des PICs

La famille des PICs est subdivise en 3 grandes familles : La famille Base-Line, qui
utilise des mots dinstructions de 12 bits, la famille Mid-Range, qui utilise des mots de 14
bits (et dont font partie le 16F84 et 16F877), et la famille High-End, qui utilise des mots de 16
bits.

Nous nous limiterons dans cet ouvrage la famille Mid-Range, sachant que si vous
avez tout compris, vous passerez trs facilement une autre famille, et mme un autre
microcontrleur.

Notez ds prsent que les datasheets du 16F84 et 16F877 nest quune petite partie
de la documentation complte. Pour obtenir la documentation complte, vous ajoutez encore
plus de 600 pages en tlchargeant chez Microchip les datasheets pour la gamme Mid-Range.

Cependant, la documentation de base suffit pour 99,9% des applications, et, de plus,
les datasheets Mid-Range sont disponibles sous la forme dun fichier par chapitre.


Notez ds prsent que les PICs sont des composants STATIQUES, cest dire que la
frquence dhorloge peut tre abaisse jusqu larrt complet sans perte de donnes et sans
dysfonctionnement. Une version 10 peut donc toujours tre employe sans problme en lieu
et place dune 04. Pas linverse, naturellement.
Ceci par opposition aux composants DYNAMIQUES, donc la frquence dhorloge
doit rester dans des limites prcises. Nessayez donc pas de faire tourner votre PIII/500
166MHz, car cest un composant dynamique.

Nous allons traiter dans ce cours le PIC16f84 qui est le microcontroleur de base de
cette famille. Par la suite, on tudiera le 16F877 en dcrivant surtout ses priphriques.

C-Le PIC 16F84:

1-Caractristiques gnrales du microcontrleur:

- Microcontrleur 8 bits.
- Unit centrale de traitement avec une architecture RISC (Reduced Instruction
Set Computer).
- 1024 mots mmoire programme (flash).
11
- 68 octets mmoire de donne (RAM).
- 64 octets mmoire de donne (EEPROM).
- Bus programme (mot dinstruction) ; 14 bits.
- Bus de donne ; 8 bits.
- 15 registres fonction spciale (SFR).
- 35 instructions : toutes les instructions prennent un seul cycle sauf les
branchements, ils prennent deux cycles.
- Adressage direct, indirect et relatif.
- 4 sources d'interruptions.
- Frquence maximum d'horloge : 10Mhz.
- Temps de cycle d'instruction : 200ns.
- 13 entres/sorties avec contrle individuel de direction.
- Courant maximum d'entre (par broche) : 25mA.
- Courant maximum de sortie (par broche) : 20mA.
- TMR0:8 bits temporisateurs/compteur programmable.
- Chien de garde interne avec son propre oscillateur.
- Programmation en mode srie travers deux broches (RB7 et RB6).
- Plage de tension de Vdd entre 2V et 5.5V.
- Botier de 18 broches (PDIP) : voir figure 1.2.

Fig1.Brochage du 16f84

2-Architecture interne:

La famille des microcontrleurs PIC 16F8X utilise l'architecture RISC, cette architecture
permet une accessibilit spare de la mmoire programme et celle de donne .Par
consquent on deux bus : bus pour la mmoire donne et un autre pour la mmoire
programme. L'UAL (Unit Arithmtique et Logique) est de 8 bits, elle communique avec un
12
registre de travail (W). Elle peut affecter le contenu des bits ; carry (C), digit carry (DC) et
Zro (Z) du registre d'tat (status), tout cela dpend du type d'instruction.
La figure 2 montre la structure interne du 16f84 :






3-Organisation du 16F84

La mmoire du 16F84 est divise en 3 parties. Page 4 du datasheet, vous trouverez la
table 1-1 qui donne un aperu de la famille 16F8X. Les numros de pages peuvent varier en
fonction des mises jour de Microchip. Vous devrez peut-tre chercher un peu.

Pour ceux qui veulent tout comprendre, la figure 3-1 de la page 8 montre
lorganisation interne dun 16F84.

3.1 La mmoire programme

La mmoire programme est constitue de 1K mots de 14 bits. Cest dans cette zone que
vous allez crire votre programme. Ceci explique pourquoi vos fichiers sur PC font 2Kbytes.

Fig2.Architecture interne du 16f84
13
En effet, il faut 2 octets pour coder 14 bits. Ceci explique galement pourquoi, lorsque
vous lisez une PIC vierge, vous allez lire des 0x3FFF. Cela donne en binaire
B11111111111111, soit 14 bits.

Notez ce point quune instruction est code sur 1 mot. Donc, 1K donne 1 bon millier
dinstructions possibles (cest dj pas si mal). Quand vous en serez crire des programmes
de 1K, vous serez sans aucun doute autonome pour vos applications.


Fig3.Mmoire programme et pile

3.2 La mmoire Ram

La mmoire RAM est celle que nous allons sans cesse utiliser. Toutes les donnes qui y
sont stockes sont perdues lors dune coupure de courant. La mmoire RAM est organise en
2 banques pour la 16F84. La RAM est subdivise de plus en deux parties. Dans chacune des
banques nous allons trouver des cases mmoires spciales appeles REGISTRES
SPECIAUX et des cases mmoires libres dont vous pouvez vous servir votre guise.

Pour le cas du 16F84, vous disposerez de 68 octets libres. Lorganisation de la RAM est
montre dans le tableau 4-2 page 13. Vous voyez la sparation verticale en 2 banques, et tout
en bas vous voyez deux banques de 68 octets de RAM.

Malheureusement, lindication mapped in bank 0) vous indique quaccder ces 68
octets depuis la banque 0 ou la banque 1 donne en fait accs la mme case mmoire.

Chaque registre provoque un fonctionnement spcial du PIC ou la mise en service dune
fonction particulire. Vous remarquerez enfin que certains registres sont identiques dans les 2
14
banques (FSR par exemple). Cela signifie quy accder depuis la banque 0 ou 1 ne fait pas de
diffrence.

Remarquez que la banque 0 utilise les adresses de 0x00 0x7F, la banque 1 allant de
0x80 0xFF (voir Fig4). Les zones en gris sont des emplacements non utiliss (et non
utilisables). Lemplacement 0x00 est un emplacement auquel on ne peut pas accder.

Pour la grande majorit des registres, chaque bit a une fonction spciale. Page 14, tableau
4-1, vous trouverez les noms des bits utiliss dans ces registres.

3.3 La mmoire eeprom

La mmoire eeprom (Electrical Erasable Programmable Read Only Memory), est
constitue de 64 octets que vous pouvez lire et crire depuis votre programme. Ces octets sont
conservs aprs une coupure de courant et sont trs utiles pour conserver des paramtres
semi-permanents. Leur utilisation implique une procdure spciale que nous verrons par la
suite, car ce nest pas de la RAM, mais bien une ROM de type spcial. Il est donc plus rapide
de la lire que dy crire. Si vous programmez souvent des eeproms (2416) vous aurez constat
dj ce phnomne.

4- Les ports dentre/sortie

Le pic 16F84 possde deux ports dentr/sortie dont les broches sont bidirectionnelles et qu'ils
peuvent tre programmes soit en entr soit en sortie.

4-1- Le PORTA :

Le PORTA est un port bidirectionnel et quil possde cinq pins dont la fonction de
chacune est :
RA0 (bit 0) : broche E/S.
RA1 (bit 1) : broche E/S.
RA2 (bit 2) : broche E/S.
RA3 (bit 3) : broche E/S.
RA4 (bit 4) : broche E/S et multiplex avec une entre dhorloge pour TMR0.

4-2- Le PORTB:

Le PORTB est un port bidirectionnel de huit broches dont la fonction de chacune est :
RB0 (bit 0) : broche E/S ou aussi une source dinterruption externe.
RB1 (bit 1) : broche E/S.
RB2 (bit2) : broche E/S.
RB3 (bit 3) : broche E/S.
RB4 ( bit 4 ) : broche E/S.
RB5 ( bit 5 ) : broche E/S.
RB6 (bit 6) : broche E/S et entre horloge pour la programmation srie du C.
RB7 (bit 7) : broche E/S et entre donnes pour la programmation srie du C.




15
Remarques :

- Toutes les broches du PORTB possdent des rsistances +VDD (pullups). Ces rsistances
sont mises en uvre par programmation (le bit /RBPU du registre OPTION_REG), elles sont
automatiquement dsactives quand le port est en sortie..
- Les broches RB4:RB7 peuvent gnrer par programmation une interruption en cas de
changement dtat.

5- Les SFR (registres fonction spciale):

Les registres fonction spciale ou les SFR sont contenus dans la mmoire de donnes.
Ils sont utiliss par l'unit centrale (CPU) .Lemplacement mmoire de ces registres est donn
Dans la figure 4.Ces registres seront tudis ultrieurement.

6- Organisation des instructions

6.1 Gnralits

Allez, courage, cela devient de plus en plus concret. On va faire un petit survol du jeu
dinstructions des PICs. On saute directement page 55 du datasheet, au chapitre 9. Et oui,
FiG4. Mmoire dedonnes RAM
et les SFR
16
comme cet ouvrage nest pas un manuel de rfrence technique, mais un apprentissage, il faut
voir les chapitres dans le dsordre.

Sur cette page, vous trouvez un petit encadr gris qui fait allusion deux anciennes
instructions qui ne sont plus utilises. Nous ne nous en servirons donc pas. Par contre, vous
trouvez un tableau 9-1 qui indique comment les instructions sont codes dans le PIC. Et la,
vous voyez enfin quoi correspondent nos 14 bits de mmoire programme.

6.2 Les types dinstructions

Il existe 4 types dinstructions :

6.2.1 Les instructions orientes octet

Ce sont des instructions qui manipulent les donnes sous forme doctets. Elles sont codes
de la manire suivante :

- 6 bits pour linstruction : logique, car comme il y a 35 instructions, il faut 6 bits pour
pouvoir les coder toutes

- 1 bit (d) pour indiquer si le rsultat obtenu doit tre conserv dans le registre de travail de
lunit de calcul (W pour Work) ou sauv dans loprande (F pour File).

- Reste 7 bits pour encoder loprande (File)

Aie, premier problme, 7 bits ne donnent pas accs la mmoire RAM totale, donc voici
ici lexplication de la division de la RAM en deux banques.

En effet, il faudra bien trouver une solution pour remplacer le bit manquant. Vous avez dit
un bit dun des registres ? BRAVO, vous avez tout compris. Il sagit en ralit du bit RP0
du registre STATUS.

Ah, vous avez remarqu quil y a un RP1 ? Et oui, le 16F877 a 4 banques. Vous veillerez
laisser RP1 0 pour la 16F84, afin de pouvoir porter votre programme sans problme
vers une PIC suprieure.

6.2.2 Les instructions orientes bits

Ce sont des instructions destines manipuler directement des bits dun registre
particulier. Elles sont codes de la manire suivante :

- 4 bits pour linstruction (dans lespace rest libre par les instructions prcdentes)

- 3 bits pour indiquer le numro du bit manipuler (bit 0 7 possible), et de nouveau 7 bits
pour indiquer loprande.




17

6.2.3 Les instructions gnrales

Ce sont les instructions qui manipulent des donnes qui sont codes dans linstruction
directement. Nous verrons ceci plus en dtail lorsque nous parlerons des modes dadressage.
Elles sont codes de la manire suivante :

- Linstruction est code sur 6 bits

- Elle est suivie dune valeur IMMEDIATE code sur 8 bits (donc de 0 255).

6.2.4 Les sauts et appels de sous-routines

Ce sont les instructions qui provoquent une rupture dans la squence de droulement
du programme. Elles sont codes de la manire suivante :

- Les instructions sont codes sur 3 bits

- La destination code sur 11 bits

Nous pouvons dj en dduire que les sauts ne donnent accs qu 2K de mmoire
programme (2
11
).

Rappelez-vous que lespace mmoire programme est de 1Kmots. Pour coder une adresse
de saut lintrieur de la mmoire programme, il faut donc 10 bits (2
10
=1024 =1K).

Par convention, en effet, 1Kbytes correspond 2
10
=1024 octets. Ce qui explique que si
vous avez 16K de mmoire, en ralit vous avez 16*1024 =16384 bytes. Par extension,
1Mbyte =1024 Kbytes, donc 1048576 octets.

Maintenant vous voyez pourquoi vous voyez plus que votre mmoire thorique lors du
test mmoire au dmarrage de votre ordinateur. Une petite parenthse qui na rien voir ici :
les fabricants de disques durs considrent que 1Mbytes =1000000 bytes. Comme Windows
indique la taille en Mbytes de 1048576 bytes, cela vous explique pourquoi la plupart de vos
disques durs semblent plus petits que prvus.
Le tableau suivant prsente les instructions de la famille 16F(C)xxx :


18


Fig5.Le jeux dinstructions de la famille 16F8xx

6.3 Les indicateurs dtat

Ces indicateurs sont indispensables pour la programmation. Il est donc absolument
ncessaire davoir compris leur fonctionnement (du moins pour Z et C).

Lisez donc attentivement ce qui suit. Tous les indicateurs sont des bits du registre
STATUS. Voyez le tableau page 15. Nous aborderons ici les flags Z et C. Les autres seront
traits lors de ltude des registres.

6.3.1 Lindicateur dtat Z

Cest lindicateur Zero, il fonctionne de la manire suivante :

Si le rsultat dune opration POUR LEQUEL IL EST AFFECTE, donne un rsultat
gal 0, le flag Zero passe 1.

Donc, ne vous mlangez pas les pinceaux. Dire si Z =1 correspond dire si
rsultat =0 . Le tableau de la figure 5, colonne 5 vous indique les instructions qui modifient
Z.
19
Donc, si vous faites une addition avec ADDWF et que le rsultat obtenu est 0, le bit Z
sera 1. Si le rsultat est <>0 (diffrent de 0), le bit Z vaudra 0. Dans les 2 cas il est modifi.

Par contre, si vous stockez une valeur avec linstruction MOVWF, le bit Z ne sera pas
modifi, mme si la valeur vaut 0. Ces remarques sont valables pour les autres flags.

6.3.2 Lindicateur dtat C

Cest lindicateur pour Carry (report). Si le rsultat dune opration entrane un
dbordement, le bit C sera positionn. Il sagit en fait du 9
me
bit de lopration.

Petit exemple :

Si vous ajoutez B11111110 (254)
+ B00000011 (3)
Vous obtenez B100000001, (257) donc 9 bits.

Comme les registres de la PIC ne font que 8 bits, vous obtiendrez B00000001 (1) et
C positionn 1 (en fait le 9
me
bit, donc le bit 8, donc 2
8
=256). Donc le rsultat final est de
256 +1 =257.

Remarquez que si vous aviez ajout B11111110 et B00000010, vous auriez obtenu
B00000000.

Dans ce cas, vous auriez eu C 1 ET Z 1, ce qui signifie rsultat nul, mais avec
report (donc rsultat =256).

Les autres bits du registre dtat seront vus plus loin.

7- Organisation dun fichier .asm

On utilisera pour ldition dun fichier .asm lditeur de MPLAB. MPLAB est
loutil logiciel gratuit fournit par MICROCHIP pour ldition, la compilation et la simulation
dun programme en assembleur.
Tout dabord, cliquez nimporte o lintrieur dun fichier asm quelconque. Vous
tes lintrieur dun simple traitement de texte. Dans le coin infrieur gauche, vous verrez
un numro de ligne et de colonne. Cest la position actuelle de votre curseur. Nous nous
servirons de cette position pour vous guider. Najoutez donc pas de lignes pour linstant, pour
garder la correspondance correcte avec ce texte.

Si vous narrivez pas effectuer des modifications dans votre fichier, et que votre
clavier semble inactif, cest que vous avez utilis un caractre tendu dans le nom de votre
fichier. MPLAB est allergique certains caractres, comme le .


7.1 Les commentaires

Au dbut du fichier on trouve gnralement un grand cadre. Si vous remarquez
attentivement le premier caractre de chaque ligne, vous verrez le symbole ; . Tout ce qui
20
suit tant considr comme zone de commentaire, vous pouvez y mettre tout ce que vous
voudrez.

Prenez lhabitude de toujours commenter vos programmes. Soyez sr que dans 6
mois, vous ne vous rappellerez plus ce que vous avez voulu faire, les commentaires vous
seront alors dune grande utilit si vous dcidez de modifier votre programme.On prendra
lexemple du fichier <<Ledcli.asm>>qui fera le sujet de notre premier programme.

7.2 Les directives

A la ligne 8, nous trouvons une DIRECTIVE destine MPASM pour indiquer quel
type de processeur est utilis dans ce programme.

Les DIRECTIVES ne font pas partie du programme, elles ne sont pas traduites en
OPCODE, elles servent indiquer lassembleur de quelle manire il doit travailler. Ce sont
donc des COMMANDES destines lassembleur en lui-mme.

Au contraire, les INSTRUCTIONS seront traduites en OPCODE et charges dans le
PIC. Il est donc impratif de bien faire la distinction.


7.3 les fichiers include

La ligne 9 signale lassembleur que les ASSIGNATIONS sont dans le fichier
P16F84.inc. Que contient ce fichier ? Et bien tout simplement la valeur de toutes les
CONSTANTES que nous allons utiliser. Pour voir ce quil contient, allez dans le menu
file ->Open , choisissez all files dans le cadre infrieur, et ouvrez p16F84.inc. Une fois
dpasse la zone de commentaires, vous verrez des lignes du style :

FSR EQU H'0004'

Cette ligne signifie tout simplement que FSR EGAL 0x0004. Autrement dit, lorsque
vous utiliserez FSR dans une instruction, MPASM interprtera FSR comme tant 0x04. 0x04
tant tout simplement ladresse de FSR dans la mmoire du PIC.

H0004 est une autre mthode autorise pour exprimer un nombre hexadcimal, tout
comme 04h

Si vous prenez votre tableau 4-2 page 13, vous constaterez que cest bien le cas. Ce
fichier est donc principalement destin vous viter davoir mmoriser toutes les adresses,
un nom est bien plus simple utiliser. Fermez le fichier p16F84.inc pour ne pas encombrer
votre fentre.

7.4 La directive _CONFIG

La ligne suivante, commence par __CONFIG . Cette ligne contient les fameux
fusibles qui fixent le fonctionnement du PIC.

Les valeurs crites ici seront intgres dans le fichier .hex pour signaler au
programmateur les valeurs encoder aux adresses spcifiques du PIC. Nous y reviendrons.
21
On trouve dans le fichier toutes les valeurs possibles de ces paramtres, avec les
explications correspondantes. Il suffit de remplacer une des valeurs par celle souhaite.
Par exemple, activons le Code Protect (protection en lecture) :

On remplacera donc simplement la ligne :

__CONFIG _CP_OFF & _WDT_ON & _PWRTE_ON & _HS_OSC

Par

__CONFIG _CP_ON & _WDT_ON & _PWRTE_ON & _HS_OSC

Faites-le. Remarquez que les diffrentes valeurs sont lies par le symbole &
(AND). Ils fonctionnent donc en plaant des bits 0 , si vous avez tout suivi. Les valeurs
exactes sont de nouveau dans le fichier P16F84.INC .

7.5 Les assignations

A la ligne 30, vous trouverez des ASSIGNATIONS personnelles qui fonctionnent
selon le mme principe que dans le fichier .inc .

A quoi cela sert-il ? Et bien faciliter la MAINTENANCE de votre programme. Il est
en effet plus simple de retenir dans votre programme la valeur MASQUE que de
manipuler la valeur 0x5B.

Les assignations se comportent comme une simple substitution. Au moment de
lassemblage, chaque fois que lassembleur va trouver une assignation, il la remplacera
automatiquement par sa valeur.

Un autre avantage est que si vous remplacez la valeur dune assignation, le
changement sera effectif pour tout le programme. Vous ne risquez donc pas doublier des
valeurs en chemin.

Il est vivement conseill dutiliser les ASSIGNATIONS et autres mthodes que nous
allons voir plus bas. La syntaxe est simple puisquil sagit de EQU (gal )
Exemple dassignation :

mavaleur EQU 0x05


7.6 Les dfinitions

Descendons encore un peu. Nous dcouvrons, lignes 38 et 39 des exemples de
DEFINE. Sachez que les define fonctionnent comme des ASSIGNATIONS. A ceci prs
que nous rserverons les assignations pour les valeurs, et les dfinitions pour remplacer un
texte plus complexe.

Par exemple nous pourrons utiliser un PORT suivi dun numro de bit, ou bien
carrment une instruction avec ses paramtres.

22
Une dfinition est construite de la manire suivante : La directive #DEFINE, suivie
par le nom que lon dsire utiliser, puis la chane substituer. Par exemple :

#DEFINE monbit PORTA, 1

7.7 Les macros

Plus bas, lignes 46 52, nous trouvons les MACRO.
La macro se compose dun nom crit en premire colonne, suivi par la directive macro .
Commence alors la ligne suivant la portion de code qui constitue la macro. La fin de la
macro est dfinie par la directice endm) (end of macro).

Une macro remplace donc un morceau de code que nous utilisons souvent. La macro
fonctionne galement uniquement comme un simple traitement de texte.

La macro simplifie donc lcriture, mais ne raccourci pas la taille du fichier .hex
obtenu, puisque les 2 lignes seront crites dans le PIC.

Notez que lon peut utiliser des macros plus complexes, avec passage de paramtres,
mais nous nentrerons pas dans ces fonctions particulires pour linstant.

Notez galement que vous disposez dune aide dans le menu help->MPASM Help .
En effet, laide de MPLAB concerne lutilisation du logiciel. Les aides concernant le langage
sont dans MPASM, puisque cest ce langage que MPLAB utilise (revoyez ldition des
nuds).

7.8 La zone des variables

Toute zone dfinie par lutilisateur commence avec la DIRECTIVE CBLOCK, suivie
par ladresse du dbut de la zone.

Pour placer nos variables, qui sont des emplacements mmoires auxquels on a donn
un nom, nous consultons de nouveau le tableau 4-2. Nous voyons que la zone RAM librement
utilisable commence l'adresse 0x0C. Notre zone de variable contiendra donc la directive

CBLOCK 0x00C ; dbut de la zone variables

Ensuite, vous pouvez utiliser 68 emplacements mmoire, qui rpondront la syntaxe
suivante : nom de la variable suivi du signe : suivi de la taille utilise.
Par exemple :

w_temp :1 ; Zone de 1 byte
montableau : 8 ; zone de 8 bytes

Ensuite, vous devrez prciser la fin de la zone en cours laide de la directive :

ENDC ; Fin de la zone

23

7.9 Les tiquettes

Vous trouverez dans les programmes en 1ere colonne ce que nous appellerons des
ETIQUETTES. Ce sont des noms que vous choisissez et qui sont des REPERES pour le
programme.

Lassembleur les remplacera par ladresse du programme lendroit o elles sont
positionnes. Ceci vous vite de devoir calculer les emplacements programme. Nous en
verrons plus loin le principe.

7.10 La directive ORG

La directive ORG, suivie de ladresse, prcise quelle adresse les instructions qui
suivent seront places dans le PIC. Il est important de savoir 2 choses :

- Aprs un reset ou une mise sous tension, le PIC dmarre toujours ladresse 0x00. Le
dbut de votre programme doit donc se situer l.

- Ladresse 0x04 est ladresse utilise par les interruptions (nous verrons le principe plus
tard). Il ne vous reste donc pas une grande place pour placer votre programme. Nous
commencerons donc par un saut vers lemplacement du programme principal o nous
aurons plus de place. Allons donc voir ligne 70 comment tout ceci fonctionne :

org 0x000 ; Adresse de dpart aprs reset
goto init ; Adresse 0: initialiser

La premire ligne est une DIRECTIVE qui indique que la ligne suivante sera place
ladresse 0x00.

La seconde ligne est une INSTRUCTION, explique page 62 du datasheet, qui indique
au PIC que le programme doit SAUTER ladresse init . init est une ETIQUETTE.

Aprs le reset, le PIC excute donc linstruction goto init qui se trouve ladresse
0x00, suivie par linstruction qui se trouve ladresse init plus bas dans le programme (donc
juste en dessous de ltiquette init).


7.11 La directive END

Cette directive prcise lendroit o doit cesser lassemblage de votre programme. Elle
est obligatoire dans tout programme, sous peine dune erreur qui vous signalera que la fin de
fichier (End Of File) a t atteinte avant de rencontrer la directive END.

Toutes les instructions situes aprs la directive END seront tout simplement ignores.

7.12 Explication des registres fondamentaux

Vous voici prt lancer une simulation. Mais quoi cela pourrait-il vous servir si vous
ne comprenez pas les changements qui vont soprer dans les registres spciaux ? On va donc
24
commencer par vous expliquer les registres de base ncessaires la comprhension du
processus.

7.12.1 Les registres PCL et PCLATH

Un processeur, quel quil soit est un composant qui excute SEQUENTIELLEMENT une
srie dINSTRUCTIONS organises selon un ensemble appel PROGRAMME.

Il existe donc dans le processeur un SEQUENCEUR, cest dire un compteur qui permet
de pointer sur la PROCHAINE instruction excuter. Ce squenceur est appel suivant les
processeurs compteur ordinal , Pointeur de programme etc. Dans le cas des PICs, il
sappelle PC, pour Program Counter. Le PC nest pas accessible directement par lutilisateur.

Le principe de base est toujours le mme. Dans les PICs, les registres ne font que 8 bits,
on ne peut donc stocker quune adresse maximale de 255. Il faudra donc 2 registres pour
accder une adresse. Les PICs ont un fonctionnement un peu particulier ce sujet.

Nous trouvons tout dabord un registre qui contient ladresse basse du PC, cest dire les
8 bits de poids faibles. Ce registre est accessible en lecture et en criture. Il est appel PCL
(PC Low)

Il existe un autre registre de 5 bits qui participe au fonctionnement du squenceur. Il
sappelle PCLATH (PC LATch counter High). Il est accessible en lecture et en criture par
lutilisateur.

Le PC complet tant cod sur 13 bits, il faudra donc complter PCL avec 5 bits
supplmentaires. Il existe deux cas possibles :

- Lors dun saut, par exemple, le contenu du PC est charg directement avec les 11 bits de
destination contenus dans linstruction en elle-mme. Les 2 bits manquants sont extraits
du registre PCLATH. Les bits 3 et 4, qui doivent tre positionns par lutilisateur, sont
placs directement dans les bits 11 et 12 du PC afin de complter ladresse de destination.
Comme la 16F84 ne gre que 1K de mmoire programme, nous naurons pas besoin de ce
registre dans le cas des sauts. Le 16F84 ne gre que 10 des 13 bits du PC.

- En cas de modification du PCL directement par lutilisateur, comme pour un registre
ordinaire, PCL est charg dans PC et complts par les 5 bits du registre PCLATH.
Comme le 16F84 ne traite que 1K de mmoire programme, les bits b2, b3 et b4 de
PCLATH seront inutiliss ici.

Remarquez que la limite du PC est de 13 bits, ce qui implique que les PICs de la
famille mid-range auront une capacit de mmoire programme de 8K mots maximum (soit
2
13
).

Il est trs important de se rappeler que le PC pointe toujours sur linstruction suivante,
donc linstruction qui nest pas encore excute. Cest indispensable de bien comprendre ceci
pour analyser les programmes en cours de debbuggage.
25


7.12.2 Le registre W

Ce registre est un registre utilis par les pics pour raliser toutes sortes de calculs. Dans
une instruction la destination dun rsultat (d) peut en gnral tre un emplacement RAM (f)
ou le registre de travail (w). Cest un donc un registre fondamental.

7.12.3 Le registre STATUS

Cest un registre dont chaque bit a une signification particulire. Il est principalement
utilis pour tout ce qui concerne les tests. Il est donc galement dune importance
fondamentale. Il est dcrit dans le tableau de la page 15 du datasheet..

Voici les diffrents bits qui le composent, en commenant par le bit0 (b0), donc le bit le
plus droite, ou encore le moins significatif. Remarquez quon utilise le terme LSB, parfois
comme byte le moins significatif, parfois comme bit le moins significatif. Cest galement un
abus de langage, mais le contexte permet trs bien de les distinguer.

b0 : C Carry (report) Ce bit est en fait le 9
me
bit dune opration.
Par exemple, si une addition de 2 octets donne une valeur
>255 (0xFF), ce bit sera positionn.
b1 : DC Digit Carry Ce bit est utilis principalement lorsque lon travaille
avec nombres BCD : il indique un report du bit 3 vers le
bit 4. Pour info, un nombre BCD est un nombre dont
chaque quartet reprsente un chiffre dcimal. Nous
naborderons pas ce principe ici.
b2 : Z Zero Ce bit est positionn 1 si le rsultat de la dernire
opration vaut 0. Rappelez-vous cependant que ces flags
ne sont positionns que pour les instructions qui le
prcisent (Status bit affected).
b3 : PD Power down Indique quel vnement a entraner le dernier arrt du
PIC (instruction sleep ou dpassement du temps du
watchdog). Nous y reviendrons plus tard. En ralit, vous
verrez que PD est surmont dune petite barre qui
signifie : actif ltat bas. Donc que 0 =bit valid.
Les inversions sont en italique
b4 : TO Time-Out bit Ce bit indique (si 0), que la mise en service suit un arrt
provoqu par un dpassement de temps ou une mise en
sommeil. Dans ce cas, PD effectue la distinction.
b5 : RP0 Register Bank Select0 Permet dindiquer dans quelle banque de RAM on
travaille.0 =banque 0.
b6 : RP1 Register Bank Select1 Permet la slection des banques 2 et 3. Inutilis pour la
16F84, doit tre laiss 0 pour garantir la compatibilit
ascendante (portabilit du programme).
B7 : IRP Indirect RP Permet de dcider quelle banque on adresse dans le cas
de ladressage indirect (que nous verrons plus tard).

26

8- Les modes dadressage

Les instructions utilisent toutes une manire particulire daccder aux informations
quelles manipulent. Ces mthodes sont appeles modes dadressage .

On va simplement donner un petit exemple concret de ce quest chaque mode
dadressage. Supposons que vous vouliez mettre de largent dans votre poche :


8.1 Ladressage littral ou immdiat

Avec l ADRESSAGE IMMEDIAT ou ADRESSAGE LITTERAL, vous pouvez dire :
on mets 100D en poche. La valeur fait IMMEDIATement partie de la phrase. Pas besoin
dun autre renseignement.

Exemple

Movlw 0x55 ; charger la valeur 0x55 dans W

8.2 Ladressage direct

Avec l ADRESSAGE DIRECT, vous pouvez dire : on va mettre le contenu du coffre
numro 10 dans notre poche. Ici, lemplacement contenant la valeur utile est donn
DIRECTement dans la phrase. Mais il faut dabord aller ouvrir le coffre pour savoir ce que
lon va effectivement mettre en poche. On ne met donc pas en poche le numro 10, mais ce
quil contient.

Exemple

Movf 0x10 , W ; charger le contenu de lemplacement 0x10 dans W

8.3 Ladressage indirect

Avec l ADRESSAGE INDIRECT, vous pouvez dire :

Le prpos du guichet numro 3 va me donner le numro du coffre qui contient la
somme quon va mettre en poche.

Ici, vous obtenez le numro du coffre INDIRECTement par le prpos au guichet.
Vous devez donc allez demander ce prpos quil vous donne le numro du coffre que vous
irez ouvrir pour prendre largent. On ne met donc en poche, ni le numro du prpos, ni le
numro du coffre que celui-ci va vous donner. Il y a donc 2 oprations pralables avant de
connatre la somme que vous empocherez.

Cet adressage fait appel 2 registres, dont un est particulier, car il nexiste pas vraiment.
Examinons-les donc :

27

8.3.1 Les registres FSR et INDF

Ceux qui suivent sont dj en train de chercher dans le tableau 4-2 aprs INDF.

INDF signifie INDirect File. Vous le voyez maintenant ? Et oui, cest le fameux
registre de ladresse 0x00. Ce registre nexiste pas vraiment, ce nest quun procd daccs
particulier FSR utilis par le PIC pour des raisons de facilit de construction lectronique
interne.

Le registre FSR est ladresse 0x04 dans les 2 banques. Il nest donc pas ncessaire de
changer de banque pour y accder, quelle que soit la banque en cours dutilisation.

Dans lexemple schmatique prcdent, le prpos au guichet, cest le registre FSR.
Ladressage indirect est un peu particulier sur les PICS, puisque cest toujours la mme
adresse que se trouvera ladresse de destination. Comment cela se passe-t-il ?

- Premirement, nous devons crire ladresse pointe dans le registre FSR.
- Ensuite, nous accdons cette adresse pointe par le registre INDF.

On peut donc dire que INDF est en fait le registre FSR utilis pour accder la case
mmoire. Donc, quand on veut modifier la case mmoire pointe, on modifie FSR, quand on
veut connatre ladresse de la case pointe, on accde galement FSR. Si on veut accder au
CONTENU de la case pointe, on accde via INDF. Nous allons voir tout ceci par un petit
exemple, mais avant,

ATTENTION

Le contenu du registre FSR pointe sur une adresse en 8 bits. Or, sur certaines PICs, la
zone RAM contient 4 banques (16F877). Ladresse complte est donc une adresse sur 9 bits.
Ladresse complte est obtenue, en adressage DIRECT, par lajout du bit 7 et 8 sous forme de
RP0et RP1 (RP1 est inutilis pour le 16F84 car seulement 2 banques) et par lajout du bit
IRP dans le cas de ladressage INDIRECT (inutilis sur le 16F84). Veillez donc toujours
laisser IRP (dans le registre STATUS) et RP1 0 pour assurer la portabilit de votre
programme.

Exemple

movlw 0x50 ; chargeons une valeur quelconque
movwf mavariable ; et plaons-la dans la variable mavariable

movlw mavariable ; on charge lADRESSE de mavariable, par
; exemple, dans les leons prcdentes, ctait
; 0x0e. (W) =0x0E
movwf FSR ; on place ladresse de destination dans FSR.
; on dira que FSR POINTE sur mavariable
movf INDF,w ; charger le CONTENU de INDF dans W.

LE CONTENU DE INDF EST TRADUIT PAR LE PIC COMME ETANT LE
CONTENU DE LEMPLACEMENT MEMOIRE POINTE PAR FSR (W) =0X50
28
8.4 Quelques exemples

On va rpter, mais les modes dadressages doivent imprativement tre compris. Pour
les habitus des processeurs divers, excusez ces rptitions. Les registres sont intialiss avec
les valeurs prcdentes.

movlw mavariable

Cest de ladressage immdiat ou littral ; donc on charge la VALEUR de mavariable,
ce qui correspond en ralit son ADRESSE. Donc 0x0E est plac dans (W). Ceci se
reconnat au l de linstruction movlw

movf mavariable , w

Cette fois, cest de ladressage DIRECT, donc, on va ladresse mavariable voir ce
quil y a lintrieur. On y trouve le CONTENU de mavariable, donc (w) =0x50 (dans notre
exemple).

movf INDF , w

Maintenant, cest de ladressage INDIRECT. Ce mode dadressage se reconnat
immdiatement par lutilisation du registre INDF. Le PIC va voir dans le registre FSR, et lit
ladresse contenue, dans ce cas 0X0E. Elle va ensuite dans lemplacement vis, et lit le
CONTENU. Donc, dans (W) on aura le contenu de 0x0E, soit 0x50.

movf FSR , w

Ceci est un pige. Cest en effet de ladressage DIRECT. On placera donc dans (W) le
CONTENU du registre FSR, donc 0X0E sera mis dans (W).

9- Ralisation dun programme embarqu

9.1 Edition du fichier source

Compltez le cadre den-tte suivant votre dsir. Vous trouverez ci-dessous un
exemple. Prenez lhabitude de toujours documenter vos programmes. Ce nest pas un luxe,
cest impratif pour une maintenance efficace dans le temps.

;*********************************************************************************
; PROGRAMME DE CLIGNOTEMENT D'UNE LED CONNECTEE SUR LE PORTA.2 *
; D'UN PIC16F84. PROGRAMME D'ENTRAINEMENT AU FONCTIONNEMENT *
; DES PICS.LA FREQUENCE DE CLIGNOTTEMENT EST DE 1 HZ (avec un quartz de 4MHz)*
;*********************************************************************************

9.2 Choix de la configuration

Plus bas dans le fichier, vous trouverez ceci :

__CONFIG _CP_OFF & _WDT_ON & _PWRTE_ON & _XT_OSC

29
; '__CONFIG' prcise les paramtres encods dans le processeur au moment de
; la programmation du processeur. Les dfinitions sont dans le fichier include.
; Voici les valeurs et leurs dfinitions :

; _CP_ON Code protection ON : impossible de relire
; _CP_OFF Code protection OFF
; _PWRTE_ON Timer reset sur power on en service
; _PWRTE_OFF Timer reset hors-service
; _WDT_ON Watch-dog en service
; _WDT_OFF Watch-dog hors service
; _LP_OSC Oscillateur quartz basse consommation
; _XT_OSC Oscillateur quartz moyenne vitesse ou externe
; _HS_OSC Oscillateur quartz grande vitesse
; _RC_OSC Oscillateur rseau RC
On inclus les commentaires dans le fichier de faon ce quil soit plus rapidement
modifiables sans devoir recourir au datasheet.

Remarquez quon effectue un AND (&) entre les diffrentes valeurs, les niveaux actifs
sont donc des niveaux 0

Le premier paramtre prcise si votre PIC sera protge ou non contre la lecture la
fin de la programmation. Laissez ici ce paramtre sur CP_OFF =non protge.

Le second paramtre prcise si le chien de garde (watchdog) est mis ou non en
service. Dans un premier temps, remplacez WDT_ON par WDT_OFF pour le mettre hors-
service.

Ensuite, laissez PWRTE sur ON pour prciser que vous utilisez un reset scuris ,
donc avec un allongement du temps avant dmarrage. Ceci vous met labri des alimentations
un peu lentes dmarrer.

Enfin, vient le fonctionnement de loscillateur que vous allez utiliser. Le tableau 8-1
page 40 donne les valeurs recommandes en fonction des frquences utilises pour un PIC de
10MHz. Retenez que la valeur _HS_OSC convient pour les frquences leves. Sinon utiliser
XT_OSC pour les frquences 4MHz.
Il est important de ne pas utiliser _RC_OSC si on utilise un quartz. Ce paramtre est
rserv un fonctionnement par rseau R/C tel que dessin figure 8-7 page 41.

LE FAIT DUTILISER LE PARAMETRE RC AVEC UNE HORLOGE
EXTERNE PEUT ENTRAINER LA DESTRUCTION DU PIC.

Mme, si en pratique, les PICs sont des composants trs solides, vitez de vous
tromper ce niveau. Et voil, vous connaissez parfaitement _Config. Vous avez maintenant la
ligne suivante :

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

30


9.3 Le registre OPTION

Si vous regardez le tableau 4-2, vous constaterez que ce registre se trouve ladresse
0x81, donc dans la banque1. Dans les fichiers include de MPLAB, ce registre est dclar avec
le nom OPTION_REG.

Cest donc ce nom que vous devrez utiliser. Nous allons le dtailler ici. Ce registre est un
registre de bits, cest dire que chaque bit a un rle particulier :
Le tableau de la page 16 reprsente le contenu de ce registre :

b7 : RBPU

Quand ce bit est mis 0 (actif niveau bas en italique), une rsistance de rappel au +5
volt est place sur chaque pin du PORTB.

b6 : INTEDG

Donne, dans le cas o on utilise les interruptions sur RB0, le sens de dclenchement de
linterruption. Si b6 =1, on a interruption si le niveau sur RB0 passe de 0 vers 1. Si b6 =0,
linterruption seffectuera lors de la transition de 1 vers 0.

b5 : TOCS

Ce bit dtermine le fonctionnement du timer0, que nous verrons bientt. Retenez que
le timer0 est incrment soit en fonction de lhorloge interne (synchronis au programme),
dans ce cas b5 =0, soit il compte les impulsions reues sur la pin RA4, dans ce cas b5=1.

Comme ce dernier mode ncessite un circuit de gnration de pulses externe, nous
utiliserons pour le timer0 lhorloge interne, donc b5 =0

b4 : TOSE

Donne, pour le cas ou le bit 5 serait 1, le sens de la transition qui dtermine le
comptage de tmr0. Si b4 =1, on a comptage si le signal passe de 5V 0V sur RA4, si on a b4
=0, ce sera le contraire.

Comme nous avons plac b5=0, b4 est alors inutilis. Nous laisserons donc b4 =0.

b3 : PSA

Nous avons dans le PIC un prdiviseur. Quest-ce que cest ? Et bien tout simplement,
ceci indique le nombre de pulses qui devra tre reu pour provoquer une incrmentation de la
destination. Nous y reviendrons en dtail avec le fonctionnement du tmr0.

A ce niveau, sachez simplement que ce prdiviseur peut servir une des deux
fonctions suivantes (et pas les deux) : soit il effectue une prdivision au niveau du timer du
watchdog (b3 =1), soit il effectue une prdivision au niveau du tmr0 (timer0) (b3=0). Dans
notre cas, mettez b3 =1 (nous verrons ci-dessous pourquoi).
31

b2, b1,b0 : PS2,PS1,PS0

Ces trois bits dterminent la valeur de prdivision pour le registre dtermin ci-dessus. Il y
a donc 8 valeurs possibles, montres dans le petit tableau de la page 16.

Remarquez que les valeurs sont diffrentes pour le watchdog et pour tmr0. En effet, il ny
a pas de division par 1 pour ce dernier registre.

Si vous dsirez ne pas utiliser de prdiviseur du tout, la seule mthode est de mettre b3=1
(prdiviseur sur watchdog) et PS2 PS0 0. Dans ce cas : pas de prdiviseur sur tmr0, et
prdiviseur 1 sur watchdog, ce qui correspond pas de prdiviseur non plus. Nous mettrons
donc b2=b1=b0=0.

9.4 Edition du programme

Nous utiliserons donc la valeur B00001000 pour notre programme dessai, soit 0x08.
Il faut avoir lhabitude de ne pas traner des valeurs fixes travers mes programmes, afin den
faciliter la maintenance. On place ces valeurs en dbut de programme en utilisant des
assignations.

Lassignation est dj cre plus bas dans le programme. On a cr une
CONSTANTE quon a appel OPTIONVAL et qui contiendra la valeur placer plus tard
dans le registre OPTION_REG. On rappelle que les CONSTANTES noccupent pas de place
dans le PIC, elles sont simplement remplaces par lassembleur au moment de la
compilation. Elles servent faciliter la lecture du programme.

Cherchez donc plus bas dans le programme aprs les assignations, et remplacez la
valeur affecte OPTIONVAL par celle que nous avons trouve et ajoutez vos commentaires.
Supprimez lassignation concernant INTERMASK, car nous ne nous servirons pas des
interruptions dans ce premier programme. Dans la zone des assignations, il vous reste donc
ceci :


;*********************************************************************
; ASSIGNATIONS *
;*********************************************************************

OPTIONVAL EQU H'0008 ; Valeur registre option
; Rsistance pull-up ON
; Pas de prscaler

Descendons encore jusqu la zone des dfinitions. Nous allons donner un nom notre
bouton-poussoir et notre LED. Les instructions bcf et bsf que nous allons utiliser pour
mettre ou lire des 1 ou des 0 dans les registres ont la syntaxe suivante bsf f, n et comme le
registre daccs sappelant PORTA (pour le port A) et PORTB (pour le port B), nous
utiliserons des DEFINE permettant dintgrer f et n en mme temps.

32
Nous voyons sur le schma que la LED est connecte sur le bit 2 du port A. Le
bouton-poussoir est connect sur le bit 2 du port B. Nous effaons donc les dfinitions de
lexemple, et nous les remplaons par les ntres. Nous obtenons alors ceci :
;*********************************************************************
; DEFINE *
;*********************************************************************

#DEFINE LED PORTA,2 ; Led rouge
#DEFINE BOUTON PORTB,2 ; bouton-poussoir

Notez que LED et BOUTON sont des noms que nous avons librement choisis,
condition quil ne sagisse pas dun mot-cl. Pas question par exemple dutiliser STATUS ou
encore MOVLW, bien que ces exemples soient tirs par les cheveux, cela pourrait vous
arriver un jour dutiliser un mot rserv par inadvertance.

A quoi servent les dfinitions ? Et bien supposons que vous dcidez de connecter la
LED sur le PORTB bit 1 (RB1), par exemple. Et bien, nul besoin de rechercher partout dans
le programme, il suffira de changer dans la zone DEFINE.

On descend encore un peu, et on arrive dans la zone des macros. Nous nen avons pas
vraiment besoin ici, mais nous allons quand mme les utiliser titre dexemple.
Effacez la macro donne titre dexemple et entrons celles-ci.

;*********************************************************************
; MACRO *
;*********************************************************************

LEDON macro
bsf LED
endm

LEDOFF macro
bcf LED
endm

La premire colonne donne le nom de la macro (ici, 2 macros, une LEDON et une
LEDOFF). La directive macro signifie dbut de la macro la directive endm signifie fin de la
macro. Notez que les macros peuvent videmment comporter plusieurs lignes de code.

Prenons notre exemple : quand nous utiliserons la ligne suivante dans notre
programme (attention, ne pas mettre la macro en premire colonne) :

LEDON

Au moment de la compilation, notre assembleur remplacera LEDON par :

bsf LED

Il remplacera galement LED par PORTA,2. Ce qui fait quen ralit nous obtiendrons :

33
bsf PORTA , 2

Nous avons donc obtenu une facilit dcriture et de maintenance. Gardez lesprit
que les macros sont des simples substitutions de traitement de texte. Si votre macro se
compose de 50 lignes de code, les 50 lignes seront copies dans le PIC chaque appel de la
macro.
Nous arrivons dans la zone des variables. Nous ajouterons celles-ci au fur et mesure
de leur ncessit. Effacez donc les 2 variables prsentes, car elles sont utilises dans les
routines dinterruption que nous nutiliserons pas ici.

;*********************************************************************
; DECLARATIONS DE VARIABLES *
;*********************************************************************

CBLOCK 0x00C ; dbut de la zone variables


ENDC ; Fin de la zone

A lORG 0x00, laissons lappel vers la routine dinitialisation. Tout programme
comporte en effet une tape dinitialisation des variables et des registres. Prenez lhabitude de
sparer cette initialisation du reste du programme.

Comme nous nutiliserons pas les interruptions, supprimez tout ce qui suit jusqu la routine
dinitialisation, vous obtenez :

**********************************************************************
; DEMARRAGE SUR RESET *
;**********************************************************************

org 0x000 ; Adresse de dpart aprs reset
goto init ; Adresse 0: initialiser

;*********************************************************************
; INITIALISATIONS *
;*********************************************************************
suite du programme

A ce stade, avant de poursuivre, nous allons tudier les registres dont nous allons nous
servir, et tout dabord :

9.5 Le registre PORTA

Ce registre est un peu particulier, puisquil donne directement accs au monde extrieur.
Cest en effet ce registre qui reprsente limage des pins RA0 RA4, soit 5 pins. Si vous
suivez toujours, cest ce registre qui va servir allumer la LED.

Ce registre se situe ladresse 05H, dans la banque0. Chaque bit de ce registre reprsente
un pin. Donc, seuls 5 bits sont utiliss. Pour crire sur un pin en sortie, on place le bit
correspondant 1 ou 0, selon le niveau souhait.
34
Par exemple :
bsf PORTA , 1 ; envoyer niveau 1 sur RA1

place un niveau +5V sur la pin RA1. Notez quil faut pour cela que cette pin soit
configure en sortie (voir TRISA). Pour tester une entre, on pourra par exemple utiliser

btfss PORTA,3 ; tester RA3 et sauter si vaut 5V

9.6 Le registre TRISA

Ce registre est situ la mme adresse que PORTA, mais dans la banque 1. Son adresse
complte sur 8 bits est donc 0x85.

Ce registre est dun fonctionnement trs simple et est li au fonctionnement du PORTA.

Chaque bit positionn 1 configure le pin correspondant en entre. Chaque bit 0
configure le pin en sortie.

Au reset du PIC, tous les pins sont mis en entre, afin de ne pas envoyer des signaux non
dsirs sur les pins. Les bits de TRISA seront donc mis 1 lors de chaque reset.
Notez galement que, comme il ny a que 5 pins utilises sur le PORTA, seuls 5 bits
(b0/b4) seront utiliss sur TRISA.

9.7 Les registres PORTB et TRISB

Ces registres fonctionnent exactement de la mme manire que PORTA et TRISA, mais
concernent bien entendu les 8 pins RB. Tous les bits sont donc utiliss dans ce cas.

Voyons maintenant les particularits du PORTB. Nous en avons dj vu une, puisque
les entres du PORTB peuvent tre connectes une rsistance de rappel au +5V de manire
interne.

La slection seffectuant par le bit 7 du registre OPTION. Le schma interne visible
figures 5-3 et 5-4 page 23 (datasheet) vous montre que les bits b0 et b4/b7 peuvent tre
utiliss comme source dinterruption, le bit 0 peut de plus tre utilis de manire autonome
pour gnrer un autre type dinterruption.

Note :

Aprs un reset, vous vous demandez peut-tre quel est ltat de tel ou tel registre.
Vous trouverez ces explications dans le tableau de la page 14. Vous voyez quaprs un reset,
le registre OPTION_REG a tous ses bits 1. Vous devez donc spcifier leffacement du bit7
pour valider les rsistances de rappel au +5V.

9.8 Finalisation du programme

Tout dabord, il nous faut une routine de temporisation :
35
;*********************************************************************
; SOUS-ROUTINE DE TEMPORISATION *
;*********************************************************************
;---------------------------------------------------------------------
; Cette sous-routine introduit un retard de 500.000 s.
; Elle ne reoit aucun paramtre et n'en retourne aucun
;---------------------------------------------------------------------
tempo
movlw 2 ; pour 2 boucles
movwf cmpt3 ; initialiser compteur3
boucle3
clrf cmpt2 ; effacer compteur2
boucle2
clrf cmpt1 ; effacer compteur1

boucle1
nop ; perdre 1 cycle
decfsz cmpt1 , f ; dcrmenter compteur1
goto boucle1 ; si pas 0, boucler
decfsz cmpt2 , f ; si 0, dcrmenter compteur 2
goto boucle2 ; si cmpt2 pas 0, recommencer boucle1
decfsz cmpt3 , f ; si 0, dcrmenter compteur 3
goto boucle3 ; si cmpt3 pas 0, recommencer boucle2
return ; retour de la sous-routine

Le programme principal est compos de 5 instructions seulement :

;*********************************************************************
; PROGRAMME PRINCIPAL *
;*********************************************************************

DEBUT
bsf STATUS,RP0
clrf TRISA ; port A en sortie
bcf STATUS,RP0
LEDON ; allumer la LED :
call tempo ; appeler la tempo de 0.5s
LEDOFF ; teindre LED
call tempo ; appeler la tempor de 0.5s
goto DEBUT ; boucler
END ; directive fin de programme

10- Les interruptions

10.1 Quest-ce quune interruption ?

Imaginez une conversation normale. Chaque interlocuteur prend la parole quand vient son
tour de parler. Survient alors un vnement extrieur dont le traitement est urgent. Par
exemple, un piano tombe du 3
me
tage de limmeuble au pied duquel vous discutez. Vous
imaginez bien que votre interlocuteur ne va pas attendre la fin de votre phrase pour vous
36
signaler le danger. Il va donc vous INTERROMPRE durant le cours normal de votre
conversation afin de pouvoir TRAITER IMMEDIATEMENT lEVENEMENT extrieur.
Les interlocuteurs reprendront leur conversation o elle en tait arrive, sitt le danger cart.

Et bien, pour les programmes, cest exactement le mme principe. Votre programme se
droule normalement. Survient un vnement spcifique. Le programme principal est
interrompu (donc, subit une INTERRUPTION), et va traiter lvnement, avant de reprendre
le programme principal lendroit o il avait t interrompu.

Linterruption est donc une RUPTURE DE SEQUENCE ASYNCHRONE, cest dire
non synchronise avec le droulement normal du programme.

Vous voyez ici lopposition avec les ruptures de squences synchrones, provoques par le
programme lui-mme (goto, call, btfss).


10.2 Mcanisme gnral dune interruption

Nous pouvons dire, sans nous tromper de beaucoup, quune routine dinterruption est un
sous-programme particulier, dclench par lapparition dun vnement spcifique. Cela a
lair un peu ardu, mais vous allez voir que cest trs simple.

Voici donc comment cela fonctionne :

- Le programme se droule normalement
- Lvnement survient
- Le programme achve linstruction en cours de traitement
- Le programme saute ladresse de traitement de linterruption
- Le programme traite linterruption
- Le programme saute linstruction qui suit la dernire excute dans le programme
principal.

Il va bien sr de soi que nimporte quel vnement ne peut pas dclencher une
interruption. Il faut que 2 conditions principales soient remplies :

- Lvnement en question doit figurer dans la liste des vnements susceptibles de
provoquer une interruption pour le processeur sur lequel on travaille
- Lutilisateur doit avoir autoriser linterruption, cest dire doit avoir signal que
lvnement en question devait gnrer une interruption.

Organigramme gnral de lexcution dune interruption.









37


Fig 6. Mchanisme gnral dune interruption

Que pouvons-nous dire en voyant cet ordinogramme ? Et bien, nous pouvons dj nous
dire que le programme principal ne sait pas quand il est interrompu, il est donc crucial de lui
remettre ses registres dans ltat o ils taient avant linterruption.

En effet, supposons que linstruction xxx ait positionn un flag (par exemple, le bit
dindicateur Z). Si par malheur, la routine dinterruption a modifi ce bit, le programme ne
pourra pas se poursuivre normalement.

Nous voyons galement que linstruction xxx termine son excution avant de se
brancher sur la routine dinterruption. Une instruction commence nest donc jamais
interrompue.

10.3 Mcanisme dinterruption sur les PICs

Bien entendu, les PICs rpondent au fonctionnement gnral ci-dessus, mais elles ont
galement leurs particularits. Voyons maintenant le principe des interruptions sur les PICs

- Tout dabord, ladresse de dbut de toute interruption est fixe. Il sagit toujours de
ladresse 0x04. Toute interruption provoquera le saut du programme vers cette
adresse.

- Toutes les sources dinterruption arrivant cette adresse, si le programmeur utilise
plusieurs sources dinterruptions, il lui faudra dterminer lui-mme laquelle il est en
train de traiter.


- Les PICs en se connectant cette adresse, ne sauvent rien automatiquement, hormis le
contenu du PC, qui servira connatre ladresse du retour de linterruption. Cest donc
lutilisateur de se charger des sauvegardes.

38
- Le contenu du PC est sauv sur la pile interne (8 niveaux). Donc, si vous utilisez des
interruptions, vous ne disposez plus que de 7 niveaux dimbrication pour vos sous-
programmes. Moins si vous utilisez des sous-programmes dans vos interruption.

- Le temps de raction dune interruption est calcul de la manire suivante : le cycle
courant de linstruction est termin, le flag dinterruption est lu au dbut du cycle
suivant. Celui-ci est achev, puis le processeur sarrte un cycle pour charger ladresse
0x04 dans PC. Le processeur se connecte alors ladresse 0x04 o il lui faudra un
cycle supplmentaire pour charger linstruction excuter. 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 invalides automatiquement lors du saut ladresse 0x04 par
leffacement du bit GIE (que nous allons voir).

- Les interruptions sont remises en service automatiquement lors du retour de
linterruption. Linstruction RETFIE agit donc exactement comme linstruction
RETURN, mais elle repositionne en mme temps le bit GIE.

Fig7. Les interruptions sur les PICs
10.4 Les sources dinterruptions du 16F84

Le 16F84 est trs pauvre ce niveau, puisquelle ne dispose que de 4 sources
dinterruptions possibles (contre 14 pour le 16F877 par exemple). Les vnements
susceptibles de dclencher une interruption sont les suivants :

- TMR0 : Dbordement du timer0 (tmr0). Une fois que le contenu du tmr0 passe de 0xff
0x00, une interruption peut tre gnre.
- EEPROM : cette interruption peut tre gnre lorsque lcriture dans une case
EEPROM interne est termine.
- RB0/INT : Une interruption peut tre gnre lorsque, la pin RB0, encore appele
INTerrupt pin, tant configure en entre, le niveau qui est appliqu est modifi.
39
- PORTB : De la mme manire, une interruption peut tre gnre lors du changement
dun niveau sur une des pins RB4 RB7. Il nest pas possible de limiter linterruption
une seule de ces pins. Linterruption sera effective pour les 4 pins ou pour aucune.

10.5 Le registre INTCON (INTerrupt CONtrol)

Ce registre se situe ladresse 0x0B, dans les 2 banques. Il est donc toujours accessible. Il est
dtaill figure 4-5 page 16. Cest un registre de bits, donc, chaque bit a une fonction
particulire. Voici le dtail de ces bits :

b7 : GIE

Global Interrupt Enable bit. Il permet de valider ou dinvalider toutes les interruptions
dune seule fois. Ce bit correspond donc notre interrupteur de validation gnrale.

b6 : EEIE

Eeprom write complete Interrupt Enable bit. Ce bit permet de valider linterruption de fin
dcriture en eeprom (nous tudierons plus tard le mcanisme dcriture eeprom).

b5 : T0IE

Tmr0 Interrupt Enable bit : Valide linterruption gnre par le dbordement du timer0.

b4 : INTE

INTerrupt pin Enable bit : Valide linterruption dans le cas dune modification de niveau
de la pin RB0.

ATTENTION : rappelez-vous le bit 6 du registre OPTION, qui dtermine quel est le sens
de transition qui provoque linterruption. On pourra donc choisir si cest une transition 0->1
ou 1->0 qui provoque linterruption, mais pas les deux ensemble.

b3 : RBIE

RB port change Interrupt Enable bit : Valide les interruptions si on a changement de
niveau sur une des entres RB4 RB7.

b2 : T0IF

Tmr0 Interrupt Flag bit. Cest un Flag, donc il signale. Ici cest le dbordement du timer0


b1 : INTF

INTerrupt pin Flag bit : signale une transition sur la pin RB0 dans le sens dtermin par
INTEDG du registre OPTION (b6)

b0 : RBIF
Port Interrupt Flag bit : signale quune des entres RB4 RB7 a t modifie.
40

Remarque

Rappelez-vous que les flags ne se remettent pas 0 tout seuls. Cest votre
programme qui doit sen charger, sous peine de rester indfiniment bloqu dans
une routine dinterruption. Nous dirons que ces flags sont des FLAGS REMANENTS

10.6 Particulatit de linstruction RETFIE

A ce niveau de lexpos, une remarque pertinente serait la suivante :
Pourquoi existe-t-il une instruction RETFIE, alors quon pourrait utiliser RETURN ?
Et bien, vous ne pouvez pas interrompre une interruption par une autre. Si ctait le
cas, les sauvegardes des registres W et STATUS seraient cras par une seconde opration
(mais cest possible sur dautres processeurs). Donc, ds que le programme est branch sur
linterruption, le bit GIE est mis 0 automatiquement.

Pour quune nouvelle interruption puisse avoir lieu une fois celle en cours termine, il
faut remettre GIE 1. Ceci est excut automatiquement par RETFIE.


11-Timer0 :

11.1 Les diffrents modes de fonctionnement du timer0 :

Nous avons vu que le timer0 est en fait un compteur. Mais que compte-t-il ? Et bien, vous
avez deux possibilits.

- En premier lieu, vous pouvez compter les impulsions reues sur le pin RA4/TOKI.
Nous dirons dans ce cas que nous sommes en mode compteur

- Vous pouvez aussi dcider de compter les cycles dhorloge du PIC lui-mme. Dans ce
cas, comme lhorloge est fixe, nous compterons donc en ralit du temps. Donc, nous
serons en mode timer .

La slection dun ou lautre de ces deux modes de fonctionnement seffectue par le bit
5 du registre OPTION : T0CS pour Tmr0 Clock Source select bit.

T0CS =1 : Fonctionnement en mode compteur
T0CS =0 : Fonctionnement en mode timer

Dans le cas o vous dcidez de travailler en mode compteur, vous devez aussi prciser
lors de quelle transisition de niveau le comptage est effectu. Ceci est prcis grce au bit 4
du registre OPTION : T0SE pour Timer0 Source Edge select bit.

T0SE =0 : comptage si lentre RA4/TOKI passe de 0 1
T0SE =1 : comptage si lentre RA4/TOKI passe de 1 0

41


11.2 Le registre tmr0

Ce registre, qui se localise ladresse 0x01 en banque0, contient tout simplement la valeur
actuelle du timer0. Vous pouvez crire ou lire tmr0. Si par exemple vous avez configur tmr0
en compteur, la lecture du registre tmr0 vous donnera le nombre dvnements survenus sur le
pin RA4/TOKI.

11.3 Les mthodes dutilisation du timer0

Comment utiliser le timer0, et quelles sont les possibilits offertes ce niveau, voil de
quoi nous allons parler ici.

11.3.1 Le mode de lecture simple

La premire mthode qui vient lesprit est la suivante : Nous lisons le registre tmr0
pour voir ce quil contient. La valeur lue est le reflet du nombre dvnements survenus, en
prenant garde au fait que le tmr0 ne peut compter que jusque 255. En cas de dpassement, le
tmr0 recommence 0. Cest donc vous de grer cette possibilit.
Petit exemple :

Clrf tmr0 ; dbut du comptage
; ici un certain nombre dinstructions
movf tmr0 , w ; charger valeur de comptage
movwf mavariable ; sauver pour traitement ultrieur

11.3.2 Le mode de scrutation du flag

Nous devons savoir ce niveau, que tout dbordement du timer0 (passage de 0xFF
0x00) entrane le positionnement du flag T0IF du registre INTCON. Vous pouvez donc
utiliser ce flag pour dterminer si vous avez eu dbordement du timer0, ou, en dautres
termes, si le temps programm est coul. Cette mthode linconvnient de vous faire perdre
du temps inutilement

Petit exemple :

clrf tmr0 ; dbut du comptage
bcf INTCON , T0IF ; effacement du flag
loop
btfss INTCON , T0IF ; tester si compteur a dbord
goto loop ; non, attendre dbordement
; suite du programme ; oui, poursuivre : 256 vnements couls

Mais vous pourriez vous dire que vous ne dsirez pas forcment attendre 256
incrmentations de tmr0. Supposons que vous dsiriez attendre 100 incrmentations. Il suffit
dans ce cas de placer dans tmr0 une valeur telle que 100 incrmentations plus tard, tmr0
dborde.

exemple
42

movlw 256-100 ; charger 256 100
movwf tmr0 ; initialiser tmr0
bcf INTCON , T0IF ; effacement du flag
loop
btfss INTCON , T0IF ; tester si compteur a dbord
goto loop ; non, attendre dbordement
; suite du programme ; oui, poursuivre : 100 vnements couls

11.3.3 Le mode dinterruption

Cest videmment le mode principal dutilisation du timer0. En effet, lorsque T0IE est
positionn dans le registre INTCON, chaque fois que le flag T0IF passe 1, une interruption
est gnree.

11.3.4 Les mthodes combines

Supposons que vous vouliez, par exemple, mesurer un temps entre 2 impulsions sur le
broche RB0. Supposons galement que ce temps soit tel que plusieurs dbordements du tmr0
puissent avoir lieu. Une mthode simple de mesure du temps serait la suivante :

1) A la premire impulsion sur RB0, on lance le timer 0 en mode interruptions.
2) A chaque interruption de tmr0, on incrmente une variable
3) A la seconde interruption de RB0, on lit tmr0 et on arrte les interruptions
4) Le temps total sera donc (256*variable)+tmr0

On a donc utilis les interruptions pour les multiples de 256, et la lecture directe de tmr0 pour
les units .

11.4 Le prdiviseur

Supposons que nous travaillons avec un quartz de 4MHz. Nous avons donc dans ce cas
(4000000/4) = 1.000.000 de cycles par seconde. Chaque cycle dhorloge dure donc
1/1000000
me
de seconde, soit 1s.

Si nous dcidons dutiliser le timer0 dans sa fonction timer et en mode interruptions.
Nous aurons donc une interruption toutes les 256s, soit peut prs toutes les quarts de
millime de seconde.

Si nous dsirons raliser une LED clignotante une frquence de +- 1Hz, nous aurons
besoin dune temporisation de 500ms, soit 2000 fois plus. Ce nest donc pas pratique.
Nous disposons pour amliorer ceci dun PREDIVISEUR .
Quest-ce donc ? Et bien, tout simplement un diviseur dvnements situ AVANT
lentre de comptage du timer0. Nous pourrons donc dcider davoir incrmentation de tmr0
tous les 2 vnements par exemple, ou encore tous les 64 vnements.

Regardez tableau de la page 16. Vous voyez en bas le tableau des bits PS0 PS2 du
registre OPTION qui dterminent la valeur du prdiviseur.

43
Ces valeurs varient, pour le timer0, entre 2 et 256. Le bit PSA, quand lui, dtermine
si le prdiviseur est affect au timer0 ou au watchdog. Voici un tableau exprimant toutes les
possibilits de ces bits :

PSA PS2 PS1 PS0 /tmr0 /WD Temps tmr0 Temps typique Watchdog
(minimal)
0 0 0 0 2 1 512 s 18 ms (7ms)
0 0 0 1 4 1 1024 s 18 ms (7ms)
0 0 1 0 8 1 2048 s 18 ms (7ms)
0 0 1 1 16 1 4096 s 18 ms (7ms)
0 1 0 0 32 1 8192 s 18 ms (7ms)
0 1 0 1 64 1 16384 s 18 ms (7ms)
0 1 1 0 128 1 32768 s 18 ms (7ms)
0 1 1 1 256 1 65536 s 18 ms (7ms)
1 0 0 0 1 1 256 s 18 ms (7ms)
1 0 0 1 1 2 256 s 36 ms (14 ms)
1 0 1 0 1 4 256 s 72 ms (28 ms)
1 0 1 1 1 8 256 s 144 ms (56 ms)
1 1 0 0 1 16 256 s 288 ms (112 ms)
1 1 0 1 1 32 256 s 576 ms (224 ms)
1 1 1 0 1 64 256 s 1,152 Sec (448 ms)
1 1 1 1 1 128 256 s 2,304 Sec (996 ms)

- PSA PS0 sont les bits de configuration du prdiviseur
- /tmr0 indique la valeur du prdiviseur rsultante sur le timer0
- /WD indique la valeur du prdiviseur rsultante sur le Watchdog
- temps tmr0 indique le temps max entre 2 interruptions tmr0 avec quartz de 4MHz
- Temps watchdog indique le temps typique disponible entre 2 reset watchdog (indpendant
du quartz utilis). La valeur entre parenthses indique le temps minimal, qui est celui
utiliser pour faire face toutes les circonstances.

Remarques importantes :

- Il ny a quun prdiviseur, qui peut tre affect au choix au timer du watchdog (que nous
verrons plus tard) ou au timer0. Il ne peut tre affect aux deux en mme temps.

- Il nexiste pas de prdiviseur =1 pour le timer0. Si vous ne voulez pas utiliser le
prdiviseur, vous devez donc imprativement le slectionner sur le watchdog avec une valeur
de 1.

- La valeur contenue dans le prdiviseur nest pas accessible. Par exemple, si vous dcidez
dutiliser un prdiviseur de 64, et quil y a un moment donn 30 vnements dj
survenus, vous navez aucun moyen de le savoir. Le prdiviseur limite donc la prcision
en cas de lecture directe.

- Lcriture dans le registre tmr0 efface le contenu du prdiviseur. Les vnements survenus
au niveau du prdiviseur sont donc perdus.

44
12- Les accs en mmoire eeprom

Ce paragraphe dcrit laccs dans leeprom interne du PIC. Il ne faut pas confondre
ceci avec lcriture dans une eeprom externe type 2416. Pour ce type deeprom, il suffit de
suivre les directives du datasheet du composant concern.

12.1 Taille et localisation de la mmoire eeprom

Ladresse physique de la zone eeprom commence, pour les PICs mid-range, ladresse
0x2100. Cette adresse se situe hors de lespace dadressage normal des PICs, donc nous
pouvons dj en dduire quil nous faudra utiliser une procdure spciale pour y accder.

Notez dj que si ces emplacements ne sont pas accessibles directement par le
programme, par contre ils le sont au moment de la programmation. Vous pourrez donc
initialiser votre zone eeprom au moment de programmer votre composant.

Ceci est galement vrai pour des registres spciaux des PICs. Par exemple, ladresse
0x2007 contient les paramtres que vous crivez dans _CONFIG. Vous pourriez donc
remplacer cette directive par une initialisation directe ladresse 0x2007. Nous vous le
dconseillons cependant pour des raisons de portabilit et dvolution rapide vers une autre
famille de PICs.

De mme, ladresse 0x2006 contient lidentification du composant. Cest ainsi quun
programmateur volu peut faire la distinction entre une 16F84 et une 16F84A, car leur
identification constructeur diffre.

La 16F84 dispose de 64 emplacements eeprom disponibles pour votre libre usage. Nous
allons voir comment les utiliser.

12.2 Le registre EEDATA

Cest dans ce registre que va transiter la donne crire vers ou la donne lue en
provenance de leeprom. Ce registre est situ ladresse 0x08 banque0.

12.3 Le registre EEADR

Dans ce registre, situ ladresse 0x09 banque0, nous allons prciser sur 8 bits ladresse
concerne par lopration de lecture ou dcriture en eeprom. Nous voyons dj que pour cette
famille de PICs, nous ne pourrons pas dpasser 256 emplacements deeprom. Pour la 16F84,
la zone admissible va de 0x00 0x3F, soit 64 emplacements.

12.4 Le registre EECON1

Ce registre, situ ladresse 0x88 en banque1, contient 5 bits qui dfinissent ou indiquent
le fonctionnement des cycles de lecture/criture en eeprom. Voici son contenu :

bits 7/6/5

non utiliss

45
bit 4 : EEIF

Eeprom write operation Interrupt Flag bit. Cest le flag qui est en liaison avec
linterruption EEPROM. Il passe 1 une fois lcriture en eeprom termine. Si le bit EEIE du
registre INTCON est 1, une interruption sera gnre

bit 3 : WRERR

WRite Error. Cest un bit derreur. Il passe 1 si une opration dcriture en eeprom a t
interrompue, par exemple par un reset.

bit 2 : WREN

WRite ENable. Autorisation de dmarrage du cycle dcriture

bit 1 : WR

WRite. Dmarrage du cycle dcriture. Est remis 0 automatiquement une fois lcriture
termine.

bit 0 : RD

ReaD. Dmarrage dun cycle de lecture. Reste 1 durant un cycle, puis est remis 0
automatiquement

12.5 Le registre EECON2

Nous revoici en prsence dun registre fantme , puisque ce registre nexiste pas. Il
sagit tout simplement dune adresse 0x89 banque1, qui sert envoyer des commandes au PIC
concernant les procdures eeprom. Vous ne pouvez lutiliser quen vous servant des
instructions expliques plus bas.

12.6 Accs en lecture dans la mmoire eeprom

Pour lire une donne en eeprom, il suffit de placer ladresse concerne dans le registre
EEADR. Ensuite, vous positionnez le bit RD 1. Vous pouvez ensuite rcuprer la donne
lue dans le registre EEDATA. Il ne faut pas bien sr oublier les diffrents changements de
banques.

Comme cette procdure est courte et toujours la mme, nous allons crer une macro
cette intention. Comme la macro doit contenir ladresse de lecture, nous raliserons une macro
avec passage de paramtre. Voici la macro ajouter. Vous devrez tre dans la banque0 pour
appeler cette macro, et elle vous retourne la valeur lue dans le registre W.

READEE macro adeeprom ; macro avec 1 paramtre (argument)
movlw adeeprom ; charger adresse eeprom (argument reu)
movwf EEADR ; adresse lire dans registre EEADR
bsf STATUS , RP0 ; passer en banque1
bsf EECON1 , RD ; lancer la lecture EEPROM
bcf STATUS , RP0 ; repasser en banque0
46
movf EEDATA , w ; charger valeur lue dans W
endm ; fin de la macro

Vous remarquez que vous passez un argument la macro. Vous dsignez cet ou ces
arguments aprs la directive macro. Nous avons utilis ici largument adeeprom pour indiquez
ladresse eeprom. Chaque utilisation de adeeprom dans notre macro sera remplace par
largument reu au moment de lappel de la macro.

Pour utiliser cette macro, nous devons donc lui passer un argument. Par exemple :

READEE eereload ; lecture de ladresse eereload de leeprom

Lira leeprom ladresse eereload, cest dire ladresse 0x00.

12.7 Laccs en criture la zone eeprom

Maintenant vous allez nous dire avec raison que cela ne sert rien de lire en eeprom si
on narrive pas y crire. Notre programme ne prsente donc rien de plus que ce que nous
avions auparavant. Cest tout fait justifi. Aussi allons-nous tudier la mthode dcriture.
Comme vous vous en doutez, cette mthode utilise les mmes registres.

La procdure suivre consiste dabord placer la donne dans le registre EEDATA et
ladresse dans EEADR. Ensuite une squence spcifique (il ny a rien comprendre, cest
impos par le constructeur) doit tre envoye au PIC.

13- Le watchdog

Le watchdog, ou chien de garde est un mcanisme de protection de votre programme.
Il sert surveiller si celui-ci sexcute toujours dans lespace et dans le temps que vous lui
avez attribus.

13.1 Le principe de fonctionnement

La mise en service ou larrt du watchdog se dcide au moment de la programmation de
votre PIC, laide de la directive _CONFIG. Si vous prcisez le paramtre _WDT_OFF
est prcis, le watchdog ne sera pas en service. Si au contraire vous prcisez _WDT_ON ,
le watchdog sera actif.

IL NEST DONC PAS POSSIBLE DE METTRE EN OU HORS SERVICE LE
WATCHDOG DURANT LEXECUTION DE VOTRE PROGRAMME.

Le fonctionnement du watchdog est li un timer interne spcifique, qui nest pas
synchronis au programme, ni un vnement extrieur. La dure spcifique de dbordement
de ce timer est approximativement de 18ms. Cette valeur est prendre avec prcaution, car
elle varie en fonction de diffrents paramtres comme la tension dalimentation ou la
temprature. La valeur minimale de 7ms est celle que vous devrez utiliser dans la pratique.

Chaque fois que linstruction clrwdt est envoye au PIC, le timer du watchdog est
remis 0, ainsi que la valeur contenue dans son prdiviseur. Si par accident cette instruction
nest pas reue dans le dlai prvu, le PIC est redmarre ladresse 0x00 et le bit TO du
47
registre STATUS est mis 0. En lisant ce bit au dmarrage, vous avez donc la possibilit de
dtecter si le PIC vient dtre mise sous tension, ou si ce dmarrage est du un plantage
de votre programme.

13.2 Le prdiviseur et le watchdog

Nous avons vu dans les leons prcdentes que le prdiviseur pouvait tre affect au tmr0
ou au watchdog, via le bit PSA du registre OPTION. Si nous dcidons de mettre le
prdiviseur sur le watchdog (PSA =1), le tableau de la page 16 nous donnera les valeurs du
prdiviseur obtenues suivant les bits PS0/PS2. En ralit, pour le watchdog, il sagit dun
postdiviseur, mais cela ne concerne que llectronique interne du PIC. Vous navez pas vous
tracasser pour cette diffrence.

Ce prdiviseur multiplie le temps de dbordement du timer du watchdog. Par exemple,
avec un prdiviseur de 2, vous obtenez un temps minimal de 7ms*2 =14ms. Donc, avec un
quartz de 4MHz, cela vous oblige envoyer linstruction clrwdt au moins une fois tous les
14.000 cycles dinstructions. Dans la plupart des cas, le reset seffectuera en ralit aprs
18ms*2 =36ms, soit 36.000 cycles dinstructions.

13.3 Les rles du watchdog

Le watchdog est destin vrifier que votre programme ne sest pas gar dans une
zone non valide de votre programme (parasite sur lalimentation par exemple), ou sil nest
pas bloqu dans une boucle sans fin (bug du programme). Il sert galement rveiller un PIC
place en mode sleep , ce que nous verrons plus tard.

13.4 Utilisation correcte du watchdog

La premire chose faire, si vous dsirez profiter de cette protection intgre, est de
paramtrer la _CONFIG pour la mise en service du watchdog. La premire chose constater,
cest que si vous indiquez _WDT_ON pour un programme qui ne gre pas le watchdog,
celui-ci redmarrera sans arrt, et donc ne fonctionnera pas, car il ne contiendra aucune
instruction clrwdt .

Cest une erreur frquente pour ceux qui ne matrisent pas les bits de configuration de
leur programmateur. Les bits de configurations indiqus dans le fichier sont en effet
modifiables sur la plupart des softs de programmation, qui sont capables de forcer une valeur
de _CONFIG diffrente de celle prvue par le concepteur du logiciel.

Ensuite, vous devez placer une ou plusieurs instructions clrwdt dans votre
programme en vous arrangeant pour quune instruction clrwdt soit reue dans les dlais
requis par votre PIC. A ce propos, ne tenez pas compte du temps nominal de 18ms, mais
plutt du temps de la situation la plus dfavorable. Ce temps est de minimum 7ms. En prenant
ce temps comme temps maximum autoris, vous tes certain que votre programme
fonctionnera dans toutes les conditions.

14- Le mode Sleep

Nous allons tudier dans ce paragraphe un mode trs particulier des PICs, qui leur
permet de se mettre en sommeil afin de limiter leur consommation.
48

14.1 Principe de fonctionnement

Le mode sleep ou power down est un mode particulier dans lequel vous pouvez
placer votre PIC grce linstruction sleep . Une fois dans ce mode, le PIC est place en
sommeil et cesse dexcuter son programme. Ds rception de cette instruction, la squence
suivante est excute :

- Le watchdog 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.

- Loscillateur est mis larrt, la PIC nexcute plus aucune instruction.

Une fois dans cet tat, le PIC est larrt. La consommation du circuit est rduite au
minimum. Si le tmr0 est synchronis lhorloge interne, il est galement mis dans
lincapacit de compter.

Par contre, il est trs important de se rappeler que le timer du watchdog possde son
propre circuit dhorloge. Ce dernier continu compter comme si de rien ntait.

Pour profiter au maximum de la chute de la consommation (montage sur piles par
exemple), Microchip recommande de veiller ce que les pins dentres/sorties et
llectronique connecte soient des niveaux 0 ou 1 tels quil ny ait aucun passage de
courant qui rsulte du choix de ces niveaux.

14.2 La sortie du mode sleep

Le passage en mode sleep na rellement dintrt que sil est possible den sortir. La
16F84 ne ragit dans ce mode quaux vnements suivants, qui sont seuls susceptibles de
replacer la 16F84 en mode de fonctionnement normal. Ces vnements sont les suivants :

- Application dun niveau 0 sur le pin MCLR. Ceci provoquera un reset de la 16F84. La
PIC effectuera un reset classique ladresse 0x00. Lutilisateur pourra tester les bits
TO et PD lors du dmarrage pour vrifier lvnement concern (reset, watch-dog, ou
mise sous tension).

- Ecoulement du temps du timer du watchdog. Notez que pour que cet vnement
rveille le PIC, il faut que le watchdog ait t mis en service dans les bits de
configuration.
Dans ce cas particulier, le dbordement du watchdog ne provoque pas un reset du PIC,
il se contente de la rveiller. Linstruction qui suit est alors excute au rveil.

- Une interruption RB0/INT, RB, ou EEPROM est survenue. Notez que pour quune
telle interruption puisse rveiller le processeur, il faut que les bits de mise en service
de linterruption aient t positionns. Par contre le bit GIE na pas besoin dtre mis
en service pour gnrer le rveil du PIC. Vous pouvez donc dcider par exemple de
rveiller le PIC la fin du cycle dcriture EEPROM. Pour ce faire, vous devez mettre
49
le bit EEIE de INTCON 1 et lancer le cycle dcriture, suivi par linstruction
sleep Une fois lcriture termine, le PIC est rveille et poursuit son programme.

14.3 Rveil avec GIE hors service.

Si votre PIC est rveille par une interruption alors que le BIT GIE de INTCON est mis
0, le programme se poursuivra tout simplement linstruction qui suit linstruction sleep .

14.4 Rveil avec GIE en service

Dans le cas o votre bit GIE est positionn, un rveil suite une interruption entranera la
squence suivante.

- Linstruction qui suit linstruction sleep est excute.

- Le programme se branche ensuite ladresse 0x04 comme une interruption ordinaire.
Notez que si vous ne voulez pas excuter linstruction qui suit linstruction sleep , il
vous suffit de placer cet endroit une instruction nop .

14.5 Cas typiques dutilisation

Ce mode de fonctionnement est principalement utilis dans les applications dans
lesquelles la consommation en nergie doit tre conomise (piles). On placera donc dans ce
cas le PIC en mode Power Down ou sleep aussi souvent que possible.

Une autre application typique est un programme dans lequel le PIC na rien faire dans
lattente dun vnement extrieur particulier. Dans ce cas, plutt que dutiliser des boucles
sans fin, une instruction sleep pourra faire efficacement laffaire.

D- LE PIC16F877:

1-Introduction

Le 16F877 est un microcontroleur mmoire FLASH de la famille des PIC de
Microchip. Son prdcesseur le plus connu, est le 16F84. Cest le microcontroleur le plus
riche en priphriques de cette gamme. Il sagit dun circuit intgr contenu dans un botier
dit DIL 40 . Il prsente donc 40 broches, 20 de chaque ct. Les broches sont virtuellement
numrotes de 1 40, la broche 1 tant celle qui se trouve dans le coin situ gauche de
lencoche de reprage.
Comme pour tout circuit intgr, chacune de ses broches a une ou plusieurs fonctions
qui sont rsumes par un sigle mnmotechnique.


50


Fig9.Brochage du 16f877
1.1 Les broches dalimentation :

Le 16F877 a des broches dalimentation : 2 pour le 0V broche 11 et 32 et 2 pur le +5V
broche 12 et 31. Il suffit de connecter une de chaque lalimentation pour que le CI
fonctionne.

1.2 Les broches du Quartz :

Comme pour tout micrcontrleur, le 16F877 a besoin dune horloge pour fixer la
vitesse dexcution des instructions. On utilise pour ce faire un quartz dont le rle est de crer
une impulsion de frquence leve.

Le micrcontrleur se base sur cette frquence pour son fonctionnement interne. Notons
que le 16F877 excute une instruction lmentaire du langage assembleur en 4 cycles
dhorloge. Il va donc pouvoir excuter 1millions doprations lmentaires par seconde.Le
quartz est connect sur les 2 broches OSC1 et OSC2.
51


Fig10.Architecture interne du 16f877
2- Les Ports du 16F877 :

Le 16F877 possde 5 ports diffrents :

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

Les broches de chaque port sont numrotes de 0 n.
Les broches de ports sont dsignes par un R suivi de la lettre du port et du numro de broche.
Ainsi, la broche 0 du port A est dsigne par RA0, la broche 4 du port B par RB4, etc
On a donc 33 broches dentres-sorties (E/S) disponibles. Cest lun des grands avantages
du 16F877. Mais toutes ces broches ne seront pas forcment disponibles en tant que broche
E/S car presque toutes sont galement utilises par lun ou lautre 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
entre ou en sortie.Les caractristiques lectriques de ces broches sont spcifies dans le
datasheet du micrcontrleur 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) dtermine le sens Entre ou Sortie des broches du port.

2.1 Le PORTA :

Le port A contient 6 pins I/O (input/output) numrotes 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 implments. Le port A est configur comme un ensemble dentres analogiques.
Donc, il faut forcer une valeur dans le registre ADCON1 dans la routine dinitialisation pour
pouvoir utiliser ce port comme port dentre/sortie de type gnral.

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 dcider
quelles sont les entres et quelles sont les sorties. le positionnement dun bit 1 place la
pin en entre, 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 concernes.

2.5 Le PORT E :

Il ne comporte que 3 pins, RE0 RE2 ces pins peuvent galement tre utilises comme
pins dentres analogiques. Le registre ADCON1 dtermine 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.
53

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 implment (lu comme 0 )
b2 : Direction I/O pour RE2 (1 =entre)
b1 : Direction I/O pour RE1
b0 : Direction I/O pour RE0

Ls bits 0 2 fonctionnent de faon identique ceux des autres TRISx.
Un bit 1 positionne le pin en entre, un bit 0 la positionne en sortie.
Le bit 4 (PSPMODE) est le bit qui dtermine si le PORTD sera utilis en port I/O. Si On
place ce bit a 1, le PORTD sera considr comme un port dinterfaage parallle avec un
microprocesseur (fonctionnement esclave).

3-La mmoire du Pic :

La mmoire du 16F877 est divise en trois parties distinctes :

3.1. Une mmoire FLASH (8K).

Cest la mmoire programme proprement dite. Chaque case mmoire unitaire fait 13
bits. La mmoire FLASH est un type de mmoire stable, quon peut recrire volont cette
mmoire flash fait 8Koctet.

3.2. Une mmoire RAM ( 368 octets).

La mmoire RAM disponible du 16F877 est de 368 octets, rpartie de la manire
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 accde au registre (adresse mmoire
RAM) 0x70 ou au registre 0XF0, en ralit on accde au mme emplacement. Ceci
lavantage de permettre dutiliser ces emplacements sans devoir connatre ltat de RP0, RP1,
et IRP.

54

Fig11.La RAM du 16F877

3.3 Une EEPROM Interne ( 256 Octets).
Cest une mmoire de donnes.

4-Les modules internes du 16F877 :

Le 16F877 comprend :

1. Trois timers / compteurs :
- le timer 0
- le timer 1
- le timer 2

55
2. Un convertisseur analogique-numrique (CAN) 10 bits 8 canaux

3. Deux modules de gnration dimpulsion priode rglable (PWM), qui
fonctionnent aussi en mode capture et comparaison

4. Un module de communication srie synchrone

5. Une USART

6. Un module de communication en port parallle en mode esclave

7. Un chien de garde


4.1. Les Trois timers / compteurs :

Lintrt des modules de comptage, cest quils permettent de tenir compte dvnements
qui surviennent de faon rpte sans que le microprocesseur soit monopolis par cette tche.
Dans la plupart des cas, une interruption a lieu que lorsque le compteur dborde (overflow).
4.1.1. Le timer 0 : fonctionne exactement comme dcrit dans la partie du microcontroleur
16F84.

4.1.2. Le timer 1 :cest un compteur 16 bits qui peut compter (de 0 65535) :
- soit les impulsions de lhorloge
- soit les impulsions externes, et en particulier les impulsions dun quartz externe.
Le dbordement provoque aussi une interruption.

4.1.2.1 Caractristiques 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 D0
D65535. Le Comptage avec le timer 16 bits ncessite 2 registres. Ces registres se nomment
TMR1L et TMR1H.
Le contenu de TMR1L et de TMR1H nest pas remis 0 lors dun reset. Donc, pour compter
partir de 0, il faut remettre 0 les deux registres.
Le timer 1 permet galement, de gnrer une interruption une fois le dbordement effectu.
Le timer 1 dispose, de la possibilit de mettre en service un prdiviseur. Mais ce prdiviseur
ne permet quune division maximale de 8. Par consquent 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 gnrer une interruption au moment ou il dborde, cest--dire au
moment o sa valeur passe de 0xFFFF 0x0000.
Pour que le timer 1 gnre une interruption les conditions suivantes doivent etre satisfaites :
- Il faut que le bit dautorisation dinterruption 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 dautorisation des interruptions
priphriques soit positionn dans le registre INTCON.
56
- Il faut que le bit dautorisation gnrale des interruptions (GIE) soit positionn dans le
registre INTCON.
Une interruption sera alors gnre chaque dbordement du timer1. Cet vnement sera
indiqu par le positionnement du flag TMR1IF dans le registre PIR1.

4.1.2.3 Les diffrents 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 diffrents en mode comptage : un mode de type
synchrone et un mode de type asynchrone. Cest dire en synchronisme ou non avec
lhorloge interne.
On a la possibilit, au niveau du timer 1, dutiliser un quartz sur les pins T1OSI et T1OSO
afin de disposer dune horloge spare de lhorloge principale.
Le timer peut donc fonctionner en tant que :
- Timer bas sur lhorloge interne (compteur de cycles dinstruction)
- Timer bas sur une horloge auxiliaire
- Compteur synchrone
- Compteur asynchrone.
Les modes de fonctionnement sont dfinis 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 dutilisation .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 dterminent eux deux la valeur du prdiviseur. Le
prdiviseur, permet, de ne pas compter chaque vnement reu, mais seulement chaque
multiple de cet vnement. La valeur de ce multiple est la valeur du prdiviseur.

T1CKPS1 T1CKPS0 Valeur du prdiviseur

0 0 1
0 1 2
1 0 4
1 1 8
T1OSCEN : ce bit permet de mettre en service loscillateur interne, et donc permet dutiliser
un second quartz pour disposer dun timer prcis travaillant une frquence distincte de la
frquence de fonctionnement du PIC.
Si on place ce bit 1 , on met en service loscillateur interne.
T1SYNC : permet de choisir si le comptage des vnements sera effectu de faon synchrone
ou asynchrone avec lhorloge principale du PIC. Lorsque TMR1 est utilis en mode timer ,
57
T1SYNC na aucune influance. Le comptage tant dtermin par loscillateur principal du
PIC, il est automatiquement synchrone.
TMR1CS : permet de dfinir quel est le mode de comptage du timer 1 :
- Soit on place TMR1CS 0 , dans ce cas, le timer compte les cycles dinstructions du
PIC.
- Soit, on place ce bit 1 , et TMR1 compte alors les flancs montants du signal appliqu
sur le pin RC0/T1OSO/T1CKI .
TMR1ON, si ce bit est mis 1 , autorise le timer 1 fonctionner, alors que sil est mis
0 , fige le contenu du timer 1, et donc, le met larrt.
- lors dune criture dans TMR1L ou TMR1H.

4.1.3. Le timer 2 :

Le timer 2 est un timer coupl au module CCP. Il est utilis essentiellement pour la
gnration dimpulsions priode ajustable (PWM).
Le timer2 dispose de certaines caractristiques diffrentes des deux autres timers.

4.1.3.1 Caractristiques du timer 2 :

Le timer 2 est un compteur sur 8 bits. Il possde lui aussi un prdiviseur. Celui-ci peut
tre paramtr avec une des 3 valeurs suivantes : 1,4, ou 16.
Cependant, le timer 2 dispose galement dun postdiviseur, qui effectue une seconde
division aprs lunit de comparaison. Ce postdiviseur peut prendre nimporte quelle valeur
comprise entre 1 et 16.
La valeur du diviseur total est obtenue en multipliant la valeur du prdiviseur par celle du
postdiviseur.On obtient alors les valeurs suivante du diviseur :

1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,20,24,28,32,36,40,44,48,52,56,60,64,80,96,112,128,14
4,160,176,192,208,224,240,256

Le timer 2 incrmente le registre TMR2, (un seul registre comptage sur 8 bits).
Les valeurs de division minimale et maximale sont identiques celles du timer 0.
Le registre TMR2 est remis automatiquement 0 lors dun reset, contrairement au timer 1.
Ce timer ne dispose daucune entre extrieure via un pin du PIC. Il ne peut donc fonctionner
quen mode timer avec lhorloge interne.

4.1.3.2 Le timer 2 et les interruptions :

Le timer 2 fonctionne, ce niveau, comme le timer1. Le flag dinterruption se nomme
TMR2IF tandis que le bit dautorisation sappelle TMR2IE.
Il sagit dune interruption priphrique, la procdure pour autoriser les interruptions du timer
2 se fait en 3 tapes :
- Autorisation des interruptions priphriques via le bit PEIE du registre INTCON
- Autorisation de linterruption timer 2 via TMR2IE du registre PIE1
- Autorisation gnrale des interruptions via le bit GIE du registre INTCON

4.1.3.3 Le timer 2 et les registres PR2 et T2CON :

La particularit du timer 2 cest la possibilit davoir un dbordement avec une valeur
prdfinie par lutilisateur cette valeur tant mmorise dans le registre PR2. On peut donc
58
avoir, par exemple, un dbordement de 0x56 0x00, en plaant la valeur 0x56 comme valeur
maximale dans le registre PR2.
On peut donc dire que le fonctionnement du timer est le suivant :
- On incrmente le contenu du prdiviseur chaque cycle dinstruction
- Chaque fois que ce contenu correspond un multiple de la valeur du prdiviseur, on
incrmente TMR2.
- Chaque fois que le contenu de TMR2 dpasse le contenu de PR2, on remet TMR2 0, et on
incrmente le contenu du postdiviseur.
- Chaque fois que le contenu du postdiviseur correspond un multiple de la valeur du
postdiviseur, on positionne le flag TMR2IF.
- Chaque fois que le contenu du postdiviseur est gal un multiple de la valeur de ce celui-ci,
paramtre par TOUTPS0 TOUTPS3, le flag TMR2IF est forc 1, et une interruption est
ventuellement gnre.
Une criture dans le registre TMR2 efface le contenu du prdiviseur et du postdiviseur.

En conclusion ; le principal avantage du timer2, est quil permet de configurer le
dbordement sur nimporte quelle valeur de TMR2, associ un large ventail de valeurs de
diviseur.
Cet avantage, combin la grande flexibilit de lensemble prdiviseur/postdiviseur,
permet dobtenir trs facilement des dures dinterruption prcises sans complications
logicielles.
Le contenu du registre T2CON, qui permet de paramtrer le prdiviseur et le postdiviseur,
ainsi que dautoriser ou non le fonctionnement du timer2, est le suivant :

T2CON (en banque 0 )
- b7 : non utilis,
- b6 : TOUTPS3 : Timer2 OUTput PostScale bit 3
- b5 : TOUTPS2 : Timer2 OUTput PostScale bit 2
- b4 : TOUTPS1 : Timer2 OUTput PostScale bit 1
- b3 : TOUTPS0 : Timer2 OUTput PostScale bit 0
- b2 : TMR2ON : TiMeR 2 ON
- b1 : T2CKPS1 : Timer 2 ClocK PreScale bit 1
- b0 : T2CKPS0 : Timer 2 ClocK PreScale bit 0

Les bits TOUTPSx permettent de configurer la valeur du postdiviseur.
Il y a 16 valeurs possibles (0 15). Comme une valeur de diviseur de 0 na aucun sens, le
nombre form par les 4 bits de TOUTPSx est incrment de 1 pour obtenir la valeur effective
du postdiviseur.
Les valeurs utilisables sont donc :

b6 b5 b4 b3 Postdiviseur
0 0 0 0 1
0 0 0 1 2
0 0 1 0 3
0 0 1 1 4
0 1 0 0 5
0 1 0 1 6
0 1 1 0 7
0 1 1 1 8
1 0 0 0 9
59
1 0 0 1 10
1 0 1 0 11
1 0 1 1 12
1 1 0 0 13
1 1 0 1 14
1 1 1 0 15
1 1 1 1 16

Quant au prdiviseur, il y a 3 valeurs :

b1 b0 Prdiviseur
0 0 1
0 1 4
1 0 16
1 1 16

La formule de la dure sparant 2 positionnements conscutifs du flag TMR2IF est :

Dure totale = temps dune instruction * prdiviseur * postdiviseur * (PR2 +1)

La valeur maximale est, comme pour le timer 0 de 16*16*256 =65536.

4.2. Un convertisseur analogique-numrique (CAN) 10 bits :

Le CAN prsent dans le 16F877 est un CAN 10bits. Un CAN convertit une tension
analogique en une valeur numrique binaire, qui pourra ensuite tre utilise pour des calculs
ou autres. Sa rsolution de 10bits donne une prcision en 5V de 5mv environ.

Par ailleurs, ce CAN peut convertir les tensions de 8 voies analogiques.
Ce CAN tant associ au microcontrleur, il va tre possible denvisager dacqurir des
donnes.

4.2.1. Principe de conversion :

Le 16F877 travaille avec un convertisseur analogique / numrique qui permet un
chantillonnage sur 10 bits. Le signal numrique peut donc prendre 1024 valeurs possibles.
Pour pouvoir convertir une grandeur, nous devons connatre la valeur minimale quelle peut
prendre, ainsi que sa valeur maximale. Les pics considrent par dfaut que la valeur minimale
correspond leur Vss dalimentation, tandis que la valeur maximale correspond la tension
positive dalimentation Vdd. Mais il est cependant possible dutiliser dautres valeurs.
La squence de conversion linterieur du PIC est la suivante :
- Le pic connecte la pin sur laquelle se trouve la tension numriser un condensateur
interne, qui va se charger via une rsistance interne jusque la tension applique.
- Le pin est dconnect du condensateur, et ce dernier est connect sur le convertisseur
analogique/numrique interne.
- Le pic procde la conversion.

4.2.2. Le temps dacquisition :

60
Cest le temps quil faut pour que le condensateur interne atteigne une tension proche de
la tension convertir. Cette charge seffectue travers une rsistance interne et la rsistance
de la source connecte au pin.
Ce temps est incrment du temps de raction des circuits internes, et dun temps qui dpend
de la temprature (coefficient de temprature). En effet que les rsistances augmentent avec la
temprature, donc les temps de raction des circuits galement.
Donc, si on pose :

Tacq = temps dacquisition total
Tamp = temps de raction des circuits
Tc = temps de charge du condensateur
Tcoff = temps qui dpend du coefficient de temprature.
La formule est donc :
Tacq = Tamp + Tc + Tcoff

Le temps de raction Tamp est typiquement de 2s, Tamp =2s
Pour le cofficient de temprature, il nest ncessaire que pour les tempratures suprieures
25C. Dans les autres cas on peut le ngliger. Ce cofficient est typiquement de 0,05 s par
C qui est suprieur 25C. Donc, ce temps Tcoff sera au minimum de 0 ( moins de 25C) et
au maximum de (50-25)*0.05, soit 1,25 s. La t du pic ne pouvant pas, en effet, excder
50C.

Le temps de charge dpend de la rsistance place en srie avec le condensateur. En
ralit, il y a 2 rsistances, celle de la source de signal, et celle lintrieur du PIC.
Il est recommand que la rsistance de la source reste infrieure 10KOhms.
La rsistance interne au PIC est directement lie la tension dalimentation. Plus la tension
baisse, plus la rsistance est leve, donc plus le temps de chargement est long.
La rsistance interne totale (compose de 2 rsistances internes) varie de 6Kohms 6V
pour arriver 12Kohms sous 3V, en passant par 8Kohms sous 5V.

Le condensateur interne une valeur de 120pF, les formules du temps de chargement
dun condensateur est :

Tc = -C * (Rinterne + Rsource) * ln (1/2047)

La valeur 2047 vient du fait que pour numriser avec une prcision de bit, la
numrisation utilisant une valeur maximale de 1023, la charge du condensateur doit tre au
minimum de 2046/2047 me de la tension mesurer.
Comme C et ln(1/2047) sont des valeurs fixes la constante sera :

-C * ln(1/2047) = 0,914895 * 10
-9


La formule devient donc :

Tc = 0,914895 * 10
-9
* (Rinterne + Rsource)

Si on se place dans le cas le plus dfavorable (tension de 3V, et rsistance source =
10Kohms), notre temps de chargement est de =

Tc = 0,914895 * 10
-9
* (10 * 10 + 12 * 10)
61

Tc maximal = 20,12 s

Pour le cas le plus favorable (tension de 6V, et rsistance source ngligeable) :

Tc = 0,914895 * 10
-9
* (0 * 10 + 6 * 10)

Tc minimal : 5,48 s.

Dans le cas typique, savoir une tension dalimentation de 5V et une rsistance de source de
10 Kohms, nous aurons :

Tc = 0,914895 * 10
-9
* (10 * 10 + 8 * 10)

Tc typique = 16,46 s.

Le temps total dacquisition Tacq pour le cas typique est :

Tacq sous 5V = 2s + 16,46s + 1,25s = 19,71s.

Donc, On prendra un Tacq de 20s pour une alimentation de 5V.

4.2.3. La conversion :

Le principe utilis est celui de lapproximation successive.
Cette mthode consiste couper lintervalle dans lequel se trouve la grandeur analogique en
2 parties gales, et de dterminer dans laquelle de ces deux parties se situe la valeur
numriser. Une fois cet intervalle dtermin, on le coupe de nouveau en deux, et on continu
ainsi jusqu lobtention de la prcision demande.Cette mthode permet un gain de temp
considrable.
Le temps ncessaire la conversion est gal au temps ncessaire la conversion dun bit
multipli par le nombre de bits dsirs pour le rsultat.
La conversion dun bit ncessite un temps quon nomme Tad. Le temps de conversion Tad
peut prendre une valeure minimale de 1,6s. La formule dobtention des temps Tad est :

Le temps dinstruction (Tosc) divis par le diviseur donn.

Le PIC ncessite galement un temps Tad avant le dmarrage effectif de la conversion, et
un temps supplmentaire Tad la fin de la conversion. Donc, le temps total de conversion est
de :


- Tad : avant le dbut de conversion (le temps de connexion du condensateur est inclus)
- 10 * Tad pour la conversion des 10 bits du rsultat
- Tad supplmentaire pour la fin de la conversion de b0

62
Le total, est un un temps de 12 Tad.


Un temps quivalent 2 * Tad est ncessaire avant de pouvoir effectuer une nouvelle
conversion. Donc le temps ncessaire pour effectuer lensemble des oprations :

- chargement du condensateur interne (ncessite le temps Tacq)
- on effectue la conversion (ncessite le temps 12 * Tad)
- attente de 2 * Tad avant de pouvoir recommencer une autre conversion

4.2.4. Frquence maximale dchantillonage :

La frquence maximale la quelle on peut chantillonner le signal analogique, dans le
cas le plus dfavorable avec une alimentation de 5V :

T entre 2 chantillonnages = Tacq + 12 Tad + 2 Tad = Tacq + 14 Tad
= 19.71+14*1.6 = 42.11s
Ceci correspond une frquence de :

F = 1/T =23747 Hz

Cette frquence permet dchantillonner des signaux sinusodaux dune frquence maximale
de 11874 Hz (la moiti de la frquence dchantillonnage).

4.2.5 Les pins et les canaux utiliss par le convertisseur :

Le PIC ne contient quun seul convertisseur, mais il dispose de plusieurs pins sur
lesquelles connecter les signaux analogiques. Un circuit de commutation slectionne laquelle
des pins sera relie au condensateur de maintien interne durant le temps Tacq. Les diffrentes
entres sont des canaux diffrents dun seul convertisseur.
Le 16F877 dispose de 8 canaux dentre analogique. On peut chantillonner jusque 8 signaux
diffrents sur les pins AN0 AN7. Les pins AN0 AN4 sont les dnominations analogiques
des pins RA0 RA5 (RA4 non inclus), tandis que les pins AN5 AN7 sont les dnominations
analogiques des pins RE0 RE2.
63


Fig12. Multiplexage des voies analogiques

4.2.6. Les tensions de rfrence :

La conversion analogique/numrique ncessite une tension de rfrence minimale (Vref-)
et une tension de rfrence maximale (Vref+).
Au niveau du PIC, il y a 3 modes de fonctionnement possibles :

- Utilisation de Vss (masse du PIC) comme tension Vref- et de Vdd (alimentation positive
du PIC) comme tension Vref+. Dans ce mode, les tensions de rfrences sont xtraites en
interne de la tension dalimentation.

- Utilisation du pin Vref+pour fixer la tension de rfrence maximale Vref+, et
utilisation de Vss comme tension de rfrence Vref-. Dans ce cas, la tension Vref+doit
donc tre fournie au PIC via le pin RA3.

- Utilisation de la pin Vref+pour fixer la tension de rfrence maximale Vref+, et
utilisation du pin Vref- pour fixer la tension de rfrence minimale Vref-. Dans ce cas,
les deux tensions de rfrences devront tre fournies au PIC via RA3 et RA2.
RA5/AN4
64
La broche Vref+est une dnomination alternative de la broche RA3/AN3, tandis que la
broche Vref- est une dnomination alternative de la broche RA2/AN2.
La procdure de numrisation, pour le cas o plusieurs canaux sont utiliss, est la suivante :

- On choisit le canal numriser, on engage le convertisseur
- On attend Tacq
- On lance la numrisation
- On attend la fin de la numrisation
- On attend 2 Tad
- On recommence avec le canal suivant.

4.2.7. Les registres ADRESL et ADRESH :

Le rsultat de la conversion est sauvegard dans 2 registres. Ces registres sont ADRESL
et ADRESH.
Le rsultat tant sur dix bits le rsultat peut tre soit justifi gauche, soit droite.
La justification droite complte la partie gauche du rsultat par des 0 . Le rsultat obtenu
est de la forme :


La justification gauche procde de la mthode inverse :


Le choix de la mthode seffectue laide du bit 7 de ADCON1.

Le registre ADRESH se situe en banque 0, alors que ADRESL se trouve en banque 1.

4.2.8. Le registre ADCON1 :

Ce registre permet de dterminer le rle de chacune des pins AN0 AN7.
Pour pouvoir utiliser un pin en mode analogique, il faudra que ce pin soit configur galement
en entre par TRISE.
Le registre ADCON1 dispose de 8 bits, dont seulement 5 sont utiliss :

ADCON1
- b7 : ADFM : A/D result ForMat select
- b6 : Inutilis : lu comme 0
- b5 : Inutilis : lu comme 0
- b4 : Inutilis : lu comme 0
- b3 : PCFG3 : Port ConFiGuration control bit 3
- b2 : PCFG2 : Port ConFiGuration control bit 2
- b1 : PCFG1 : Port ConFiGuration control bit 1
- b0 : PCFG0 : Port ConFiGuration control bit 0

Le bit ADFM permet de dterminer si le rsultat de la conversion sera justifi droite (1)
ou gauche (0).

65

On trouve dans ce registre 4 bits de configuration des pins lis au convertisseur
analogique/numrique. Ces bits permettent la dtermination du rle de chaque pin.
Il y a 16 combinaisons possibles, et autant de possibilits de configuration.


4.2.9. Le registre ADCON0 :

Ce registre est le dernier utilis par le convertisseur analogique/numrique. Il contient les
bits quon manipule lors de la conversion. Sur les 8 bits du registre, 7 seront utiliss.

- 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 dterminer lhorloge du convertisseur en fonction de la frquence du quartz
utilis. On choisi le diviseur laide des bits ADCS0 et ADCS1.



Le choix et la slection du canal analogique pour procder la conversion seffectuent
travers les bits CHS0, CHS1 et CHS2.

66
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 dmarrer la charge du condensateur interne, et
donc dtermine le dbut du temps dacquisition.
Le bit Go/DONE, sera plac 1 la fin du temps dacquisition. Cette action dtermine le
dbut de la conversion. Une fois la conversion termine, ce bit est remis 0 ( Done =
Fait ) par llectronique du convertisseur. Cette remise 0 est accompagne du
positionnement du flag ADIF du registre PIR1. Ce bit permettra ventuellement de gnrer
une interruption.

4.2.10. La conversion analogique/numrique et les interruptions :

Cette partie ne comporte aucune difficult particulire. En effet, linterruption gnre par
le convertisseur est une interruption priphrique, et doit donc tre traite comme telle. Les
diffrentes 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 entranera une interruption. Il vous
suffira de remettre 0 le flag ADIF aprs traitement de cette interruption.

4.2.11. Lutilisation pratique du convertisseur :
Arriv ce stade, vous disposez de toutes les informations pour effectuer votre mesure de
grandeur analogique. Voici un rsum des oprations concrtes effectuer pour
chantillonner votre signal :
1) Configurez ADCON1 en fonction des pins utilises en mode analogique, ainsi que les
registres TRISA et TRISE si ncessaire.
2) Validez, si souhaite, linterruption du convertisseur.
3) Paramtrez sur ADCON0 le diviseur utilis.
4) Choisissez le canal en cours de digitalisation sur ADCON0.
5) Positionnez, si ce nest pas dj fait, le bit ADON du registre ADCON0.
6) Attendez le temps Tacq (typiquement 19,7s sous 5V).
7) Dmarrez la conversion en positionnant le bit GO du registre ADCON0.
8) Attendez la fin de la conversion.
9) Lisez les registres ADRESH et si ncessaire ADRESL
10) Attendez un temps quivalent 2Tad (typiquement 3,2s).
11) Recommencez au point 4.
Notez que puisque lacquisition redmarre automatiquement aprs le temps 2 Tad ,
vous pouvez relancer lacquisition directement, votre charge dattendre non pas le temps
Tacq pour la fin de lacquisition, mais le temps Tacq +2Tad. Ceci vous pargne une
67
temporisation. En effet, 2 temporisations qui se suivent peuvent tre remplaces par une
temporisation unique de temps cumul.
Si donc, nous prenons un PIC cadence 20Mhz, sous une tension dalimentation de
5V, nous aurons :
1) Configurez ADCON1 en fonction des pins utilises en mode analogique, ainsi que les
registres TRISA et TRISE si ncessaire.
2) Validez, si souhait, linterruption du convertisseur (PEIE, ADIE, GIE)
3) Paramtrez le diviseur 32 sur ADCON0 (B10000000)
4) Choisissez le canal en cours de digitalisation sur ADCON0 et lancez le convertisseur
(B10xxx001)
5) Attendez le temps (Tacq+2Tad), soit 19,7s +3,2s =22,9s
6) Dmarrez la conversion en positionnant le bit GO du registre ADCON0
7) Attendez la fin de la conversion
8) Lisez les registres ADRESH et si ncessaire ADRESL
9) Recommencez au point 4
Notez que vous pouvez, comme montr, raliser plusieurs oprations en mme temps.
Cependant, fort logiquement, vous ne pouvez pas positionner les bits ADON et
GO/DONE en mme temps, puisque le temps Tacq doit imprativement les sparer.
Remarque :
Lorsque vous disposez de beaucoup de temps entre 2 lectures de la valeur analogique, nous
vous conseillons deffectuer plusieurs mesures intermdiaires, et deffectuer la moyenne de
ces mesures. Ainsi, un parasite ventuel, ou une lgre fluctuation de votre tension sera
fortement attnue.
Il est pratique dans ce cas deffectuer un nombre de mesures qui est une puissance de 2 (2
mesures, 4,8,16). Ainsi, pour effectuer votre moyenne, il suffira deffectuer la somme de
toutes les valeurs, la division seffectuant par simple dcalage.

4.3. Les deux modules CCP et la gnration (PWM) :

Ce module est trs puissant pour crer des impulsions des frquences leves. On pourra
dfinir la priode, la dure du niveau haut pendant cette priode.
Le 16F877 dispose de deux modules CCP. CCP signifie Capture, Compare, and PWM.
Ces modules CCP sont fortement lis et dpendant des timers 1 et 2. Ils sont galement lis au
convertisseur A/D.
Les 2 modules CCP1 et CCP2 sont strictement identiques, except la possibilit, pour le
module CCP2, de dmarrer automatiquement la conversion A/D.

4.3.1 Les registres CCP1CON et CCP2CON

Ces registres ont la mme fonction, CCP1CON concerne le module CCP1, tandis que
CCP2CON concerne le module CCP2.
Le registre CCPxCON permet de dterminer 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
68
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 compltent le
nombre de 10 bits utilis pour le mode de fonctionnement PWM. Dans les autres modes, ces
bits sont donc inutiliss.
Les bits CCPxM3 CCPxM0 servent dterminer quel sera le mode de fonctionnement
du module concern. Les possibilits sont les suivantes :

CCPM Fonctionnement

0000 Module CCPx larrt
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 dbordement (+bit CCPxIF =1)
1001 Mode compare, place la sortie 0 sur dbordement (+bit CCPxIF =1)
1010 Mode compare, positionne CCPxIF sans affecter la sortie
1011 Mode compare, positionne CCPxIF sans affecter la sortie, et gnre le trigger
11xx Mode PWM

4.3.2. Le mode capture :

Ce mode fait intervenir un pin comme vnement dclencheur. Il sagit donc dune
entre. Il est donc impratif de configurer le pin CCPx en entre 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 lapparition de lvnement dclencheur sur le pin concerne, la valeur
(16bits) du timer 1 contenue dans les registres TMR1H et TMR1L est copie dans les
registres CCPR1H et CCPR1L.
- Simultanment, le bit CCP1IF du registre PIR1 est valid, et une interruption intervient si
elle est configure.
Lvnement dclencheur est une variation du signal sur le pin CCP1/RC2 pour le module
CCP1, et sur le pin CCP2/RC1 pour le module CCP2. Lvnement qui provoque la capture
dpend 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. Lgalit de ces valeurs
entranera les ractions souhaites.

4.3.4. Le mode PWM :

4.3.4.1 La thorie du PWM :

69
PWM signifie Pulse Width Modulation , ce quon pourrait traduire par modulation de
largeur dimpulsion. Il sagit dun signal binaire de frquence fixe dont le rapport cyclique
peut tre modul par logiciel.
Le module PWM a besoin dun pin du PIC configure en sortie.
Le rapport cyclique dun signal binaire frquence fixe peut tre dfini comme tant le
rapport entre le temps o il se trouve ltat 1 par rapport au temps total dun cycle. Un
cycle ntant constitu, par dfinition, que dun tat 1 suivi dun tat 0 , la somme des
temps des 2 tats tant constante.
Il y a donc deux paramtres qui dfinissent un signal PWM :
- La dure dun cycle complet
- Le rapport cyclique

Donc, si on pose :

- Tc = Dure dun cycle
- Rc le rapport cyclique
- Th = dure de ltat haut
- Tb = dure de ltat bas

Alors :

- Tc = Th + Tb (Dure dun cycle en secondes = dure de ltat haut + dure de ltat
bas)
- Frquence du signal (en hertz) = 1/Tc
- Rc = Th / Tc (rapport cyclique en % = temps ltat haut divis par le temps de cycle)


Fig13. Signal PWM avec un rapport cyclique de 50% (0.5)

Un signal avec un rapport cyclique de 0% est un signal dont le temps ltat haut occupe
0% du temps total. Cest donc un signal qui est constamment ltat bas. De mme, un signal
avec un rapport cyclique de 100% est un signal qui est constamment ltat haut.

70
Le rapport cyclique dun signal PWM doit donc tre suprieur 0% et infrieur 100%.
Le PIC permet donc de crer un signal priodique dont il est possible de faire varier (moduler)
le rapport cyclique.


4.3.4.2 Les registres utiliss :

On a besoin de plusieurs registres pour programmer toutes les valeurs ncssaires au
module.
On a besoin dune valeur de dbordement pour le timer 2, cette valeur se trouve dans le
registre PR2. Cest une valeur sur 8 bits. La valeur de la seconde comparaison (celle qui fait
passer la sortie de 1 0) est une valeur de 8 bits complte de 2 bits fractionnaires.
Le nombre entier sera inscrit dans le registre CCPRxL. Les 2 bits fractionnaires qui
compltent ce nombre sont les bits DCxB1(CCP1X) et DCxB0(CCP1Y) du registre
CCPxCON.
Pour lancer le mode PWM , nous devons donc procder aux initialisations suivantes :

1) On initialise PR2 en fonction de la dure totale du cycle (Tc):
PR2 = (TC / (prdiviseur * 4 * Tosc) 1

2) On calcule la valeur de comparaison DCB en valeur fractionnaire suivant la formule :
DCB = Th / (prdiviseur * Tosc)
On place les bits 9 2 dans CCPRxL (valeur entire), les bits 1 et 0 (fraction) tant
positionns dans DCxB1 et DCxB0 du registre CCPxCON.

3) On place le pin CCPx en sortie en configurant TRISC.

4) On lance le timer 2 en programmant son prdiviseur.

5) On configure CCPxCON pour travailler en mode PWM .
71


Fig14.Fonctionnement en mode PWM
4.3.4.3. Remarques :

La valeur de rfrence encode dans CCPRxL ne peut tre suprieure la valeur contenue
dans PR incrmente de 1. Dans le cas contraire, le signal ne pourrait jamais atteindre cette
consigne, et la pin CCPx resterait bloque au niveau haut (rapport cyclique >100%) Il est
possible dutiliser le timer 2 la fois comme timer classique et comme gnrateur pour le
module PWM.
Le registre CCPRxH nest pas accessible en criture lors du fonctionnement en mode
PWM.
La prise en compte du changement de valeur du rapport cyclique ne se fera quaprs la fin du
cycle en cours.

4.3.5 Champs dapplication

En fait, vous utiliserez ce module chaque fois que vous aurez besoin dun signal de
frquence fixe, mais de rapport cyclique variable. Lapplication typiquee est la variation de
vitesse dun moteur courant continu.

4.4 Le module MSSP en mode SPI :

Le module MSSP, pour Master Synchronous Serial Port, permet lchange de donnes du
PIC avec le mode extrieur, en utilisant des transmissions srie synchrones.
Il nest pas le seul proposer des communications, nous avons dj vu la liaison parallle
dans le module PSP, et nous verrons dautres communications srie avec le module USART.
Vous verrez que lensemble de ces modules vous ouvre toutes les voies royales de la
communication, que ce soit avec votre PC, avec des afficheurs, des mmoires de type
72
eeprom, des dtecteurs de temprature, des horloges en temps rel, etc
Avec ces modules, nous navons plus nous occuper de la transmission des bits en eux-
mmes, mais nous les recevrons et mettrons directement sous forme doctet, toute la
procdure de srialisation tant alors automatique.
Outre le gain en taille programme qui en dcoulera, vous vous rendez compte que les
vitesses de transmission pourront tre amliores de faon notable. Au lieu que votre
programme ne soit interrompu lors de la rception ou de lmission de chaque bit, il ne le sera
plus que pour chaque octet. Ceci multiplie allgrement la vitesse maximale possible dans un
facteur de plus de 10.
Il y a tellement de modes possibles de fonctionnement, quil ne nous sera pas possible de
donner systmatiquement des exemples. Nous nous limiterons donc des situations courantes.
Nous verrons que le module MSSP peut travailler selon 2 mthodes. Soit en mode SPI (Serial
Peripherial Interface), soit en mode I2C.

4.5.Le module USART :

4.5.1 Le mode srie asynchrone
Une liaison srie asynchrone, comme son nom lindique, fonctionne de la mme faon, en
mettant les bits les uns la suite des autres, mais sans fournir le signal dhorloge qui a
permis de les gnrer.
Ceci a forcment plusieurs consquences, dont les suivantes :
- Comme le rcepteur dune donne ne reoit pas le signal dhorloge, il doit savoir quelle
vitesse lmetteur a gnr son transfert. Cest en effet la seule faon pour lui de savoir
quand commence et quand fini un bit.
- Comme metteur et rcepteur se mettent daccord pour adopter une vitesse commune, et
tant donn que chacun travaille avec sa propre horloge, de lgres diffrences peuvent
apparatre sur les 2 horloges, introduisant des drives. Il faudra grer ceci.
- Il faut un mcanisme qui permette de dtecter le dbut dune donne. En effet, imaginons
que la ligne soit niveau 1 et que lmetteur dcide denvoyer un 1 . Comment
savoir que la transmission a commenc, puisque rien ne bouge sur la ligne concerne ?
- De la mme faon, il faut tablir un mcanisme pour ramener la ligne son tat de repos
en fin de transmission. Ceci tant indispensable pour permettre la dtection de la donne
suivante.
- Notez enfin que dans les transmissions asynchrones, la grande majorit des liaisons
procdent en commenant par lenvoi du bit 0. Ce sera notre cas.
La liaison utilisera les 2 mmes pins que pour la liaison synchrone, savoir RC6/TX/CK
et RC7/RX/DT. Les dnominations qui conviendront dans ce cas seront bien entendu TX pour
lmission et RX pour la rception.
Ces pins devront tre configures en entre via TRISC pour fonctionner en mode USART.
4.5.1.1 Le start-bit :
Au repos, nous allons imaginer que notre ligne soit au niveau 1 . Nous choisissons ce
niveau parce que cest celui prsent sur la ligne dmission de votre PIC. Rien nempche de
travailler avec une lectronique qui modifie ces niveaux, comme par exemple lutilisation
dun driver RS485 (par exemple le MAX485), ou un pilote RS232 (comme le MAX232) qui
permettra a votre liaison srie de devenir compatible lectriquement avec le port RS232 de
votre PC .
Donc, notre ligne se trouve 1 . Or, nous navons quune seule ligne ddicace un
sens de transfert, donc nous disposons dun seul et unique moyen de faire savoir au
destinataire que la transmission a commenc, cest de faire passer cette ligne 0 .
On peut donc simplement dire que le start-bit est :
73
- Le premier bit mis
- Un bit de niveau toujours celui oppos au niveau de repos (donc 0 dans notre cas).
- Un bit dune dure, par convention, la mme que celle dun bit de donne.
4.5.1.2 Les bits de donne :
Nous avons envoy notre start-bit, il est temps de commencer envoyer nos bits de
donne. En gnral, les bits de donne seront au nombre de 7 ou de 8 (cas les plus courants).
La dure dun bit est directement lie au dbit choisi pour la connexion. En effet, le dbit
est exprim en bauds, autrement dit en bits par seconde. Donc, pour connatre la dure dun
bit, il suffit de prendre linverse du dbit.
Tb =1 / Dbit.
Par exemple, si on a affaire une connexion 9600 bauds, nous aurons :
Tb =1 / 9600 bauds =104,16 s.
4.5.1.3 La parit :
Directement aprs avoir envoy nos 7 ou 8 bits de donnes, nous pouvons dcider
denvoyer ou non un bit de parit. Ce bit permet dimposer le nombre de bits 1 mis
(donne +parit), soit comme tant pair (parit paire), soit comme tant impair (parit
impaire).
Le rcepteur procde la vrification de ce bit, et, si le nombre de bits 1 ne
correspond pas la parit choisie, celui-ci saura que la rception ne sest pas effectue
correctement. La parit permet de dtecter les erreurs simples, elle ne permet ni de les rparer,
ni de dtecter les erreurs doubles. Par contre, la dtection frquente derreurs de parit indique
un problme dans lchange des donnes.
Voici par exemple, un cas de parit paire :
La donne vaut : B00110100
Nous avons 3 bits 1 . Donc, pour avoir notre parit paire, notre bit de parit devra donc
valoir 1 , ce qui forcera le nombre total de bits 1 valoir 4 , ce qui est bien pair.
On enverra donc :
B001101001 : 4 bits 1 =parit paire
4.5.1.4 Le stop-bit :
Nous avons maintenant mis tous nos bits de donne et notre parit ventuelle. Reste
permettre notre ligne de transmission de revenir ltat de repos. Ce passage est dnomm
stop-bit .
On peut dire son sujet que :
- Il sera le dernier bit mis de loctet
- Son niveau est toujours celui du niveau de repos (donc 1 dans notre cas).
- Sa dure sera par convention la mme que celle dun bit de donne.
Le stop-bit nest pas comptabilis (pas plus que le start-bit) pour le calcul du bit de parit.
Notez quil est permis dimposer lutilisation de 2 stop-bits .
Une autre faon de voir les choses, est de dire quon ne pourra envoyer loctet suivant
quaprs une dure Tb aprs lmission du premier stop-bit. O, dit encore autrement, on doit
mnager une pause dune dure de 1 bit, entre lmission de 2 octets conscutifs.
Un mot concernant la lecture dun bit par le rcepteur. Il est vident que la lecture de
chaque bit doit seffectuer dans la zone prsentant la plus grande probabilit de stabilit du
bit. En gnral, les lectroniques sont construites pour mesurer le bit au milieu de sa dure.
Voici, pour illustrer tout ceci, lmission dune donne code sur 8 bits, avec parit paire
et un stop-bit. Les lectures sont indiques par les flches infrieures :
74


4.5.2 Mise en uvre :
Le PIC est capable de travailler en mode full-duplex. Ceci vous laisse plusieurs
possibilits de configuration. Voyons tout dabord comment interconnecter les circuits dans
ce mode :


Dans ce cas, notre PIC est privilgi, puisquil peut parler avec le circuit 2 et 3, alors que
ces circuits ne peuvent dialoguer entre eux.
Vous voyez donc que le mode full-duplex procure un inconvnient. Soit on se contente de
communiquer entre 2 composants, soit, si on a plus de 2 composants, un seul se trouve en
situation privilgie.
Notez que nous reprsentons toujours des liaisons directes, connectes directement sur votre
PIC. On peut aussi, pour diverses raisons, dont la principale est dallonger les distances de
communication, utiliser des pilotes de lignes spcifiques.
Prenons par exemple le cas de la communication half-duplex entre votre PIC et le port
srie dun PC :


Vous notez la prsence dun driver de ligne, de type MAX232 qui convertit les niveaux
75
0v/5V de votre PIC en niveaux +12V/-12V destination de la RS232 de votre PC, et
rciproquement. La norme RS232 est galement une norme qui prcise un mode de
fonctionnement full-duplex.

4.5.3 le registre TXSTA :

TXSTA en mode asynchrone :

b7 : non : non utilis en mode asynchrone
b6 : TX9 : TRANSMITT 9 bits enable bit (1 =9 bits, 0 =8 bits)
b5 : TXEN : TRANSMITT ENable bit
b4 : SYNC : SYNChronous mode select bit (1 =synchrone, 0 =asynchrone)
b3 : N.U. : Non Utilis : lu comme 0
b2 : BRGH : Baud Rate Generator High mode select bit
b1 : TRMT : TRansMiT shift register status bit (1 =TSR vide)
b0 : TX9D : TRANSMIT 9th bit Data

Voyons ou rappelons ce que signifie tout ceci :
TX9 : indique si vous voulez envoyer des donnes codes sur 8 ou sur 9 bits. Un bit plac
1 ici conduira mettre des donnes codes sur 9 bits.
TXEN : permet de lancer lmission. Cette fois, en mode asynchrone, votre USART pourra
mettre et recevoir en mme temps. Rien donc ne vous empche de slectionner mission et
rception simultane. Nous ne retrouverons donc pas ici la notion de priorit de commande.
SYNC : indique si vous travaillez en mode synchrone (1) ou asynchrone (0). Dans ce
paragraphe, nous traitons le mode asynchrone, donc ce bit devra tre positionn 0 .
BRGH : permet de choisir entre 2 prdiviseurs internes pour la gnration des bits en
fonction de SPBRG. Nous aurons un mode grande vitesse (BRGH =1) et un mode basse
vitesse (BRGH =0). Nous en reparlerons au moment de ltude de SPBRG.
TRMT : indique quand le registre TSR est vide, cest--dire quand lmission de la dernire
valeur prsente est termine.
TX9D : contient la valeur du 9me bit envoyer, quand vous avez dcid, via le
positionnement de TX9, de raliser des missions de mots de 9 bits.

4.5.4 Le registre RCSTA :

RCSTA en mode asynchrone :

b7 : SPEN : Serial Port ENable bit
b6 : RX9 : RECEIVE 9 bits enable bit (1 =9 bits, 0 =8 bits)
b5 : non : non utilis en mode asynchrone
b4 : CREN : Continuous Receive ENable bit
b3 : ADDEN : ADDress detect ENable bit
b2 : FERR : Frame ERRor
b1 : OERR : Overflow ERRor bit
b0 : RX9D : RECEIVE 9th Data bit

Quant au rle de chacun de ces bits :
SPEN : met le module USART en service.
RX9 : permet de choisir une rception sur 8 ou sur 9 bits, exactement comme pour
lmission.
76
CREN : lance la rception continue. Les octets seront reus sans interruption jusqu ce que
ce bit soit effac par vos soins. Dans le mode asynchrone, il nexiste que ce mode de
rception.
FERR : indique une erreur de trame. Ceci se produit lorsquau moment o devrait
apparatre le stop-bit en mode lecture, lUSART voit que la ligne de rception est 0 . Ce
bit est charg de la mme faon que le bit RX9D. Autrement dit, ce nest pas un flag effacer,
cest un bit qui est li la donne quon vient de lire. On doit donc lire ce bit, tout comme
RX9D : avant de lire RCREG. Une fois ce dernier lu, le nouveau FERR crase lancien. Si
vous suivez, on a donc un bit FERR vu comme sil tait le 10me bit du mot reu.
OERR : indique une erreur de type overflow. Il se retrouve positionn si vous navez pas lu
RCREG suffisamment vite. Leffacement de ce bit ncessite le reset de CREN. Le non
effacement de OERR positionn bloque toute nouvelle rception dune donne.
RX9D : contient le 9me bit de votre donne reue, pour autant, bien entendu, que vous ayez
activ le bit RX9.

4.5.5 Le registre SPBRG :
Ce registre, tout comme pour le mode synchrone, permet de dfinir le dbit qui sera utilis
pour les transferts. Cest le mme registre qui est utilis pour mission et rception. De ce fait,
un transfert full-duplex seffectuera toujours avec une vitesse dmission gale celle de
rception.
Par contre, en mode half-duplex, rien ne vous empche de modifier SPBRG chaque
transition mission/rception et inversment.
Nous avons 2 grandes diffrences pour ce registre par rapport au mode synchrone :
- Le registre SPBRG doit toujours tre configur, puisque tous les interlocuteurs doivent
connatre le dbit utilis
- La formule utilise pour le calcul de SPBRG nest pas identique celle du mode
synchrone.
En ralit, nous avons 2 formules distinctes, selon que nous aurons positionn le bit
BRGH 1 ou 0
Si BRGH = 0 (basse vitesse)
Dbit = Fosc / (64 * (SPBRG + 1))
Ou encore :
SPBRG = (Fosc / (Dbit * 64)) 1
Les limites dutilisation sont (avec un PIC 20MHz) :
Dbit min =20*10
6
/ (64 * (255+1)) =1221 bauds
Dbit max =20*10
6
/ (64 * (0+1)) =312.500 bauds
Si BRGH = 1 (haute vitesse)
Dbit =Fosc / (16 * (SPBRG +1))
Ou encore :
SPBRG =(Fosc / (Dbit * 16)) 1
Les limites dutilisation sont (avec unPIC 20MHz) :
Dbit min =20*10
6
/ (16 * (255+1)) =4883 bauds
Dbit max =20*10
6
/ (16 * (0+1)) =1.250.000 bauds
Vous voyez tout de suite que le mode basse vitesse permet dobtenir des vitesses plus
basses, tandis que le mode haute vitesse permet de monter plus haut en dbit. Il existe une
zone couverte pas les 2 modes. Dans ce cas, vous choisirez BRGH =1 si cela vous permet
dobtenir le taux derreur le moins lev.

Pour lmission :
- Vous validez la mise en service de lmission en positionnant le bit TXEN.
77
- La validation de TXEN positionne le flag TXIF 1 puisque le registre TXREG est
vide.
- Si vous utilisez le format de donne sur 9 bits, vous devez commencer par placer la valeur
du 9me bit dans le bit TX9D.
- Ensuite, vous placez la donne mettre dans le registre TXREG (TRANSMITT
REGister).
- Cette donne est transfre ds le cycle dinstruction suivant, ainsi que le bit TX9D, dans
son registre TSR. TRMT passe 0 (TSR plein).
- Vous recommencez ventuellement le chargement de TX9D +TXREG, le flag TXIF
passe 0 (TXREG plein)
- Ds que le premier octet est mis, le second est transfr dans TSR, le registre TXREG est
vide, TXIF est positionn. Vous pouvez charger le troisime octet, et ainsi de suite.
- Quand le dernier octet est transmis, TRMT passe 1 (TSR vide, mission termine)
Avec toujours les mmes remarques :
- Vous avez toujours un octet en cours de transmission dans TSR, le suivant tant dj prt
dans TXREG.
- Si on a besoin de 9 bits, on place toujours TX9D avant de charger TXREG.
- Chaque fois que TXIF passe 1 (avec interruption ventuelle), vous pouvez recharger
TXREG avec loctet suivant (tant que vous en avez).
- Quand la communication est termine, TRMT passe 1.
- TXIF passe 1 ds que TXEN est positionn
Pour quil y ait une mission, il faut donc que, le module tant initialis et lanc :
- TXEN soit positionn
- Le registre TXREG soit charg
Pour la rception :
- Vous positionnez CREN, ce qui a pour effet que votre PIC est prt recevoir une donne.
- Loctet reu est transfr dans le registre RCREG (le 9me bit ventuel est transfr vers
RX9D), et le flag RCIF est positionn
- Vous lisez alors le bit RX9D ventuel puis le registre RCREG, ce qui provoque
leffacement du bit RCIF.
De nouveau, nous retrouvons notre file FIFO, qui nous permettra de recevoir 2 octets
(plus un en cours de rception), avant dobtenir une erreur doverflow. Pour rappel :
- Le premier octet est en cours de rception dans RSR, RCREG est vide, donc RCIF est
0
- Le premier octet est reu et transfr dans la file de RCREG, RCIF est positionn, le
second octet est en cours de rception dans RSR
- Si vous ne ragissez pas de suite, le second octet est reu et transfr dans la file de
RCREG, RCIF reste positionn, le troisime octet est en cours de rception dans RSR.
Comme on na que 2 emplacements, vous devrez ragir avant la fin de la rception du
troisime octet, mais vous voyez que votre temps de raction peut tre allong. Voici alors ce
que vous allez faire dans ce cas :
- Vous lisez, si vous travaillez sur 9 bits, le 9me bit, RX9D, puis RCREG, donc le premier
octet reu. Cette lecture ne provoque pas leffacement de RCIF, puisque RCREG nest pas
vide. Par contre, le 9me bit du second octet est transfr ce moment dans RX9D, ce qui
explique que vous deviez le lire en premier.
- Vous lisez alors, si vous travaillez sur 9 bits, le bit RX9D qui est le 9me bit de votre
second octet, puis RCREG, donc le second octet reu. Le flag RCIF est effac, le registre
RCREG est vide.
Lerreur doverflow sera gnre si un troisime octet est reu alors que vous navez pas
lu les deux qui se trouvent dans la file FIFO. Le positionnement empche toute nouvelle
78
rception. Leffacement de ce bit ncessite deffacer CREN.
Votre raction devrait donc tre du style :
- Tant que RCIF est positionn
- J e lis RX9D puis RCREG
- RCIF nest plus positionn, OERR est positionn ?
- Non, pas de problme
- Oui, je sais que jai perdu un octet et je coupe CREN
Evidemment, vous avez beaucoup moins de chance davoir une erreur doverflow si vous
travaillez via les interruptions, ce que nous vous conseillons fortement dans ce mode.
4.5.6 Lerreur de frame :
Lerreur de frame survient si, au moment o lUSART sattend recevoir un stop-bit, il
voit que le niveau de sa ligne de rception est positionne 0 . Dans ce cas, quelque chose
sest mal droul.
Le bit FERR sera positionn, mais, attention, ce bit fait partie de la file FIFO, tout comme
le bit RX9D. Donc, vous lisez RX9D et FERR, et, ensuite, vous lisez RCREG. A ce
moment, le nouveau bit FERR concernant loctet suivant crasera le FERR actuel, exactement
comme le nouveau bit RX9D effacera lactuel.Vous navez donc pas effacer FERR, qui est,
du reste, en lecture seule.

4.6.Port D en mode PSP :

4.6.1 A quoi sert le mode PSP ?
Le mode PSP (pour Parallel Slave Port) permet un microprocesseur, ou tout autre
systme extrieur de prendre le contrle du PORTD de votre PIC. Ce systme pourra crire de
lui-mme des valeurs sur le PORTD, et y lire des valeurs que votre programme PIC y aura
prpare son intention.
Le PORTD devra donc passer alternativement en entre et en sortie, et sous la seule
dcision du systme extrieur. Cest donc celui-ci qui dcide quel moment une lecture ou
une criture sopre. Les transferts sont donc raliss de faon asynchrones avec le
programme de votre PIC.
Voici une affaire qui va intresser les lectroniciens pointus dsireux dinterfacer leur
PIC avec un autre processeur, de faon , par exemple, obtenir un super UART.
Pour les autres, ne vous inquitez pas si vous ne comprenez pas tout, car vous nutiliserez
probablement jamais cette possibilit, et, du reste, cela ne vous empchera pas de profiter des
autres possibilits de votre PIC.
La premire chose est de bien se mettre daccord sur les termes. Nous parlons ici du
PORD en mode parallle. Il ne sagit pas ici du port parallle de votre imprimante, mais de la
mthode de communication entre 2 microprocesseurs.
Ensuite, il faut comprendre que ce mode est un mode Slave (esclave), cest dire sous
le contrle du microprocesseur sur lequel vous connectez votre PIC. Cest ce processeur qui
va prendre le contrle de votre PORTD.
4.6.2 Comment passer en MODE PSP ?
La premire chose faire est de forcer le bit PSPMODE du registre TRISE 1 .
Ensuite, les 3 pins RE0/RE2 sont utilises dans un de leur mode spcial et portent de fait les
dnominations RD/CS/WR. Ces pins sont actifs ltat bas. Ces pins sont sous contrle du
microprocesseur matre, ce qui fait que vous devez les configurer en entre via les bits b0/b2
de TRISE.
Mais il se fait, toujours si vous tes attentifs, que cest la valeur impose par une mise
sous tension, donc inutile de vous en occuper.
Vous notez galement que le PORTD passe sous contrle de ces pins, le registre TRISD
79
nest donc plus daucune utilit : inutile de le configurer.
Notez que dans la plupart des cas, vous utiliserez les interruptions pour grez ce mode de
fonctionnement, vous devez donc mettre en service linterruption PSP .
En effet, les changes dinformation se font sur dcision du microprocesseur matre, et
donc de faon asynchrone avec le programme de votre PIC. Les interruptions restent la
meilleure faon de traiter rapidement les vnements asynchrones.

4.6.3. Connexion des PORTD et PORTE en mode PSP :
Si nous reprenons nos 3 pins du PORTE, avec les noms utiliss pour cette fonction, cest
dire RD, CS, et WR, nous pourrons dire :
La pin CS est la pin Chip Select , que tous les lectroniciens spcialiss dans les
microprocesseurs connaissent.
Pour les autres, on peut dire que le Chip Select permet de valider la slection du circuit
concern, en loccurrence notre PIC.
Sur la carte microprocesseur, un dtecteur dadresse, plac sur le bus dadresse permet
de slectionner ladresse laquelle va rpondre notre PIC. Comme dans la plupart des
systmes, ce CS sera actif ltat bas.
Ensuite, nous trouvons les signaux RD pour ReaD et WR pour WRite . De
nouveau ces signaux sont actifs ltat bas. Notez que sur certains microprocesseurs, il
nexiste quune seule pin RD/WR. A vous donc dans ce cas de gnrer lectroniquement les 2
signaux, ce qui nest pas compliqu.
Maintenant, concernant le PORD, il sera connect au bus de data de la carte
microprocesseur.
Notez, une fois de plus, que sur certains microprocesseurs, les bus de data et dadresse
peuvent tre multiplexs, ou dune largeur diffrente de 8 bits. Il vous incombe une fois de
plus de rendre les signaux et les messages compatibles lectroniquement.

4.7. liaison I2C :

4.7.1 Introduction
On passe directement ltude du module MSSP en mode IC, et par consquent on doit
commencer par expliquer en quoi consiste ce bus.
En effet, bien que le module prenne en charge tous les aspects de gestion de ce bus, il ma
sembl important de comprendre ce qui se passait effectivement au niveau des lignes qui le
constituent.
De plus, labsence de ces informations vous poserait problme au moment dtablir une
communication avec un composant IC. En effet, lorsque vous rencontrerez un nouveau
composant, tout ce dont vous disposerez son sujet sera, en gnral, son datasheet. Sans une
connaissance assez prcise du bus IC, vous vous retrouveriez confront quelque chose qui
risquerait bien de vous paratre incomprhensible.
Et puis, mieux vaut avoir une information quon nutilisera ventuellement pas quune
absence dinformation au moment o on en a besoin.
4.7.2 Caractristiques fondamentales :
Le bus IC permet dtablir une liaison srie synchrone entre 2 ou plusieurs composants.
Il a t cr dans le but dtablir des changes dinformations entre circuits intgrs se
trouvant sur une mme carte. Son nom, dailleurs, traduit son origine : Inter Integrate Circuit,
ou I.I.C., ou plus communment IC (I carr C). Ce bus est le descendant du CBUS, qui est de
moins en moins utilis.
Son domaine dapplication actuel est cependant bien plus vaste, il est mme, par exemple,
utilis en domotique.
Il comporte des tas de similitudes avec le SMBUS dIntel (System Management BUS),
80
mais on ne parlera pas de ce bus ici. Si cela vous intresse, vous trouverez des informations
sur Internet. Sachez simplement que nos 16F87x peuvent crer des signaux compatibles avec
cette norme.
L IC permettait, ses dbuts, de travailler des frquences maximales de 100
Kbits/seconde, vitesses assez rapidement portes 400 Kbits/seconde. Il existe maintenant
des familles de circuits pouvant atteindre des vitesses de 3.4 Mbits/seconde. Le
fonctionnement thorique reste identique.
Le bus IC est constitu de 2 uniques lignes bidirectionnelles :
- La ligne SCL (Serial Clock Line), qui, comme son nom lindique, vhicule lhorloge de
synchronisation
- La ligne SDA (Serial DAta line), qui vhicule les bits transmis.
Il est important de vous souvenir que :
- la ligne SCL est gre par le matre (nous verrons que par moment, lesclave peut prendre
provisoirement le contrle de la ligne).
- la ligne SDA, un moment donn, est pilote par celui qui envoie une information (matre
ou esclave).
Tous les circuits sont connects sur ces 2 lignes. Il existe 2 sortes de circuits pouvant tre
connects :
- Les circuits matres, qui dirigent le transfert et pilotent lhorloge SCL.
- Les circuits esclaves, qui subissent lhorloge et rpondent aux ordres du matre.
Chacun de ces 2 types peut mettre et recevoir des informations.
Une particularit est quon peut placer plusieurs matres sur le mme bus IC. Ceci
implique que, sans prcautions, si 2 matres dsirent prendre le contrle du bus en mme
temps, on encourrait, sans prcautions particulires, 2 risques :
- La destruction de llectronique des circuits, pour le cas o lun dentre eux impose un
niveau haut et lautre un niveau bas (court-circuit).
- La corruption des donnes destines ou en provenance de lesclave.
Fort heureusement, vous vous doutez bien que Philips (linventeur de lIC) a trouv des
solutions pour parer ces ventualits.On commence par les contraintes lectroniques.
Pour la partie lectronique, la parade est simple. On travaille avec des tages de sortie qui
ne peuvent imposer quun niveau 0, ou relcher la ligne, qui remonte delle-mme au niveau 1
via des rsistances de rappel.
De cette faon, on naura jamais de court-circuit, puisque personne ne peut placer la
tension dalimentation sur la ligne. Ces tages sont des montages que vous trouverez dans la
littrature sous la dnomination de collecteur ouvert ou de drain ouvert suivant la
technologie utilise. Le pin RA4 de votre PIC utilise dailleurs la mme technique.
Le schma dinterconnexion des circuits sur un bus IC est donc le suivant :
81


Fig15. Connexion de plusieurs composants sur le bus I2C

4.7.3 Les diffrents types de signaux :
Nous allons voir que cette norme joue intelligemment avec les niveaux prsents sur les 2
lignes, afin de raliser diverses oprations. Plutt que de vous donner directement un
chronogramme de transmission, on va scinder les diffrentes tapes. De cette faon ca sera
beaucoup plus simple comprendre.
4.7.3.1 Le bit ordinaire :
Tout dabord, la mthode utilise pour crire et recevoir des bits est diffrente de celle
utilise dans ltude de notre module SPI. En effet, pour ce dernier, un bit tait mis sur un
flanc de lhorloge, et tait lu sur le flanc oppos suivant de la dite horloge.
Au niveau du bus IC, le bit est dabord plac sur la ligne SDA, puis la ligne SCL est
place 1 (donc libre) durant un moment puis force de nouveau 0. Lmission du bit
seffectue donc sans aucune correspondance dun flanc dhorloge. Il est lu lors du flanc
montant de cette horloge.
Notez quil est interdit de modifier la ligne SDA durant un niveau haut de SCL. La drogation
cette rgle nest valable que pour les squences dites de condition .Voici quoi
ressemble lmission et la lecture dun bit :


82
Vous constatez que le bit prsent sur la ligne SDA doit tre prsent avant la monte du
signal SCL, et continuer un certain temps avant sa redescente.
4.7.3.2 Le start-condition :
Comme pour tout signal synchrone, le protocole ne dfinit pas de start et de stop-bit. Mais
il intgre toutefois les notions de start-condition et de stop-condition . Ces squences
particulires, obtenues en modifiant la ligne SDA alors que la ligne SCL est positionne
ltat haut permettent de dfinir dbut et fin des messages. Nous verrons que ceci est
indispensable pour reprer le premier octet du message, qui a un rle particulier.
Si on se souvient quau repos, SCL et SDA se trouvent relchs, et donc ltat haut, le
start-condition (symbole conventionnel : S) est ralis simplement en forant la ligne SDA
0, tout en laissant la ligne SCL 1.



Il existe un driv de cette condition, appel repeated start condition , qui est utilis
lorsquun message en suit directement un autre. Il sagit donc en fait dun second
startcondition au sein dun mme message. Sachez ce niveau quun repeated start-
condition peut tre considr comme identique un startcondition .
4.7.3.3 Le stop-condition :
Nous venons dy faire allusion. Cette condition indique la fin du message en cours. Elle
remet les lignes SDA et SCL au repos, mais en respectant la chronologie suivante :
La ligne SDA est ramene 1, alors que la ligne SCL se trouve dj 1. Voici ce que cela
donne :


4.7.3.4 Lacknowledge :
Lacknowledge (ACK) est en fait laccus de rception de loctet envoy. Cest donc le
rcepteur qui met ce bit pour signaler quil a bien lu loctet envoy par lmetteur. Cet
accus de rception est lu comme un bit classique. Il vaudra 0 si laccus de rception signifie
OK , et 1 pour toute autre raison (rcepteur dans limpossibilit de rpondre, par exemple).
Voici un ACK (OK) :
83

Et voici une absence daccus de rception, encore dnomme NOACK. En effet, un
NOACK quivaut une absence de raction, puisque seul le niveau bas est impos, le niveau
haut tant li la libration de la ligne (ou sa non appropriation).


4.7.3.5 Le bit read/write:
Il nous faut encore voir un bit particulier. Le bit R/W indique lesclave si les bits de
donnes contenus dans la trame sont destins tre cris (R/W =0) ou lus (R/W =1) par le
matre. Dans le cas dune criture, le matre enverra les donnes lesclave, dans le cas dune
lecture, cest lesclave qui enverra ses donnes au matre.
Etant donn que ce bit ne prsente aucune particularit, on ne donne pas le chronogramme
(identique celui dcrit pour le bit ordinaire ).

4.7.4 Structure dune trame IC :

Nous avons vu tous les signaux possibles, il nous faut maintenant tudier le protocole de
communication des intervenants en IC.
Nous savons dj que la transmission commence par un start-condition (S).
Vient ensuite ladresse, code sur 7 ou 10 bits, complte par loctet R/W qui prcise si
les donnes qui vont suivre seront crites ou lues par le matre.
Chaque octet envoy est toujours accompagn dun accus de rception de la part de celui
qui reoit. Un octet ncessite donc 8 +1 =9 impulsions dhorloge sur la pin SCL.
On distingue ds lors 2 cas : soit ladresse est code sur 7, soit sur 10 bits. Voici comment
se prsente le dbut dune trame ( partir ce cet instant, dans les chronogrammes concernant
lIC.
Notez donc, et cest logique, que cest toujours le matre qui envoie ladresse, quil soit
rcepteur ou metteur pour le reste du message.

Pour coder une adresse sur 10 bits, on utilisera comme premier octet ladresse rserve
84
B11110xy0 qui prcise quun second octet est ncessaire. Voici ce que donne lenvoi dune
adresse sur 10 bits :


5- Les Interruptions du 16F877 :

Le 16F877 possde de nombreuses sources dinterruptions. Environ plus de 14 sources
diffrentes dinterruption. Les plus importantes sont :

5.1. Interruption du Timer 0 :
Le dbordement (le passage de 255 0) du timer 0 provoque une interruption.

5.2. Interruption du Timer 1 :
Le dbordement (le passage de 65535 0) du timer 0 provoque une interruption.

5.3. Interruption externe sur RB0 :
La broche RB0 peut tre configure pour dclencher une interruption lapparition dun
flanc Montant ou Descendant sur cette broche. Cette interruption peut tre utile pour rendre le
microprocesseur sensible une action sur un module externe (un clavier ou un bouton
poussoir par exemple).

5.4. Interruption un changement sur RB4-7 :
Une modification sur une ou plusieurs broches des 4 broches RB4, 5, 6 et 7 (demi port B)
provoque une interruption.

5.5. Linterruption de fin de conversion du module CAN.
Le module CAN peut gnrer une interruption lorsquune conversion analogique
numrique est termine.

5.6. Les autres interruptions disponibles sont :
- interruption du port parallle PSP
- interruption du port srie USART (rception et mission)
- interruption du module CCP1
- interruption du timer2


85

Vous aimerez peut-être aussi