You are on page 1of 108

Programmation des Microcontroleurs (PIC)

EL MORNAN

SOMMAIRE

1)Architecture interne dun systme microprocesseur


2)Le microcontrleur16F84
3)Jeux d'instructions des PIC

4) Bits (ou "fusibles") de configuration


5)Les interruptions
6)Le mode SLEEP
7)Le timer WATCHDOG (chien de garde)
8)Accs la mmoire EEPORM
9) Remarques et astuces de programmation en assembleur
10) Les tapes ncessaires pour programmer un pic :
11) Exemples en assembleur avec 16F84
12) Simulation dun PIC sous Proteus
13) Circuits dinterfaces avec le microcontrleur
14) Pic 16F877 :

Page 1

Programmation des Microcontroleurs (PIC)

EL MORNAN

1. Architecture interne dun systme


microprocesseur
L'architecture interne d'un ordinateur se compose essentiellement de trois blocs: le microprocesseur, la
mmoire et les entres/sorties relies entre elles par trois bus de communication; le bus de donnes, le bus
dadresses et le bus de commande.
Bus de donnes (8 lignes)

Unit centrale de
traitement
microprocesseur

Mmoire

Entres/Sorties

Bus d'adresses

Bus de contrle

Figure 1-1 Architecture interne dun ordinateur


1.1.1 Le microprocesseur
Un microprocesseur est l'implantation en un seul botier, en technologie LSI ou VLSI, d'une unit centrale
de traitement de donnes CPU et dune unit arithmtique et logique ALU. Son principal travail est de
fournir aux autres lments, qui lui sont raccords, la synchronisation ncessaire et fonctionnelle du
traitement des informations qui lui sont achemines.
1.1.2 La mmoire
C'est la partie o l'on retrouve les programmes excutables et les donnes traiter. Cette section est
subdivise en deux; d'une part, il y a la mmoire latente et d'autre part, la mmoire vive.
Mmoire morte
C'est la mmoire de lecture; elle contient le programme du systme. L'avantage de la ROM (Read Only
Memory), cest d'tre permanente; son contenu ne disparat pas quand le systme n'est plus aliment. La
ROM contient toujours un programme de chargement initial ou un moniteur pour permettre le
fonctionnement du systme ds la mise sous tension. Dans un contexte de contrle de processus, presque
tous les programmes rsideront en ROM car ils seront rarement changs et devront tre protgs des
pannes d'alimentation.
Mmoire vive
C'est la mmoire de lecture et dcriture du systme ou RAM (Random Access Memory). Le contenu de
ce type de mmoire est perdu lorsque l'on coupe l'alimentation. La mmoire vive (RAM) doit tre
charge, avant utilisation, partir du clavier ou partir dune mmoire de masse comme, par exemple,
une unit ruban magntique ou une unit disque.

Page 2

Programmation des Microcontroleurs (PIC)

1.2

EL MORNAN

Les entres/sorties

Les entres/sorties sont ncessaires pour que le microprocesseur communique avec le monde extrieur et,
videmment, avec l'utilisateur. Il serait tout fait inutile de raliser un ordinateur sans qu'il y ait quelques
entres et quelques sorties afin de communiquer avec l'extrieur.

1.3

Les bus de communication

videmment, pour que le systme fonctionne, il doit y avoir une communication entre le microprocesseur,
la mmoire et les entres/sorties. Cette communication est ralise l'aide de trois bus qui regroupent les
signaux, selon leur fonction.
1.3.1 Le bus de donnes
C'est un bus bidirectionnel sur lequel transitent les donnes changes par les lments du systme.
1.3.2 Le bus dadresses
Il s'agit d'un bus unidirectionnel, manant du microprocesseur et se propageant vers les dispositifs qu'il
peut adresser. L'adresse qu'il porte permet d'atteindre une case mmoire ou un registre spcifique avec
laquelle une opration est dsire.
1.3.3 Le bus de contrle
C'est un groupe de lignes issues de ou allant vers le microprocesseur et reliant ce dernier d'autres
dispositifs. Son rle est de vhiculer les signaux destins assurer la synchronisation et la commande de
l'ensemble du systme. Par exemple, la ligne Reset et R/W (lecture/criture), les lignes d'interruptions et
l'horloge appartiennent ce bus.

2. Les microcontrleurs :
2.1 Gnralits :
Un microcontrleur se prsente comme tant une unit de traitement de linformation de type
microprocesseur contenant tous les composants dun systme informatique, savoir, microprocesseur,
des mmoires et des priphriques (ports, timers, convertisseurs). Chaque fabricant a sa ou ses familles
de microcontrleurs.
Une famille se caractrise par un noyau commun (le microprocesseur, le jeu dinstruction).
Ainsi les fabricants peuvent prsenter un grand nombre de pins qui sadaptent plus au moins certaines
tches. Mais un programmeur connaissant une famille na pas besoin dapprendre utiliser chaque
membre, il lui faut connatre juste ces diffrences par rapport au pre de la famille. Ces diffrences sont
souvent, la taille des mmoires, la prsence ou labsence des priphriques et leurs nombres

Page 3

Programmation des Microcontroleurs (PIC)

EL MORNAN

2.2 Les avantages du microcontrleur :


Lutilisation des microcontrleurs pour les circuits programmables plusieurs points forts et bien
rels. Il suffit pour sen persuader, dexaminer la spectaculaire volution de loffre des fabricants de
circuits intgrs en ce domaine depuis quelques annes.
Tout dabord, un microcontrleur intgre dans un seul et mme botier ce qui, avant ncessitait une
dizaine dlments spars. Il rsulte donc une diminution vidente de lencombrement de matriel et
de circuit imprim.
Cette intgration a aussi comme consquence immdiate de simplifier le trac du circuit imprim
puisquil nest plus ncessaire de vhiculer des bus dadresses et de donne dun composant un
autre.
Le microcontrleur contribue rduire les cots plusieurs niveaux :
- Moins cher que les autres composants quil remplace.
- Diminuer les cots de main duvre.
Ralisation des applications non ralisables avec dautres composants

2.3 Contenu dun microcontrleur :


Un circuit microcontrleur doit contenir dans un seul botier tous Les lments de bases, nous y
retrouvons bien videmment lunit centrale qui est plus simplifie par rapport celle du
microprocesseur. En contre partie, des instructions de manipulation de bits, trs utiles pour faire des
entres/sorties lui ont t ajoutes. Dans certains circuits, cette unit centrale se voit dote dun trs grand
nombre de registres internes qui servent alors de mmoire vive.

2.4 Organisation de la mmoire


Architecture Von Neumann : une mmoire unique et pour le programme et pour les donnes.
Architecture Harvard : le programme et les donnes sont stocks dans des mmoires physiquement
spars

2.5 Qu'est-ce qu'un PIC ?


Un PIC est un microcontrleur de chez Microchip. Ses caractristiques principales sont :
Sparation des mmoires de programme et de donnes (architecture Harvard) : On obtient ainsi une
meilleure bande passante et des instructions et des donnes pas forcment codes sur le mme nombre de
bits.
Communication avec l'extrieur seulement par des ports : il ne possde pas de bus d'adresses, de bus de
Page 4

Programmation des Microcontroleurs (PIC)

EL MORNAN

donnes et de bus de contrle comme la plupart des microprocesseurs.


Utilisation d'un jeu d'instructions rduit, d'o le nom de son architecture : RISC (Reduced Instructions Set
Construction). Les instructions sont ainsi codes sur un nombre rduit de bits, ce qui acclre l'excution
(1 cycle machine par instruction sauf pour les sauts qui requirent 2 cycles). En revanche, leur nombre
limit oblige se restreindre des instructions basiques, contrairement aux systmes d'architecture CISC
(Complex Instructions Set Construction) qui proposent plus d'instructions donc codes sur plus de bits
mais ralisant des traitements plus complexes.
Il existe trois familles de PIC :
- Base-Line : Les instructions sont codes sur 12 bits
- Mid-Line : Les instructions sont codes sur 14 bits
- High-End : Les instructions sont codes sur 16 bits
Un PIC est identifi par un numro de la forme suivant : xx(L)XXyy zz
- xx : Famille du composant (12, 14, 16, 17, 18)
- L : Tolrance plus importante de la plage de tension
- XX : Type de mmoire de programme
C -EPROM ou EEPROM
CR - PROM
F -FLASH
- yy : Identification
- zz : Vitesse maximum du quartz
Nous utiliserons un PIC 16F84 10, soit :
- 16 : Mid-Line
- F : FLASH
- 84 : Type
- 10 : Quartz 10MHz au maximum .Il s'agit d'un microcontrleur 8 bits 18 pattes.
Principales caractristiques :
- 35 instructions
- Instructions codes sur 14 bits
- Donnes sur 8 bits
- 1 cycle machine par instruction, sauf pour les sauts (2 cycles machine)
- Vitesse maximum 10 MHz soit une instruction en 400 ns (1 cycle machine = 4 cycles d'horloge)
- 4 sources d'interruption
- 1000 cycles d'effacement/criture pour la mmoire flash
Brochage et fonction des pattes
La Figure montre le brochage du circuit. Les fonctions des pattes sont les suivantes :- VSS, VDD :
- OSC1,2 :
- RA0-4 :
- RB0-7 :
- T0CKL :
- INT :
- MCLR :

Figure: Brochage du circuit

Page 5

Programmation des Microcontroleurs (PIC)

EL MORNAN

2.6 Architecture gnrale

Figure : Architecture gnrale du PIC 16F8X.


La Figure prsente larchitecture gnrale du circuit. Il est constitu des lments suivants :
- un systme dinitialisation la mise sous tension (power-up timer, )
- un systme de gnration dhorloge partir du quartz externe (timing gnration)
- une unit arithmtique et logique (ALU)
- une mmoire flash de programme de 1k mots de 14 bits
- un compteur de programme (program counter) et une pile (stack)
- un bus spcifique pour le programme (program bus)
- un registre contenant le code de linstruction excuter
- un bus spcifique pour les donnes (data bus)
- une mmoire RAM contenant
- les SFR 68 octets de donnes- une mmoire EEPROM de 64 octets de donnes
- 2 ports dentres/sorties
- un compteur (timer)
- un chien de garde (watchdog)
Le circuit de mise en uvre minimale :
Le circuit 16F84 est lun des plus simples de la famille, mais il permet nanmoins de travailler avec 12
broches dentre/sortie !
La mise en uvre est trs simple. Il faut au minimum :
- Un circuit dhorloge ( un quartz, deux condensateurs ou bien seulement un condensateur et une
rsistance )
- Une alimentation +5V !
Page 6

Programmation des Microcontroleurs (PIC)

EL MORNAN

2.7 Circuit dhorloge :

2.7 Organisation de la mmoire


Le PIC contient de la mmoire de programme et de la mmoire de donnes. La structure Harvard des PICs
fournit un accs spar chacune. Ainsi, un accs aux deux est possible pendant le mme cycle machine.

2.8 Mmoire de programme


Cest elle qui contient le programme excuter. Ce dernier est tlcharg par liaison srie
La Figure montre lorganisation de cette mmoire. Elle contient 1k mots de 14 bits dans le cas du PIC
16F84, mme si le compteur de programme (PC) de 13 bits peut en adresser 8k.
Ladresse 0000h contient le vecteur du reset, ladresse 0004h lunique vecteur dinterruption du PIC.
La pile contient 8 valeurs. Comme le compteur de programme, elle na pas dadresse dans la plage de
mmoire.
Ce sont des zones rserves par le systme.

Page 7

Programmation des Microcontroleurs (PIC)

EL MORNAN

Figure : Organisation de la Mmoire de donnes.

Page 8

Programmation des Microcontroleurs (PIC)

EL MORNAN

2.9 Registre fonction spciale (Special Function Register : SFR) :


Les registres fonction spciales sont utiliss par le microprocesseur et les priphriques internes. Ils sont stocks
dans la RAM statique , ce qui limite 8 bits (et non 14 bits) ces registres. Les SFRs sont toujours stocks dans
les 32 premiers octets de chaque page (bank).
Registre W :
Le registre W est le registre de travail sur 8 bits pour raliser des oprations arithmtiques ou logiques.
Pointeur de pile S :
Le pointeur de pile S est un ensemble de registre sur 13 bits. Sur les PICs, il y a 8 mots de 13 bits, ce qui limite le
nombre maximal dinterruption ou dappel des sous-programmes. Le pointeur de pile S mmorise une adresse,
cest dire le contenu du compteur programme. Attention, elle nest pas manipulable, exclusivement rserve au
microprocesseur.
Compteur programme ou PC :
Le compteur programme, PC, indique ladresse du prochain code binaire 14 bits traiter. Le registre PC est
constitu de deux registres , un registre PCL constitu de 8 bits et un registre PCLATH constitu de 5 bits. Le
registre PC fait donc 13 bits qui correspondent 8192 mots de 14 bits mais dans notre cas limit 4096 mots de 14
bits (voir doc du pic16F648A).
Registre dtat (Status Register) :
Le registre dtat est un registre sur 8 bits. Chaque bit une signification particulire :

Le bit C (Carry) : C est mis 1 lorsquune opration arithmtique gnre une retenue. Il est galement utilis
comme indicateur derreur lors dune multiplication ou dune division, et sert lors de certaines oprations de
dcalage ou rotation qui peuvent passer par son intermdiaire ou non.
Le bit Z (Zro) : Z est mis 1 lorsque le rsultat de linstruction excut est nul.
Les bits RP1 et RP0 : Bits indiquants sur quelle page (bank), le microprocesseur travail en adressage direct (seul 7
bits dadresses sont ncessaires).
RP1 RP0
bank 0 (adresse 00h-7Fh) ou page 0
bank 1 (adresse 80h-FFh) ou page 1
bank 2 (adresse 100h-17Fh) ou page 2
bank 3 (adresse 180h-1FFh) ou page 3
Le bit IRP : Bit indiquant sur quelle page (bank), le microprocesseur travail en adressage indirect (8 bits
dadresses sont ncessaires).
0 : bank 0, 1 (adresse 00h-FFh) ou page 0 et 1
1 : bank 2,3 (adresse 100h-1FFh) ou page 2 et 3
E) Ports
Port A :
RA0 RA4 sont des entres du port parallle A. Ces lignes sont bidirectionnelles (sauf pour RA4 en entre
seulement). De plus elles sont partages avec certains priphriques du pic (voir doc constructeur en fonction des
besoins).
Port B :
PB0 PB7 sont des sorties du port parallle B. Ces lignes sont bidirectionnelles. De plus elles sont partages avec
certains priphriques du pic (voir doc constructeurs en fonction des besoins).
On remarque que l'cran se dcoupe en 4 champs :
Page 9

Programmation des Microcontroleurs (PIC)

EL MORNAN

Champ tiquette
Champ oprateur (code mnmonique) ou directive d'assemblage
Champ oprande
Champ commentaire
Pour passer d'un champ un autre, il suffit de mettre un espace avec la touche espace ou
TAB. Plusieurs espaces accols correspondent un seul et mme espace. Attention on ne peut sauter des champs,
c'est dire passer du champ tiquette au champ oprande. Seul le champ commentaire est un peu particulier. Si un
champ quelconque est rempli, on peut aller directement au champ commentaire. Il y a une exception, lorsqu'aucun
champ n'est rempli, l'diteur considre que toute la ligne est un champ commentaire, d'o la condition de mettre ;
en dbut de ligne.
On n'utilisera pas d'tiquette comportant plus de 8 caractres du code ASCII standard.

2.10 Directives d'assemblage :


END

Fin du fichier contenant le programme.

EQU
Permet de donner des quivalences (pour des valeurs).
Ex: FSR
EQU
H04.
Et dans le programme cela donnera :
MOVF FSR
; Ecriture de W dans FSR
#DEFINE
Permet de donner des quivalences (pour des chanes de caractres).
Ex: #DEFINE MONBIT
PORTA,1.
Et dans le programme cela donnera :
BCF MONBIT ; Met le bit 1 du port A 0 (quivalent BCF PORTA,1)

Page 10

Programmation des Microcontroleurs (PIC)

EL MORNAN

ORG

Dtermine o le compilateur doit mettre les codes qui suivent cette commande.

Ex: ORG

0x00.

_CONFIG Dtermine les fusibles qui fixeront le fonctionnement du PIC.


Ex: _CONFIG _CP_OFF & _WDT_ON & _PWRTE_ON & _HS_ON.
_CP_OFF :
_WDT_ON :
_PWRTE_ON :
_HS_ON :

Aucune protection en lecture du pic (choix par dfaut).


WatchDog en service par dfaut (le mettre OFF sur nos Kits).
Dlai de dmarrage du pic la mise sous tension (OFF par dfaut).
Oscillateur quartz grande vitesse (_XT_OSC sur nos kits : quartz lent)
(_RS_OSC par dfaut).
_BODEN_ON :
Reset du pic si chute de tension (choix par dfaut).
_LVP_ON :
Utilisation de RB3 comme broche de programmation sous 5V(choix par
dfaut).
_CPD_OFF :
Non protection en criture de la zone EEPROM (choix par dfaut).
_DATA_CP_OFF : Non protection en criture de la zone RAM (choix par dfaut).
_WRT_ON :
Non protection de la mmoire FLASH (li _CP_) (choix par dfaut).
_DEBUG_OFF :
Non utilisation dun dbuggeur (avec RB6 et RB7) (choix par dfaut).
#INCLUDE Dtermine pour le compilateur toutes les quivalences lis la structure du pic
(pour lassembleur). Aussi utilis en programmation en langage C. Cela permet

alors dinclure des fonctions ou procdures en C dj ralises.


Ex: #INCLUDE <pic16F648A>.
CBLOCK
Dtermine un bloc mmoire pour rserver des octets pour diffrentes variables.
ENDC
Fin de la dclaration pour le bloc mmoire.
Ex : CBLOCK
0x20 ; Dclaration dun bloc mmoire ladresse 0x20
TEMP
:
1
; Rservation dun octet ladresse 0x20
TABLE
:
8
; Rservation de 8 octets partir de ladresse 0x21
ENDC ;
Fin de la
dclaration
du bloc

Page 11

Programmation des Microcontroleurs (PIC)

EL MORNAN

2.11 Registres d'usage gnral


Le PIC 16F84A possde 68 registres d'usage gnral situs dans la mmoire des donnes (Data RAM).
Cela correspond donc 68 octets (68 x 8 bits) de mmoire SRAM, que vous pouvez utiliser comme
variables pour votre programme.
Les registres d'usage gnral sont indiffremment accessibles en banque 0 ou en banque 1.
Banque 0 (adresses 0x0C 0x4F)
Banque 1 (adresses 0x8C 0xCF)

Notez bien que le registre situ l'adresse 0x0C (banque 0) est aussi le registre de l'adresse 0x8C (banque
1)
Les outils de programmation (MPLAB ...) permettent d'attribuer un nom un registre.
Il est plus agrable de manipuler :
movwf compteur1
que :
movwf 0x0C

2.12 Registres spciaux


Le PIC 16F84A a 15 registres spciaux situs dans la mmoire des donnes (Data RAM).
La mmoire des donnes est divise en 2 banques :

Banque 0 (adresses 0x00 0x7F)


Banque 1 (adresses 0x80 0xFF)

-> Les registres spciaux :

TIMR0
PORTA
PORTB
EEDATA
EEADR

sont situs en banque 0.


N.B. Pour passer en banque 0, il faut au pralable excuter l'instruction :
bcf STATUS , RP0
-> Les registres spciaux :
Page 12

Programmation des Microcontroleurs (PIC)

EL MORNAN

OPTION_REG
TRISA
TRISB
EECON1
EECON2

sont situs en banque 1.


N.B. Pour passer en banque 1, il faut au pralable excuter l'instruction :
bsf STATUS , RP0
-> Les autres registres spciaux :

STATUS
INTCON
FSR , INDF
PCL
PCLATH

sont indiffremment accessibles en banque 0 ou en banque 1 (donc peu importe la valeur du bit RP0 du
registre STATUS).

3. Jeux d'instructions des PIC


Les PIC 16F84A, 16F876A et 16F877 ont le mme jeu d'instructions, constitu de seulement 35
instructions (architecture RISC : Reduced Instruction-Set Computer).
Une instruction est code par un mot de 14 bits.
La mmoire programme (de type Flash) a une taille de :

1792 octets (16F84A)


3584 octets (16F628A)
7168 octets (16F88)

ce qui permet de stocker un programme de :

1024 instructions (16F84A)


2048 instructions (16F628A)
4096 instructions (16F88)

Une instruction ncessite 1 cycle, ou bien 2 cycles dans le cas d'une instruction de branchement (GOTO,
CALL ...).
Avec une horloge quartz de 20 MHz, un cycle correspond 4/(20.106) = 200 nanosecondes.
Le microcontrleur peut donc excuter jusqu' 5 millions d'instructions par seconde !

Jeu d'instructions
Page 13

Programmation des Microcontroleurs (PIC)

EL MORNAN

W : rgistre de travail (accumulateur), taille 8 bits


k : valeur littrale, taille 8 bits

Mnmonique ,
oprande

bit du
registre nombre de
cycles
STATUS
affect

Description

k (8 bits) est charg dans (W)

MOVLW k

C, DC , Z

C, DC , Z

Additionne k (8 bits) et (W) et place le rsultat


ADDLW k
dans (W)
Soustrait W de k (8 bits) et place le rsultat
SUBLW k

dans (W)
k - (W) -> (W)
Ralise un ET logique entre k (8 bits) et (W),

ANDLW k
et place le rsultat dans (W)
Ralise un OU logique (inclusif) entre k (8 bits)
IORLW k
et (W), et place le rsultat dans (W)
Ralise un OU exclusif entre k (8 bits) et (W),
XORLW k
et place le rsultat dans (W)

L : label (tiquette)
Mnmonique ,
oprande
GOTO L

bit du registrenombre de
STATUS affect
cycles

Description
Branchement l'adresse L

Appelle un sous-programme (subroutine)


CALL L
situ l'adresse L
RETURN

Retour de sous-programme
Retour de sous-programme, avec chargement

RETLW k
de la valeur littrale k (8 bits) dans (W)
Page 14

Programmation des Microcontroleurs (PIC)

RETFIE

EL MORNAN

Retour de sous-programme d'interruption


Efface le Watchdog

CLRWDT

SLEEP Place le microcontrleur en mode sommeil

/TO, /PD

/TO, /PD

f : registre (spcial ou d'usage gnral)


b : position du bit (0 7)
Mnmonique ,
oprande

Description

bit du registre
STATUSaffect

nombre de
cycles

BCF f , b

Mise 0 du b me bit du registre f

BSF f , b

Mise 1 du b me bit du registre f

1 ou 2

1 ou 2

Si le b me bit du registre f est gal 0,


alors l'instruction suivante est ignore,
BTFSC f , b
et une instruction NOP est excute
la place (soit 2 cycles)
Si le b me bit du registre f est gal 1
, alors l'instruction suivante est ignore,
BTFSS f , b
et une instruction NOP est excute
la place (soit 2 cycles)

f : registre (spcial ou d'usage gnral)


d : registre de destination (on peut choisir entre le registre de travail W et le registre f ).
Mnmonique ,
oprande

bit du registre nombre de


Description
STATUS affect

cycles

MOVWF f

(W) est charg dans (f)

MOVF f , d

(f) (8 bits) est charg dans (destination)

C, DC , Z

ADDWF f , d

Additionne le contenu du registre f (8 bits)


et (W), et place le rsultat dans (destination)
Page 15

Programmation des Microcontroleurs (PIC)

EL MORNAN

Soustrait (W) de (f) (8 bits) et place le


SUBWF f , d

Rsultat dans (destination).

C, DC , Z

1 ou 2

1 ou 2

(f) - (W) ->(destination)


Ralise un ET logique entre (f) (8 bits)
ANDWF f , d
et (W), et place le rsultat dans (destination)
Ralise un OU logique (inclusif) entre (f)
IORWF f , d

(8 bits)et (W), et place le rsultat dans


(destination)

Ralise un OU exclusif entre (f) (8 bits) et (W),


XORWF f , d
et place le rsultat dans (destination)
Ralise le complment logique de (f)
COMF f , d
(8 bits)et place le rsultat dans (destination)
DECF f , d

Dcrmente (f) et place le rsultat dans


(destination). (f) - 1 -> (destination)
Dcrmente (f) et place le rsultat dans
(destination).Si le rsultat est 0, alors

DECFSZ f , d

l'instruction suivante est ignore, et une


instruction NOP est excute la place
(soit 2 cycles)

INCF f , d

Incrmente (f) et place le rsultat dans


(destination). (f) + 1 -> (destination)
Incrmente (f) et place le rsultat dans
(destination).Si le rsultat est 0, alors

INCFSZ f , d

l'instruction suivante est ignore, et


une instruction NOP est excute la place
(soit 2 cycles)

CLRF f

Efface le contenu du registre (f).


Remarque : le bit Z est donc mis 1.
Page 16

Programmation des Microcontroleurs (PIC)

CLRW

EL MORNAN

Efface le contenu de l'accumulateur (W).

Remarque : le bit Z est donc mis 1.


Ralise une rotation circulaire gauche :

RLF f , d

Le rsultat est plac dans (destination).


Ralise une rotation circulaire droite :

RRF f , d

Le rsultat est plac dans (destination).


Les 4 bits de poids forts et les 4 bits de poids
SWAPF f , d

faible de (f) sont changs.


Le rsultat est plac dans (destination).

NOP

Cette instruction ne fait rien (dure 1 cycle).

3.1 Modes d'adressages


On ne peut pas concevoir un programme qui ne manipule pas de donnes. Il existe quatre grands types
d'accs une donne ou modes d'adressage :
Adressage inhrent
Adressage immdiat
Adressage direct
Adressage indirect

Adressage inhrent :
Ce mode nest pas proprement parler un mode dadressage, mais tous les fabricants le dcomptent
comme tel
Les instructions agissent sur les registres internes du microprocesseur. Les instructions comportent donc un code
oprateur seul sans oprande.
CLRW
Met le registre de travail W 0 et met le bit Z 1.
Page 17

Programmation des Microcontroleurs (PIC)

EL MORNAN

Adressage immdiat
La donne est contenue dans l'instruction .La donne est contenue dans un registre.
L'adresse de la donne est contenue dans un pointeur
Exemple : movlw 0xC4; Transfert la valeur 0xC4 dans W
Adressage direct
La donne est contenue dans un registre. Ce dernier peut tre par un nom (par exemple W) ou une adresse
mmoire.
Exemple : movf 0x2B, 0
; Transfert dans W la valeur contenue l'adresse 0x2B.
!
L'adresse 0x2B peut correspondre 2 registres en fonction de la
banque
Adressage indirect

3.2 Le compteur de programme (PC)


Le PC contient l'adresse de la prochaine instruction que doit excuter le programme.
Le programme est stock dans la mmoire de programme (de type Flash, reprogrammable jusqu' 10000
fois) aux adresses 0x0000 0x3FF (soit 1024 adresses).
Le codage d'une instruction ncessite un seul emplacement mmoire : on peut donc stocker un programme
de 1024 instructions au maximum (pour le PIC 16F84A).
Le PC est constitu des deux registres spciaux :

PCL
PCLATH

Le registre spcial PCL est situ l'adresse 0x02 (banque 0) de la mmoire des donnes (Data RAM).
Ce registre est galement accessible en banque 1 ( l'adresse 0x82).
Le registre spcial PCLATH est situ l'adresse 0x0A (banque 0) de la mmoire des donnes.
Ce registre est galement accessible en banque 1 ( l'adresse 0x8A).
Le PC contient une adresse code sur 13 bits :

Le registre PCL contient l'adresse de poids faible (8 bits) du PC


Le registre PCLATH contient l'adresse de poids fort (5 bits) du PC.

Par exemple :
(PCL) = B'10110011'
(PCLATH) =B'---00010' (les bits 5 7 ne sont pas utiliss par le PIC 16F84A)
(PC) = B'0001010110011' (adresse 0x2B3 en numration hexadcimale).
Page 18

Programmation des Microcontroleurs (PIC)

EL MORNAN

La prochaine instruction que va excuter le PIC est donc situe l'adresse 0x2B3 de la mmoire de
programme.
Vous pouvez manipuler le contenu des registres PCL et PCLATH.
Par exemple, les instructions :
movlw 0x02 ; W = 0x02
movwf PCLATH ; (PCLATH) = 0x02
movlw 0xB3 ; W = 0xB3
movwf PCL ; (PCL) = 0xB3
font sauter le programme l'adresse 0x2B3 (aprs l'excution de l'instruction movwf PCL).
On a ainsi fait un GOTO "programm" (goto 0x2B3)

3.3 L'adressage relatif


L'instruction addwf PCL , f permet de faire ce que l'on appelle un adressage relatif.
Cette technique est largement utilise pour la gestion des tableaux de donnes.
- Les sous-programmes (ou routines)
- La routine d'interruption
- La pile
1- Les sous-programmes (routines)
Prenons un exemple :
...
MOVLW B'10010001'
CALL routine1
CLRW
...
...
routine1 ; tiquette de dbut de la routine
Page 19

Programmation des Microcontroleurs (PIC)

EL MORNAN

instructions de la routine
RETURN ; retour de routine
Supposons que le C en soit l'excution de l'instruction MOVLW B'10010001'.
L'instruction suivante est l'instruction CALL : il s'agit d'une instruction d'appel un sous-programme.
Le C saute alors la position dfinie par l'tiquette "routine1".
Puis, les instructions du sous-programme sont excutes.
La fin du sous-programme est signale par l'instruction RETURN (ou aussi RETLW).
Cette instruction indique qu'il faut revenir l'instruction qui suit l'instruction CALL, c'est dire dans cette
exemple CLRW.
N.B. Les instructions CALL et RETURN (ou RETLW) s'utilisent toujours par paire.

3.4 La routine d'interruption


Il s'agit d'un sous-programme particulier : il est dclench par une interruption (alors qu'un sousprogramme "classique" est appel par l'instruction CALL).

Le C se branche alors l'adresse H'0004' de la mmoire de programme (les instructions de la routine


d'interruption doivent donc commencer cette adresse).
La fin de la routine d'interruption est signale par l'instruction RETFIE.
L'instruction RETFIE provoque le retour dans le programme principal, l'endroit o il avait t
interrompu par l'apparition de l'interruption.

3.5 La pile
La pile est une zone mmoire particulire.
Page 20

Programmation des Microcontroleurs (PIC)

EL MORNAN

Pour le PIC 16F84A, elle est constitue de 8 emplacements de 13 bits.


La pile intervient dans le mcanisme interne des instructions :

CALL
RETURN
RETLW
RETFIE

En effet, c'est dans la pile qu'est mmorise l'adresse de retour d'une routine.
Quand intervient une instruction CALL ou une interruption, l'adresse de l'instruction suivante (qui se
trouve dans le compteur de programme PC) est sauvegarde dans la pile.
Quand une instruction RETURN, RETLW ou RETFIE apparat, le C lit la dernire valeur sauvegarde
dans la pile, libre l'emplacement et se branche l'adresse indique.
Avec le mcanisme de la pile, un sous-programme peut appeler un sous-programme (ou plutt un soussous-programme) : la pile rserve un autre emplacement..
La taille de la pile est limite 8 niveaux (pour le PIC 16F84A).
S'il y a plus de 8 routines actives en mme temps, le contenu de la pile est cras et le programme ne
fonctionne plus correctement.
Cela se traduit par un plantage (le C ne fait plus rien) ou bien par un comportement plus ou moins
incohrent (le C fait des choses bizarres) ... problmes que l'on retrouve exactement sur des programmes
plus complexes (Windows de Microsoft ...).
Remarques :
- il ne peut y avoir qu'une seule routine d'interruption (car un seul vecteur d'interruption : H'0004')
- la routine d'interruption peut appeler un sous-programme (avec l'instruction CALL)
- un sous-programme ne doit pas s'appeler lui-mme

3.6 Le compteur
Le PIC 16F84 est dot d'un compteur 8 bits. La Figure en donne l'organigramme

Page 21

Programmation des Microcontroleurs (PIC)

EL MORNAN

Figure: Organigramme du Timer0.

3.7 Registre TMR0


C'est le registre de 8 bits qui donne la valeur du comptage ralis. Il est accessible en lecture et en
criture l'adresse 01h dans la banque 0..
Choix de l'horloge
Le timer0 peut fonctionner suivant deux modes en fonction du bit T0CS (OPTION_REG.5). En
mode timer (T0CS=0), le registre TMR0 est incrment chaque cycle machine (si le pr-diviseur n'est pas
slectionn).
En mode compteur (T0CS=1), le registre TMR0 est incrment sur chaque front montant ou chaque front
descendant du signal reu sur la broche RA4/T0CKl en fonction du bit T0SE
(OPTION_REG.4). Si T0SE=0, les fronts montants sont compts, T0SE=1, les fronts descendants sont
compts.
Pr-diviseur
En plus des deux horloges, un pr-diviseur, partag avec le chien de garde, est disponible. La priode de
l'horloge d'entre est divise par une valeur comprise entre 2 et 256 suivant les bits PS2,
PS1 et PS0 (respectivement OPTION_REG.2, .1 et .0) (Figure). Le bit PSA (OPTION_REG.3) permet de
choisir entre la pr-division de timer0 (PSA=0) ou du chien de garde (PSA=1).

Figure : Valeurs du pr-diviseur en fonction de PSA, PS2, PS2 et PS0.

Page 22

Programmation des Microcontroleurs (PIC)

EL MORNAN

Fin de comptage et interruption


Le bit T0IF (INTCON.2) est mis 1 chaque fois que le registre TMR0 passe de FFh 00h. On peut donc
tester
ce bit pour connatre la fin de comptage. Pour compter 50 vnements, il faut donc charger TMR0 avec la
valeur 256-50=206 et attendre le passage de T0IF 1. Cette mthode est simple mais bloque le processeur
dans une boucle d'attente.
On peut aussi reprer la fin du comptage grce l'interruption que peut gnrer T0IF en passant 1
Le processeur est ainsi libre de travailler en attendant cet vnement.
Registres utiles la gestion de timer0
Plusieurs registres ont t voqus dans ce paragraphe. Ils sont synthtiss dans la Figure

Figure: Registres utiles la gestion de timer0.

Page 23

Programmation des Microcontroleurs (PIC)

EL MORNAN

4. Bits (ou "fusibles") de configuration


On se place dans le cadre de l'outil de dveloppement MPLAB de Microchip.
La syntaxe utilise est alors :
Nom

Valeurs
possibles

Signification
Rend impossible la lecture de la mmoire de programme
Flash

ON

CP

et de l'EEPROM ( travers un programmateur)


C'est une protection contre le piratage industriel.

(Code Protection bit)


OFF

Lecture possible

ON

A la mise sous tension du C, lance une temporisation


d'environ 72 ms durant laquelle est effectu un RESET
interne.

PWRTE
(Power-up Timer
Enable bit)

Il est conseill d'utiliser cette configuration.


OFF

Temporisation dsactive

WDT

ON

Active le watchdog (chien de garde)

(Watchdog Timer
Enable bit)

OFF

Dsactive le watchdog
Oscillateur de type Rsistance / Condensateur

RC

OSC
(Oscillator Selection
bits)

Remarques : conomique, rserv aux applications o


la prcision de la base de temps n'est pas critique.

HS

Oscillateur quartz haute frquence (4 MHz, 20 MHz ...).

XT

Oscillateur quartz ou rsonateur cramique

LP

Oscillateur quartz de faible puissance (32,768 kHz ...)

Exemple de configuration
Dans le code source (fichier avec extension .asm), les fusibles de configuration sont indiqus au
compilateur avec la directive suivante :
__config _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC
Page 24

Programmation des Microcontroleurs (PIC)

EL MORNAN

Remarque

Les bits de configuration ne sont pas modifiables.


Dans l'exemple ci-dessus, pour activer le watchdog et utiliser un oscillateur de type RC, il faut modifier le
code source, recompiler et reprogrammer le C ...
__config _CP_OFF & _WDT_ON & _PWRTE_ON & _RC_OSC

5. Les interruptions
Le PIC 16F84A dispose de 4 sources d'interruptions :
1.
Interruption sur la broche RB0/INT
2.
Interruption "RB" : sur changement du niveau logique d'au moins une de ces 4 broches : RB4,
RB5, RB6 ou RB7 (port B)
3.
Interruption de dbordement du registre TMR0 (H'FF' -> H'00')
4.
Interruption de fin d'criture de l'EEPROM

5.1 - Le mcanisme des interruptions


Quand une interruption survient, le programme principal est interrompu :
Le C finit l'excution de l'instruction en cours puis il se branche vers le sous-programme d'interruption (la
routine d'interruption).
Quand la routine d'interruption est acheve (instruction retfie), le C retourne au programme principal,
l'endroit exact o il l'avait quitt.

5.2 - Cas d'une seule source d'interruption


Imaginons une application o l'on dsire utiliser l'interruption sur la broche RB0/INT.
Il peut s'agir d'un bouton poussoir connect sur la broche RB0/INT :
Page 25

Programmation des Microcontroleurs (PIC)

EL MORNAN

/RBPU = 0 : activation des rsistances de pull-up du port B (bit 7 du registre OPTION_REG)


INTEDG = 0 : l'interruption de la broche RB0/INT est active sur un front descendant (bit 6 du
registre OPTION_REG)

On veut donc provoquer une interruption quand on appuie sur le bouton poussoir.
Pour cela, il faut commencer par autoriser les interruptions de manire globale :

GIE = 1 (bit 7 du registre INTCON)

Puis, on autorise uniquement l'interruption qui nous intresse :

INTE = 1 (bit 4 du registre INTCON) : autorise l'interruption sur la broche RB0/INT


RBIE = 0 (bit 3 du registre INTCON) : dsactive l'interruption "RB"
T0IE = 0 (bit 5 du registre INTCON) : dsactive l'interruption de dbordement du registre TMR0
EEIE = 0 (bit 6 du registre INTCON) : dsactive l'interruption de fin d'criture de l'EEPROM

Enfin, on initialise le drapeau (flag) INTF 0 (bit 1 du registre INTCON).


Tout cela se fait pendant la phase d'initialisation du programme principal par :
movlw B'10010000'
movwf INTCON
Maintenant, quand on appuie sur le bouton poussoir, le drapeau INTF est automatiquement mis 1.
Le C prend en compte cette interruption quand il a connaissance du niveau haut de drapeau INTF (3 ou 4
cycles de dlai).
Le mcanisme des interruptions est lanc (voir plus haut).
Important :

Il faut remettre le drapeau INTF 0 avant de quitter la routine d'interruption (bcf


INTCON, INTF).

Sinon, le C se rebranche indfiniment sur la routine d'interruption (puisque INTF = 1) : le programme est
plant !
Sauvegarde et restauration du contexte de travail
Page 26

Programmation des Microcontroleurs (PIC)

EL MORNAN

Il est important que le contexte de travail du programme principal soit le mme avant et aprs l'excution
de la routine d'interruption.
Cela concerne le registre STATUS et l'accumulateur W qui doivent retrouver le mme contenu (en effet,
ces deux registres sont souvent utiliss et donc modifis pendant la routine d'interruption).
Voici la procdure prconise par Microchip :
La routine d'interruption commence par la sauvegarde du registre W puis du registre STATUS :
org H'0004' ; vecteur d'interruption (directive du compilateur MPLAB)
movwf W_TEMP
swapf STATUS, W
movwf STATUS_TEMP
La routine d'interruption finit par la restauration du registre STATUS puis du registre W :
swapf STATUS_TEMP, W
movwf STATUS
swapf W_TEMP, f
swapf W_TEMP, W
retfie ; retour d'interruption

Page 27

Programmation des Microcontroleurs (PIC)

EL MORNAN

Page 28

Programmation des Microcontroleurs (PIC)

EL MORNAN

5.3 - Cas de plusieurs sources d'interruption


On suppose que les 4 sources d'interruptions sont actives :

GIE = 1
INTE = 1
RBIE = 1
T0IE = 1
EEIE = 1

Dans la routine d'interruption (aprs avoir sauvegard le registre W et le registre STATUS), se pose la
question suivante : quelle est la source de l'interruption ?
La rponse se fait en testant, les uns aprs les autres, le niveau logique des drapeaux :

INTF (bit 1 du registre INTCON)


RBIF (bit 3 du registre INTCON)
T0IF (bit 2 du registre INTCON)
EEIF (bit 4 du registre EECON1)

Par exemple, supposons que l'interruption est due au dbordement du registre TMR0 :

INTF = 0
RBIF = 0
T0IF = 1
EEIF = 0

Aprs le test, le C se branche vers le bloc de traitement spcifique de l'interruption TMR0.


Il ne faut pas oublier d'effacer le drapeau T0IF.
On finit par la restauration du registre STATUS puis du registre W.
Il peut arriver qu'il y ait plusieurs sources d'interruptions en mme temps :

INTF = 1
RBIF = 1
T0IF = 0
EEIF = 0

Dans ce cas, on se peut se contenter de traiter une seule source d'interruption la fois.
Ce sera l'interruption RB0/INT s'il se trouve que le drapeau INTF est test en premier.
Aprs retour dans le programme principal, on aura :

INTF = 0
RBIF = 1
T0IF = 0
EEIF = 0

Page 29

Programmation des Microcontroleurs (PIC)

EL MORNAN

L'interruption "RB" est alors traite, etc ...


On voit ici que l'on peut choisir des niveaux de priorits entre les diffrentes sources d'interruptions.

Page 30

Programmation des Microcontroleurs (PIC)

EL MORNAN

6. Le mode SLEEP
6.1 Prambule
L'utilisation du mode SLEEP (Power-down mode) n'a d'intrt que dans les applications alimentes par
piles ou batteries.En effet, en mode SLEEP la consommation lectrique du C devient trs faible.

6.2 Mise en mode Sommeil


Le C est plac en mode SLEEP aprs une instruction SLEEP.
L'instruction SLEEP provoque :
La mise 0 du bit /PD du registre STATUS
La mise 1 du bit /TO du registre STATUS
L'inhibition de l'horloge (broches OSC1/CLKIN et OSC2/CLKOUT) ce qui a pour consquence
d'arrter le programme (d'o une consommation d'nergie lectrique rduite)

Le mise 0 du timer du watchdog (chien de garde)

Attention : le timer du watchdog continue de fonctionner pendant le mode SLEEP (si le watchdog est
actif).

6.3 Rveil (Power-up)


Le C se rveille, et reprend une activit normale, quand :

Il y a un RESET externe (niveau bas sur la broche /MCLR) : le programme est rinitialis (adresse
H'0000' de la mmoire de programme).

La temporisation du watchdog est dpasse (si le watchdog est actif) : le programme reprend
l'instruction qui suit l'instruction SLEEP.

Une interruption RB0/INT, RB ou EEPROM survient (si ces interruptions sont autorises) mme
quand le bit GIE (du registre INTCON) est gal 0 :
o
si GIE = 0 : le programme reprend l'instruction qui suit l'instruction SLEEP
o
si GIE = 1 : l'instruction qui suit l'instruction SLEEP est excute puis le programme saute
la routine d'interruption (adresse H'0004' de la mmoire de programme)

Remarque : l'interruption TMR0 ne peut pas rveiller le C.


Page 31

Programmation des Microcontroleurs (PIC)

EL MORNAN

7. Le timer WATCHDOG (chien de garde)


7.1 Prambule
Le timer watchdog (le watchdog pour simplifier) est un dispositif qui permet au C de reprendre la main en
cas de plantage.
Nous entendons par plantage :

la consquence d'un bug (dans ce cas, c'est une erreur humaine et il faut corriger le programme)
la consquence d'une perturbation lectrique qui fait sauter le programme une adresse
quelconque et inattendue

Le plantage se traduit gnralement par un "blocage" : le C ne fait plus rien ou bien des choses tranges.
Il faut alors faire un RESET externe (en supposant qu'un bouton poussoir sur la broche /MCLR a t prvu
cet effet) :

Autrement, il faut couper l'alimentation, attendre quelques secondes que les condensateurs de filtrage se
dchargent, et remettre en route. Nous allons voir que le watchdog, par logiciel, permet de faire un
RESET interne.

7.2 Reset du watchdog


Pour utiliser le watchdog, il faut choisir de l'activer : cela se fait au niveau des bits de configuration.
Il faut ensuite placer (judicieusement) dans le programme l'instruction CLRWDT.
Cette instruction remet 0 le timer du watchdog.
Si le timer watchdog dpasse une certaine dure, cela provoque un RESET interne : le programme est
rinitialis (adresse H'0000' de la mmoire de programme).
Cette dure dpend des bits PSA, PS2, PS1 et PS0 du registre OPTION_REG :

Page 32

Programmation des Microcontroleurs (PIC)

PSA PS2, PS1, PS0

Taux de
prdivision

EL MORNAN

Dure
indicative

du Watchdog
0

XXX

18 ms

000

18 ms

001

36 ms

010

72 ms

011

144 ms

100

16

288 ms

101

32

576 ms

110

64

1,15 s

111

128

2,3 s

X = 0 ou 1
En effaant le watchdog intervalles rguliers (avec CLRWDT), le timer ne doit normalement jamais
"dborder".
En cas de plantage, le timer dborde ce qui gnre un RESET, et le programme redmarre.
Remarques :
L'instruction CLRWDT :

met 1 le bit /TO du registre STATUS


met 1 le bit /PD du registre STATUS

En cas de dbordement du watchdog :

le bit /TO est mis 0

3- Cas particulier du mode SLEEP


En mode SLEEP, le C se rveille si la temporisation du watchdog est dpasse (si le watchdog est actif).
Mais il n'y a pas RESET : le programme reprend l'instruction qui suit l'instruction SLEEP.

le bit /TO est mis 0


Page 33

Programmation des Microcontroleurs (PIC)

EL MORNAN

le bit /PD est mis 0

7.3 Reset
Il y a plusieurs types de Reset :

Reset la mise sous tension (POR : Power-on Reset)


Reset externe en mode de fonctionnement normal (niveau bas sur la broche /MCLR)
Reset externe pendant le mode SLEEP (niveau bas sur la broche /MCLR)
Reset d au Watchdog (en mode de fonctionnement normal)
Rveil d au Watchdog (en mode SLEEP)

7-3-1- Reset la mise sous tension (POR : Power-on Reset)


Un Reset interne a lieu la mise sous tension, ou aprs une coupure de courant.
Le programme est initialis (adresse H'0000' de la mmoire de programme).

Le bit /TO (du registre STATUS) est mis 1


Le bit /PD (du registre STATUS) est mis 1

7-3-2- Reset externe (en mode de fonctionnement normal)


Quand on appuie sur le bouton poussoir, la broche /MCLR passe au niveau bas, ce qui gnre un Reset
"externe" :

Le programme est rinitialis (adresse H'0000' de la mmoire de programme).

Le bit /TO (du registre STATUS) est mis 1


Le bit /PD (du registre STATUS) est mis 1

7-3-3- Reset externe pendant le mode SLEEP


On se place dans le cas o le C est plac en mode SLEEP (suite l'instruction SLEEP).
Quand on appuie sur le bouton poussoir, la broche /MCLR passe au niveau bas, ce qui gnre un Reset
"externe" :

Page 34

Programmation des Microcontroleurs (PIC)

EL MORNAN

Le C se rveille, le programme est rinitialis (adresse H'0000' de la mmoire de programme).


Le bit /TO (du registre STATUS) est mis 1
Le bit /PD (du registre STATUS) est mis 0

7-3-4- Reset d au Watchdog (en mode de fonctionnement normal)


Quand le timer Watchdog dborde, un Reset interne est ralis :
Le programme est rinitialis (adresse H'0000' de la mmoire de programme).
Le bit /TO (du registre STATUS) est mis 0
Le bit /PD (du registre STATUS) est mis 1

7-3-5- Rveil d au Watchdog (en mode SLEEP)


En mode SLEEP, le C se rveille si le timer watchdog dborde (si le watchdog est actif).
Mais il n'y a pas RESET : le programme reprend l'instruction qui suit l'instruction SLEEP.
Le bit /TO (du registre STATUS) est mis 0
Le bit /PD (du registre STATUS) est mis 0

7-3-6 - Bits /TO et /PD du registre STATUS


Ces bits sont en lecture seule.
/TO

/PD

Condition

Reset la mise sous tension (Power-on Reset POR)

Reset externe (en mode de fonctionnement normal)

Reset d au Watchdog (en mode de fonctionnement normal)

Rveil d au Watchdog (en mode SLEEP)

Reset externe pendant le mode SLEEP


Rveil d une interruption
Page 35

Programmation des Microcontroleurs (PIC)

EL MORNAN

En testant si /TO = 0, on peut savoir si le Reset est d un plantage (dbordement de Watchdog), et


orienter la suite de programme en consquence

8. Accs la mmoire EEPORM


Le PIC possde une zone EEPROM de 64 octets accessibles en lecture et en criture par le programme.
On peut y sauvegarder des valeurs, qui seront conserves mme si l'alimentation est teinte, et les
rcuprer lors de la mise sous tension. Leur accs est spcifique et requiert l'utilisation
de registres ddis. La lecture et l'criture ne peut s'excuter que selon des squences particulires.

8.1 . Registres utiliss


Quatre registres sont utiliss pour l'accs la mmoire eeprom du PIC :
- EEDATA contient la donne.
- EEADR contient l'adresse.
- EECON1 (Figure* VIII.1) est le registre de contrle de l'accs l'eeprom. Cinq bits permettent un cet
accs :
- RD et WR initient la lecture ou l'criture. Ils sont mis 1 par le programme pour initier l'accs et mis
zro par le systme la fin de l'accs.
- WREN autorise (1) ou non (0) l'accs en criture.
- WRERR est mis 1 par le systme quand une opration d'criture est interrompue par MCLR, reset ou le
chien de garde.
- EEIF est un drapeau d'interruption signalant la fin de l'criture physique dans la mmoire eeprom. Il doit
tre mis 0 par programme.

Figure : Registre EECON1.


Page 36

Programmation des Microcontroleurs (PIC)

EL MORNAN

- EECON2 joue un rle spcifique lors de l'criture.

8.2 Lecture
Pour lire une donne dans la mmoire eeprom, il faut mettre l'adresse dans EEADR et positionner RD 1.
La valeur lue est alors disponible dans EEDATA au cycle machine suivant. Le programme ci-dessous
donne un exemple de lecture dans la mmoire eeprom.

8.3 Ecriture
Pour crire une donne dans la mmoire eeprom, il faut d'abord mettre l'adresse dans EEADR et la donne
dans EEDATA. Un cycle bien spcifique doit ensuite tre respecter pour que l'criture ait lieu. L'exemple
suivant donne le cycle :

Page 37

Programmation des Microcontroleurs (PIC)

EL MORNAN

9. Remarques et astuces de programmation en


assembleur
9-1- Charger une valeur littrale dans un registre
movlw B'10001100' ; W = B'10001100'
movwf REGISTRE ; (REGISTRE) = B'10001100' = 0x8C = D'140'
9-2- Charger un registre avec le contenu d'un autre registre

movf REGISTRE1 , W ; W = (REGISTRE1)


movwf REGISTRE2 ; (REGISTRE2) = (REGISTRE1)
9-3- Echanger le contenu de deux registres : (REGISTRE1) < - > (REGISTRE2)

Il faut utiliser une variable intermdiaire :


REGISTRE_TEMP (registre d'usage gnral)

movf REGISTRE1 , W ; W = (REGISTRE1)


movwf REGISTRE_TEMP ; (REGISTRE_TEMP) = (REGISTRE1)
movf REGISTRE2, W ; W = (REGISTRE2)
movwf REGISTRE1 ; (REGISTRE1) = (REGISTRE2)
movf REGISTRE_TEMP, W ; W = (REGISTRE_TEMP)
movwf REGISTRE2 ; (REGISTRE2) = (REGISTRE_TEMP)
9-4 Tests de comparaison
9-4- Tests d'galit
9-4-1- Le contenu du registre est-il nul ?
(REGISTRE) = 0x00 ?

Page 38

Programmation des Microcontroleurs (PIC)

EL MORNAN

movf REGISTRE , f ; (REGISTRE) = (REGISTRE)


btfss STATUS , Z ; test du bit Z
goto non ; Z = 0 c'est--dire (REGISTRE) != 0x00
{ bloc d'instructions 1 }
goto suite
non
{ bloc d'instructions 2 }
suite
{ suite du programme }

9-4-2- Le contenu du registre est-il diffrent de zro ?


(REGISTRE) != 0x00 ?

Page 39

Programmation des Microcontroleurs (PIC)

EL MORNAN

movf REGISTRE , f ; (REGISTRE) = (REGISTRE)


btfsc STATUS , Z ; test du bit Z
goto non ; Z = 1 c'est--dire (REGISTRE) = 0x00
{ bloc d'instructions 1 }
goto suite
non
{ bloc d'instructions 2 }
suite
{ suite du programme }

9-4-3- Le contenu du registre est-il gal une certaine valeur ?


(REGISTRE) = 0x3F ?

Page 40

Programmation des Microcontroleurs (PIC)

EL MORNAN

movlw 0x3F ; W = 0x3F


subwf REGISTRE, W ; W = (REGISTRE) - 0x3F
btfss STATUS, Z ; test du bit Z
goto non ; Z = 0 c'est--dire (REGISTRE) != 0x3F
{ bloc d'instructions 1 }
goto suite
non
{ bloc d'instructions 2 }
suite
{ suite du programme }
9-4-4- Le contenu du registre est-il diffrent d'une certaine valeur ?
(REGISTRE) != 0x3F ?

Page 41

Programmation des Microcontroleurs (PIC)

EL MORNAN

movlw 0x3F ; W = 0x3F


subwf REGISTRE, W ; W = (REGISTRE) - 0x3F
btfsc STATUS, Z ; test du bit Z
goto non ; Z = 1 c'est--dire (REGISTRE) = 0x3F
{ bloc d'instructions 1 }
goto suite
non
{ bloc d'instructions 2 }
suite
{ suite du programme }

9-4-5- Le contenu du registre est-il gal au contenu d'un autre registre ?


(REGISTRE1) = (REGISTRE2) ?

Page 42

Programmation des Microcontroleurs (PIC)

EL MORNAN

movf REGISTRE2 , W ; W = (REGISTRE2)


subwf REGISTRE1, W ; W = (REGISTRE1) - (REGISTRE2)
btfss STATUS, Z ; test du bit Z
goto non ; Z = 0 c'est--dire (REGISTRE1) != (REGISTRE2)
{ bloc d'instructions 1 }
goto suite
non
{ bloc d'instructions 2 }
suite
{ suite du programme }
9-4-6- Le contenu du registre est-il diffrent du contenu d'un autre registre ?
(REGISTRE1) != (REGISTRE2) ?

Page 43

Programmation des Microcontroleurs (PIC)

EL MORNAN

movf REGISTRE2 , W ; W = (REGISTRE2)


subwf REGISTRE1, W ; W = (REGISTRE1) - (REGISTRE2)
btfsc STATUS, Z ; test du bit Z
goto non ; Z = 1 c'est--dire (REGISTRE1) = (REGISTRE2)
{ bloc d'instructions 1 }
goto suite
non
{ bloc d'instructions 2 }
suite
{ suite du programme }
9-4-7 - Le contenu du registre est-il strictement suprieur une certaine valeur ?
(REGISTRE) > 0x3F ?
Les valeurs sont supposes en binaire naturel.

Page 44

Programmation des Microcontroleurs (PIC)

EL MORNAN

movf REGISTRE , W ; W = (REGISTRE)


sublw 0x3F ; W = 0x3F - (REGISTRE)
btfsc STATUS, C ; test du bit C (Carry)
goto non ; C = 1 c'est--dire 0x3F >= (REGISTRE)
{ bloc d'instructions 1 }
goto suite
non
{ bloc d'instructions 2 }
suite
{ suite du programme }
9-4-8 - Le contenu du registre est-il suprieur ou gal une certaine valeur ?
(REGISTRE) >= 0x3F ?
Les valeurs sont supposes en binaire naturel.

Page 45

Programmation des Microcontroleurs (PIC)

EL MORNAN

movlw 0x3F ; W = 0x3F


subwf REGISTRE, W ; W = (REGISTRE) - 0x3F
btfss STATUS, C ; test du bit C (Carry)
goto non ; C = 0 c'est--dire (REGISTRE) < 0x3F
{ bloc d'instructions 1 }
goto suite
non
{ bloc d'instructions 2 }
suite
{ suite du programme }
9-4-9 - Le contenu du registre est-il strictement infrieur une certaine valeur ?
(REGISTRE) < 0x3F ?
Les valeurs sont supposes en binaire naturel.

Page 46

Programmation des Microcontroleurs (PIC)

EL MORNAN

movlw 0x3F ; W = 0x3F


subwf REGISTRE, W ; W = (REGISTRE) - 0x3F
btfsc STATUS, C ; test du bit C (Carry)
goto non ; C = 1 c'est--dire (REGISTRE) >= 0x3F
{ bloc d'instructions 1 }
goto suite
non
{ bloc d'instructions 2 }
suite
{ suite du programme }

9-4-10 - Le contenu du registre est-il infrieur ou gal une certaine valeur ?


(REGISTRE) <= 0x3F ?
Les valeurs sont supposes en binaire naturel.

Page 47

Programmation des Microcontroleurs (PIC)

EL MORNAN

movf REGISTRE , W ; W = (REGISTRE)


sublw 0x3F ; W = 0x3F - (REGISTRE)
btfss STATUS, C ; test du bit C (Carry)
goto non ; C = 0 c'est--dire 0x3F < (REGISTRE)
{ bloc d'instructions 1 }
goto suite
non
{ bloc d'instructions 2 }
suite
{ suite du programme }
9-4-11 - Le contenu du registre est-il suprieur ou gal au contenu d'un autre registre ?
(REGISTRE1) >= (REGISTRE2) ?
Les valeurs sont supposes en binaire naturel.

Page 48

Programmation des Microcontroleurs (PIC)

EL MORNAN

movf REGISTRE2 , W ; W = (REGISTRE2)


subwf REGISTRE1, W ; W = (REGISTRE1) - (REGISTRE2)
btfss STATUS, C ; test du bit C (Carry)
goto non ; C = 0 c'est--dire (REGISTRE1) < (REGISTRE2)
{ bloc d'instructions 1 }
goto suite
non
{ bloc d'instructions 2 }
suite
{ suite du programme }
9-4-12 - Le contenu du registre est-il strictement infrieur au contenu d'un autre registre ?
(REGISTRE1) < (REGISTRE2) ?
Les valeurs sont supposes en binaire naturel.

Page 49

Programmation des Microcontroleurs (PIC)

EL MORNAN

movf REGISTRE2 , W ; W = (REGISTRE2)


subwf REGISTRE1, W ; W = (REGISTRE1) - (REGISTRE2)
btfsc STATUS, C ; test du bit C (Carry)
goto non ; C = 1 c'est--dire (REGISTRE1) >= (REGISTRE2)
{ bloc d'instructions 1 }
goto suite
non
{ bloc d'instructions 2 }
suite
{ suite du programme }
9-5- Boucle Do While
Exemple :

Page 50

Programmation des Microcontroleurs (PIC)

EL MORNAN

debut
{ bloc d'instructions }
movf REGISTRE , f
btfsc STATUS , Z
goto debut
suite
{ suite du programme }
9-6- Boucle While
Exemple :

Page 51

Programmation des Microcontroleurs (PIC)

EL MORNAN

debut
movlw 0xE8 ; W = 0xE8
subwf REGISTRE, W ; W = (REGISTRE) - 0xE8
btfss STATUS , Z
goto suite
{ bloc d'instructions }
goto debut
suite
{ suite du programme }
9-7- Boucle FOR
Une variable (1 octet) sert de compteur.
Exemple :
Pour excuter le bloc d'instructions 20 fois, la valeur initiale du compteur doit tre 21 :

Page 52

Programmation des Microcontroleurs (PIC)

EL MORNAN

movlw D'21' ; W = D'21'


movwf COMPTEUR ; (COMPTEUR) = D'21' pour 20 boucles
debut
decfsz COMPTEUR , f ; (COMPTEUR) = (COMPTEUR) - 1
goto boucle ; (COMPTEUR) != 0
goto suite ; (COMPTEUR) = 0
boucle
{ bloc d'instructions }
goto debut
suite
Page 53

Programmation des Microcontroleurs (PIC)

EL MORNAN

{ suite du programme }
N.B. Avec (COMPTEUR) = 0xFF en valeur initiale, on effectue 254 boucles.
Avec (COMPTEUR) = 0x00 en valeur initiale, on effectue 255 boucles.
Avec (COMPTEUR) = 0x01 en valeur initiale, on effectue 0 boucle.
9-8- Manipulation de bits. Les masques
9-8-1- Mettre 0 certains bits d'un registre
Exemple : on veut mettre 0 les bits 1, 2, 4 et 6, les autres bits tant inchangs :
B'u0u0u00u'
movlw B'10101001' ; W = B'10101001' (on appelle a un masque)
andwf REGISTRE , f ; fonction ET logique
Valeur initiale : (REGISTRE) = B'11010101'
Valeur finale : (REGISTRE) = B'10000001'
N.B. S'il n'y a qu'un seul bit mettre 0, il faut simplement utiliser l'instruction bcf.
S'il faut mettre tous les bits 0, il faut simplement utiliser l'instruction clrf REGISTRE
9-8-2- Mettre 1 certains bits d'un registre
Exemple : on veut mettre 1 les bits 1, 2, 4 et 6, les autres bits tant inchangs :
B'u1u1u11u'
movlw B'01010110' ; W = B'01010110' (masque)
iorwf REGISTRE , f ; fonction OU logique

Valeur initiale : (REGISTRE) = B'11010101'


Valeur finale : (REGISTRE) = B'11010111'
N.B. s'il n'y a qu'un seul bit mettre 1, il faut simplement utiliser l'instruction bcf
9-8-3- Inverser certains bits d'un registre
Exemple : on veut complmenter les bits 1, 2, 4 et 6, les autres bits tant inchangs.
movlw B'01010110' ; W = B'01010110' (masque)
Page 54

Programmation des Microcontroleurs (PIC)

EL MORNAN

xorwf REGISTRE , f ; fonction logique OU exclusif


Valeur initiale : (REGISTRE) = B'11010101'
Valeur finale : (REGISTRE) = B'10000011'
N.B. s'il faut inverser tous les bits, il faut simplement utiliser l'instruction
comf REGISTRE , f
9-9- Tables de donnes
On utilise la technique de l'adressage relatif.

Exemple :

On dsire effectuer l'opration arithmtique : y = 10x +1


Ainsi, pour x =D'16' : y = D'161'
Cela peut se faire simplement avec un tableau de donnes.
On commence par crer la routine table.
Pour des raisons de simplicit, l'adresse de dbut de cette routine peut tre (pour un microcontrleur
16F84A) :

0x100
0x200
0x300

; xxxxxxxxxxx
; Routine table
; xxxxxxxxxxx
org 0x0300 ; adresse de dbut de la table
table
addwf PCL , f ; (PCL) = (PCL) + W
retlw D'1'
retlw D'11'
retlw D'21'
retlw D'31'

Page 55

Programmation des Microcontroleurs (PIC)

EL MORNAN

retlw D'41'
retlw D'51'
retlw D'61'
retlw D'71'
retlw D'81'
retlw D'91'
retlw D'101'
retlw D'111'
retlw D'121'
retlw D'131'
retlw D'141'
retlw D'151'
retlw D'161'
retlw D'171'
retlw D'181'
retlw D'191'
retlw D'201'
retlw D'211'
retlw D'221'
retlw D'231'
retlw D'241'
retlw D'251'
; Fin de la routine table
; xxxxxxxxxxxxxxxxxx
Avec un dbut de routine l'adresse 0x300, l'instruction retlw D'1' se trouve l'adresse 0x301, retlw
D'11' l'adresse 0x302 etc...

Page 56

Programmation des Microcontroleurs (PIC)

EL MORNAN

La table peut contenir jusqu' 255 lments (0x301 0x3FF).


Ici, notre table possde 26 lments donc pas de problme de taille.

Dans le programme principal, pour appeler la routine, il faut au pralable charger le registre spcial
PCLATH avec la valeur 0x03 (0x02 si l'adresse de dbut est 0x200 etc ...) :
movlw 0x03 ; W = 0x03
movwf PCLATH ; (PCLATH) = 0x03
movlw D'16' ; W = D'16' : 16me ligne de la table
call table
movwf resultat ; (resultat) = D'161'

10. les tapes ncessaires pour programmer un pic :

Page 57

Programmation des Microcontroleurs (PIC)

EL MORNAN

11. Exemples en assembleur avec 16F84


11.1 Calcul de la temporisation
Temporisation prcise

: utilisation du timer

Temporisation non prcise : utilisation des boucles


A chaque fois que lon dsire fabriquer une temporisation, il faut calculer le temps machine ncessaire
pour excuter cette temporisation afin de dterminer la valeur exacte de la temporisation.
Sachant que lhorloge interne divise par quatre la frquence issue du quartz.
Prenons lexemple dune temporisation avec un quartz de 4Mhz : linstruction GOTO TEMPO dure 2
cycles , et linstruction DECFSZ 1cycle. Le compteur (retard) est initialis 255. Le PIC fera 255 fois la
boucle de temporisation : la temporisation est donc 3*255=765s(3cycles *255*1s)

11.2 Exemple dune temporisation de 0.2s


;------------ Dfinition des registres temporaires --------------retard1

EQU

0x0C

; le registre temporaire retard1 se trouve l' adresse 0C

retard2

EQU

0x0F

; le registre temporaire retard2 se trouve l' adresse 0F

;------------ Programme de temporisation ( 0.2 s ) --------------MOVLW 0xFF

; on met 255 dans le registre W

MOVWF retard1
MOVWF retard2

; on charge retard1 avec 255 ( FFh contenu du registre W )


; on charge retard2 avec 255 ( FFh contenu du registre W )

tempo
DECFSZ retard1,F

; on dcrmente retard1 et on saute la prochaine instruction si

GOTO tempo

; le registre retard1 = 0 sinon retour tempo

MOVLW 0xFF

; on met 255 dans le registre W

MOVWF retard1

; on charge retard1 avec 255 ( FFh contenu du registre W )

DECFSZ retard2,F

; on dcrmente retard1 et on saute la prochaine instruction si

GOTO tempo

; le registre retard1 = 0 sinon retour tempo

RETURN

; retour au programme principal aprs l 'instruction CALL

Page 58

Programmation des Microcontroleurs (PIC)

EL MORNAN

11.3 Exemple de temporisateur interne utilisant le Timer


; Titre : TIMER du PIC
; PIC utilis : PIC 16 F 84
; on utilise le timer pour avoir une temporisation multiple de la seconde
; si le registre OPTION =
; 04 --> 1 S
; 05 --> 4 S
; 07 --> 8 S
; 03 --> 0.5 S
; 02 --> 0.25 S
; 01 --> 0.0125 S
; 00 --> 0.00625 S
; le timer fonctionne avec la frquence interne Q = 4 MHz
;------------ Directive d' assemblage pour PLAB --------------list

p=16f84A

#include p16f84A.inc
__config H'3FF9'
;------------ Dfinition des constantes ---------------

EQU

0x00

; variable W = 0

EQU

0x01

; variable F = 1

;------------ Dfinition des registres temporaires --------------retard1

EQU

0x0C

key

EQU

0x12

OPTION_REG EQU

; le registre temporaire retard1 se trouve l' adresse 0C

H'0081'
Page 59

Programmation des Microcontroleurs (PIC)

EL MORNAN

;------------ Init des ports A et B --------------ORG 0


bsf STATUS,5

; on met 1 le 5eme bit du registre status pour accder


; la 2eme page mmoire ( pour trisa et trisb et OPTION )

MOVLW 0x00

; on met 00 dans le registre W

MOVWF TRISB

; on met 00 dans le port B il est programm en sortie

MOVLW 0x1F

; on met 1F dans le registre W

MOVWF TRISA

; on met 1F dans le port A il est programm en entre

MOVLW 0x07

; on met 07 dans le registre W

MOVWF OPTION_REG

; on met 07 dans le registre OPTION ( 8 secondes )

; 1MHz / 256 = 3.906 kHz


bcf STATUS,5

; on remet 0 le 5eme bit du registre status pour accder


; la 1eme page mmoire

clrf PORTB
clrf key
;-------------------- Programme principal ---------------------debut
MOVLW 0x06
MOVWF TMR0

; on met 06 dans le registre W


; on met W dans le registre du TIMER 0
; le timer comptera jusqu' 256 - 6 = 250
; 3.906 kHz / 250 = 15.624 Hz

MOVLW 0x7D

; on met 7D ( 125 ) dans le registre W

MOVWF retard1

; on met W dans le registre retard1


; 15.624 Hz / 125 = 0.124992 Hz et 1/0.12 = 8 S

call tempo
COMF key,f

; on complmente le registre key


Page 60

Programmation des Microcontroleurs (PIC)

EL MORNAN

movf key,w
movwf PORTB

; change l 'tat des leds chaque fois que la tempo est finie

goto debut
tempo
movf TMR0,w
btfss STATUS,2

;test du bit Z

goto tempo
MOVLW 0x06
MOVWF TMR0
DECFSZ retard1,F
GOTO tempo

; on met 06 dans le registre W


; on met W dans le registre du TIMER 0
; on dcrmente retard1 et on saute la prochaine instruction si
; le registre retard1 = 0 sinon retour tempo

return
END

11.4 Exemple d'application: Un compteur binaire

; Titre : Compteur binaire


; PIC utilis : PIC 16 F 84
Page 61

Programmation des Microcontroleurs (PIC)

EL MORNAN

; On ralise un compteur binaire sur les broches RB0 RB7 d' un PIC 16 F 84 le quartz utilis
; est de 4 Mhz , on effectue une tempo environ gale 0.2 seconde.
;------------ Directive d' assemblage pour MPLAB --------------list

p=16f84A

#include p16f84A.inc
__config H'3FF9'
;------------ Dfinition des constantes --------------#define inter0 0

; bouton marche

;------------ Dfinition des registres temporaires --------------retard1

EQU

0x0C

; le registre temporaire retard1 se trouve l' adresse 0C

retard2

EQU

0x0D

; le registre temporaire retard2 se trouve l' adresse 0D

memo

EQU

0x0E

; le registre memo tampon se trouve l' adresse 0E

;------------ Init des ports A et B --------------ORG 0


bsf STATUS,5

; on met 1 le 5eme bit du registre status pour accder


; la 2eme page mmoire ( pour trisa et trisb )

MOVLW B'00000000'

; on met 00 dans le registre W

MOVWF TRISB

; on met 00 dans le port B il est programm en sortie

MOVLW 0x1F

; on met 1F dans le registre W

MOVWF TRISA

; on met 00 dans le port A il est programm en entre

bcf STATUS,5

; on remet 0 le 5eme bit du registre status pour accder


; la 1ere page mmoire

;------------ Programme principal --------------Main


btfss PORTA,inter0
goto Main

; interrupteur 0 ( marche ) appuy ? si oui on continu sinon

; on va l' tiquette Main

MOVLW 0xFF

; on met 255 dans le registre W

MOVWF retard1

; on charge retard1 avec 255 ( FFh contenu du registre W )

MOVLW 0xFF

; on met 255 dans le registre W


Page 62

Programmation des Microcontroleurs (PIC)

EL MORNAN

MOVWF retard2

; on charge retard2 avec 255 ( FFh contenu du registre W )

MOVF memo, W

; on met memo dans W

MOVWF PORTB

; on met W sur le port B ( leds )

CALL tempo

; on appel la temporisation

MOVLW 0x01

; on met 1 dans le registre W

ADDWF memo, F

; on additionne memo + 1

GOTO Main

; retour au dbut du programme

;------------ Programme de temporisation ( 0.2 s ) --------------tempo


DECFSZ retard1,F

; on dcrmente retard1 et on saute la prochaine instruction si

GOTO tempo

; le registre retard1 = 0 sinon retour tempo

MOVLW 0xFF

; on met 255 dans le registre W

MOVWF retard1

; on charge retard1 avec 255 ( FFh contenu du registre W )

DECFSZ retard2,F

; on dcrmente retard1 et on saute la prochaine instruction si

GOTO tempo

; le registre retard1 = 0 sinon retour tempo

RETURN

; retour au programme principal aprs l 'instruction CALL

END

; fin du programme

Page 63

Programmation des Microcontroleurs (PIC)

11.5

EL MORNAN

Exemple d'application: Les feux tricolores

; Titre : Feux tricolores


PIC utilis : PIC 16 F 84
; On ralise des feux tricolores sur les broches RB0 RB5 d' un PIC 16 C 84
; le quartz est de 4 Mhz , on effectue une tempo longue environ gale 4 secondes et
; une tempo courte environ gale 1.5 secondes.
; un bouton marche sur le port A permet de lancer l' application
; RB0=rouge1 RB1=orange1 RB2=vert1
; RB3=rouge2 RB4=orange2 RB5=vert2
;------------ Directive d' assemblage pour PLAB --------------list

p=16f84A

#include p16f84A.inc
__config H'3FF9'
;------------ Dfinition des constantes --------------#define inter0 0

; bouton marche

#define inter1 1 ; bouton clignotement orange


Page 64

Programmation des Microcontroleurs (PIC)

EL MORNAN

;------------ Dfinition des registres temporaires --------------retard1

EQU

0x0C

; le registre temporaire retard1 se trouve l' adresse 0C

retard2

EQU

0x0F

; le registre temporaire retard2 se trouve l' adresse 0F

retard3

EQU

0x10

; le registre temporaire retard3 se trouve l' adresse 10

;------------ Init des ports A et B --------------ORG 0


bsf STATUS,5

; on met 1 le 5eme bit du registre status pour accder


; la 2eme page mmoire ( pour trisa et trisb )

MOVLW 0x00

; on met 00 dans le registre W

MOVWF TRISB

; on met 00 dans le port B il est programm en sortie

MOVLW 0x1F

; on met 1F dans le registre W

MOVWF TRISA

; on met 1F dans le port A il est programm en entre

bcf STATUS,5

; on remet 0 le 5eme bit du registre status pour accder


; la 1eme page mmoire

;------------ Init des feux ROUGE1 et ROUGE2 --------------MOVLW B'00001001'


MOVWF PORTB

; on met 0C dans le registre W ( Rouge1 et Rouge2 )


; on met W sur le port B ( led )

;-------------------- Programme principal ---------------------debut


MOVLW B'00001001'

; on met 0C dans le registre W ( Rouge1 et Rouge2 )

MOVWF PORTB

; on met W sur le port B ( led )

btfss PORTA,inter0 ; interrupteur 0 ( marche ) appuy ? si oui on continu sinon


;va debut
goto debut
ret_cli
btfsc PORTA,inter1

; interrupteur 1 ( clignotant ) appuy ? si oui on


;va clignote

goto clignote
MOVLW B'00001001'

; on met 0C dans le registre W ( Rouge1 et Rouge2 )

MOVWF PORTB

; on met W sur le port B ( led )


Page 65

Programmation des Microcontroleurs (PIC)

EL MORNAN

;--------------- Chargement de la temporisation --------------------CALL tempo

; on appel la temporisation 1 ( longue )

MOVLW B'00001100'

; on met 0C dans le registre W ( Vert1 et Rouge2 )

MOVWF PORTB

; on met W sur le port B ( led )

CALL tempo

; on appel la temporisation 1 ( longue )

MOVLW B'00001010'

; on met 0A dans le registre W ( Orange1 et Rouge2 )

MOVWF PORTB

; on met W sur le port B ( led )

CALL tempo2

; on appel la temporisation courte

MOVLW B'00001001'

; on met 0C dans le registre W ( Rouge1 et Rouge2 )

MOVWF PORTB

; on met W sur le port B ( led )

CALL tempo2

; on appel la temporisation courte

MOVLW B'00100001'

; on met 24 dans le registre W ( Rouge1 et Vert2 )

MOVWF PORTB

; on met W sur le port B ( led )

CALL tempo

; on appel la temporisation longue

MOVLW B'00010001'

; on met 14 dans le registre W ( Rouge1 et Orange2 )

MOVWF PORTB

; on met W sur le port B ( led )

CALL tempo2

; on appel la temporisation courte

GOTO debut

; retour au dbut du programme

;------------ Programme de temporisation longue --------------tempo


MOVLW 0xFF

; on met ff dans le registre W

MOVWF retard1

; on met W dans le registre retard1

MOVWF retard2

; on met W dans le registre retard2

MOVLW 0x12

; on met 12 dans le registre W

MOVWF retard3

; on met W dans le registre retard3

attente
DECFSZ retard1,F
GOTO attente

movlw 0xFF

; on dcrmente retard1 et on saute la prochaine instruction si


; le registre retard1 = 0 sinon retour attente

; on recharge retard1
Page 66

Programmation des Microcontroleurs (PIC)

EL MORNAN

movwf retard1
DECFSZ retard2,F
GOTO attente
movlw 0xFF

; on dcrmente retard2 et on saute la prochaine instruction si


; le registre retard2 = 0 sinon retour attente

; on recharge retard2

movwf retard2
DECFSZ retard3,F

; on dcrmente retard3 et on saute la prochaine instruction si

GOTO attente

; le registre retard3 = 0 sinon retour attente

RETURN

; retour au programme principal aprs l 'instruction CALL

;------------ Programme de temporisation courte --------------tempo2


MOVLW 0xFF

; on met ff dans le registre W

MOVWF retard1

; on met W dans le registre retard1

MOVWF retard2

; on met W dans le registre retard2

MOVLW 0x07

; on met 7 dans le registre W

MOVWF retard3

; on met W dans le registre retard3

attente2
DECFSZ retard1,F

; on dcrmente retard1 et on saute la prochaine instruction si

GOTO attente2

; le registre retard1 = 0 sinon retour attente2

movlw 0xFF

; on recharge retard1

movwf retard1
DECFSZ retard2,F
GOTO attente2
movlw 0xFF

; on dcrmente retard2 et on saute la prochaine instruction si


; le registre retard2 = 0 sinon retour attente2

; on recharge retard2

movwf retard2
DECFSZ retard3,F
GOTO attente2

; on dcrmente retard3 et on saute la prochaine instruction si


; le registre retard3 = 0 sinon retour attente2

RETURN
clignote
MOVLW B'00010010'

; on met 12 dans le registre W ( Orange1 et Orange2 )


Page 67

Programmation des Microcontroleurs (PIC)

MOVWF PORTB
CALL tempo2

EL MORNAN

; on met W sur le port B ( led )


; on appel la temporisation courte

MOVLW B'00000000'

; on met 00 dans le registre W ( aucune led )

MOVWF PORTB

; on met W sur le port B ( led )

CALL tempo2

; on appel la temporisation courte

GOTO ret_cli
END

11.6 Exemple d'application: La perceuse


Cycle effectu par la perceuse
1) Ds l'appui sur le bouton dpart cycle, la perceuse se met en rotation puis descend.
Les leds "descente" et "rotation" sont allumes.
2) Ds que le capteur de position bas est actionn, la perceuse remonte aprs une temporisation de 3s.
Les leds "monte" et "rotation" sont allumes.
3) Ds que le capteur de position haut est

actionn, la remonte s'arrte. Aprs une

temporisation de 3s la rotation s'arrte. Fin de cycle.


Arrt d'urgence
4) Si l'arrt d'urgence est actionn, la rotation s'arrte et la perceuse remonte quel que soit l'endroit o
l'on se trouve dans le cycle. La led "dfaut" est allume et mmorise jusqu'au prochain dpart cycle.
Tant que l'arrt d'urgence est appuy le cycle ne peut dmarrer.

Page 68

Programmation des Microcontroleurs (PIC)

EL MORNAN

; Titre : Perceuse
; PIC utilis : PIC 16 F 84
; On ralise une simulation dune perceuse en utilisant les broches RB0 RB3
; pour le bouton marche, le coup de poing d' arrt d'urgence et les deux fin de
; course haut et bas.
; Les broches RB4 RB7 reprsentent la rotation, la monte et la descente.
; Entres : RB0= Arrt

RA0= Marche

RA1= Capteur haut

; Sorties : RB1= Rotation RB2= Descente RB3= Monte

RA2= Capteur bas


RB4= Dfaut mmoris

; Cycle :
; 1) appui sur marche -> rotation + descente
; 2) capteur bas actionn -> temporisation et rotation + remonte
; 3) capteur haut actionn -> rotation + temporisation et arrt rotation
; Arrt d'urgence : La perceuse s'arrte de tourner et remonte, un voyant dfaut mmorise
; l' action. Le voyant dfaut s' efface au prochain cycle.
;------------ Directive d' assemblage pour PLAB --------------list

p=16f84A

#include p16f84A.inc
Page 69

Programmation des Microcontroleurs (PIC)

EL MORNAN

__config H'3FF9'
;------------ Dfinition des constantes --------------#define arret 0

; bouton arrt

#define marche

; bouton marche

#define capteur_h 1

; capteur haut

#define capteur_b 2

; capteur bas

;------------ Dfinition des registres temporaires --------------retard1

EQU

0x0C

; le registre temporaire retard1 se trouve l' adresse 0C

retard2

EQU

0x0F

; le registre temporaire retard2 se trouve l' adresse 0F

retard3

EQU

0x10

; le registre temporaire retard3 se trouve l' adresse 10

; -------------------------------------------- Saut init -------------------------------------------------------------------org 0


goto init
;----------------------------------------- Programme d' interruption ------------------------------------org 04
MOVLW B'00011000'

; on met 18 dans le registre W ( monte + voyant dfaut )

MOVWF PORTB

; on met W sur le port B ( led )

capt
btfss PORTA,capteur_h
goto capt

; interrupteur 1 ( capteur haut ) appuy ? si non on

; va capt

MOVLW B'00010000'

; on met 10 dans le registre W ( voyant defaut )

MOVWF PORTB

; on met W sur le port B ( led )

bcf INTCON,1

; on met 0 le 1er bit de INTCON

bsf INTCON,4

; on met 1 le 4eme bit du registre INTCON pour autoriser l' IT sur RB0

bsf INTCON,7 ; on met 1 le 7eme bit du registre INTCON pour autoriser toutes les IT
goto debut

; on retourne debut

;---------------------------------- Init des ports A et B et validation des IT -----------------------------------init


ORG 20
bsf STATUS,5

; on met 1 le 5eme bit du registre status pour accder


Page 70

Programmation des Microcontroleurs (PIC)

EL MORNAN

; la 2eme page mmoire ( pour trisa et trisb )


MOVLW 0x01

; on met 01 dans le registre W

MOVWF TRISB

; on met 00 dans le port B il est programm en sortie sauf RB0

MOVLW 0x1F

; on met 1F dans le registre W

MOVWF TRISA

; on met 1F dans le port A il est programm en entre

bcf STATUS,5

; on remet 0 le 5eme bit du registre status pour accder


; la 1eme page mmoire

bsf INTCON,4

; on met 1 le 4eme bit du registre INTCON pour autoriser


; l 'IT sur la broche RB0 ( arrt d 'urgence )

bsf INTCON,7

; on met 1 le 7eme bit du registre INTCON pour autoriser toutes les 'IT

;---------------------------------------------- Programme principal ---------------------------------------------MOVLW B'00000000'

; on met 00 dans le registre W ( arret )

MOVWF PORTB

; on met W sur le port B ( led )

debut
bsf INTCON,4

; on met 1 le 4eme bit du registre INTCON

bsf INTCON,7

; on met 1 le 7eme bit du registre INTCON


; toutes les 'IT

btfsc PORTB,arret
goto debut

; interrupteur 0 ( arret ) appuy ? si oui on


; va debut

btfss PORTA,marche
goto debut

; va debut

btfss PORTA,capteur_h
goto debut

; interrupteur 0 ( marche ) appuy ? si oui on continu sinon

; interrupteur 1 ( capteur haut ) appuy ? si non on

; va debut ( init )

MOVLW B'00000000'

; on met 00 dans le registre W ( arret )

MOVWF PORTB

; on met W sur le port B ( led )

MOVLW B'00000110'

; on met 06 dans le registre W ( Rotation + descente )

MOVWF PORTB

; on met W sur le port B ( led )

descente
btfss PORTA,capteur_b

; interrupteur 2 ( capteur bas ) appuy ? si non on


Page 71

Programmation des Microcontroleurs (PIC)

EL MORNAN

goto descente

; va descente

CALL tempo

; on appel la temporisation

MOVLW B'00001010'

; on met 0A dans le registre W ( Rotation + monte )

MOVWF PORTB

; on met W sur le port B ( led )

remonte
btfss PORTA,capteur_h

; interrupteur 1 ( capteur haut ) appuy ? si non on

goto remonte

; va remonte

CALL tempo

; on appel la temporisation

MOVLW B'00000010'

; on met 02 dans le registre W ( Rotation )

MOVWF PORTB

; on met W sur le port B ( led )

CALL tempo

; on appel la temporisation

MOVLW B'00000000'

; on met 00 dans le registre W ( arret )

MOVWF PORTB

; on met W sur le port B ( led )

GOTO debut

; retour au dbut du programme

;---------------------------------------------- Programme de temporisation

-----------------------------------

tempo
MOVLW 0xFF

; on met ff dans le registre W

MOVWF retard1

; on met W dans le registre retard1

MOVWF retard2

; on met W dans le registre retard2

MOVLW 0x12

; on met 12 dans le registre W

MOVWF retard3

; on met W dans le registre retard3

attente
DECFSZ retard1,F
GOTO attente
movlw 0xFF

; on dcrmente retard1 et on saute la prochaine instruction si


; le registre retard1 = 0 sinon retour tempo

; on recharge retard1

movwf retard1
DECFSZ retard2,F
GOTO attente
movlw 0xFF

; on dcrmente retard2 et on saute la prochaine instruction si


; le registre retard2 = 0 sinon retour tempo

; on recharge retard2

movwf retard2
Page 72

Programmation des Microcontroleurs (PIC)

DECFSZ retard3,F

EL MORNAN

; on dcrmente retard3 et on saute la prochaine instruction si

GOTO attente

; le registre retard3 = 0 sinon retour tempo

RETURN

; retour au programme principal aprs l 'instruction CALL

END

11.7 La compilation se fait a laide du logiciel MPLAB de Microchip

11.8 Le programmateur des microcontrleurs


Une fois le fichier est compil ; il porte lextension .HEX on doit le transfrer vers le microcontrleur a
travers un programmateur universel qui peut tre reli au PC a travers le port srie ou le port USB
On peut programmer toutes les sortes de PIC selon le schma de brochage en utilisant le logiciel PICPgm
ou ICPROG ou autre logiciel.

Page 73

Programmation des Microcontroleurs (PIC)

EL MORNAN

12. Simulation dun PIC sous Proteus


Pour faire cela il est ncessaire davoir :
-> Proteus qui contient le module de simulation des pic (Module VSM)
-> Un schma dont tout les composants sont simulables (ou ceux qui le sont pas : exclus de la simulation :
exemple les borniers )
-> Un fichier excutable (code machine) FICHIER.HEX, OU MIEUX un code machine + informations
de Dbugage :FICHIER.COF
1. Prsence Module VSM
Le module VSM effectue la simulation du microprocesseur partir de votre code source.
Vrifier la prsence du module VSM adapt au microprocesseur simuler sous Proteus.
-> Lancer Licence Manager :

VSL pour PIC 16 XXXX dans lexemple.


2.Fichier simuler
Editer les proprits du Microprocesseur puis slectionner le fichier source, on peut utiliser :
VERSION 1 : Soit le fichier_source.HEX

Page 74

Programmation des Microcontroleurs (PIC)

EL MORNAN

VERSION 2 : Soit le fichier_source.COF (contenant le fichier source et les directives de dsassemblage)


Il est prfrable dutiliser plutt ce fichier. Ce qui permet des mises au point plus efficace (mode pas pas)

. Lancer la simulation

Pour lancer la simulation il suffit de cliquer sur licone PLAY verte en bas de page

Page 75

Programmation des Microcontroleurs (PIC)

EL MORNAN

Pour lancer la simulation en mode pas pas (et dbogage) :

En excutant la simulation en mode pas pas , vous pouvez ensuite excuter le programme par pas, mettre
des points darrt dans le programme, voir ltat des registres, etc...

Nhsitez pas utiliser du clic droit de la souris dans le code source ;)

Page 76

Programmation des Microcontroleurs (PIC)

EL MORNAN

13. Circuits dinterfaces avec le microcontrleur


13.1 AFFICHEUR LCD
13-1-1 Prsentation :
Lafficheur LCD, autrement appel un afficheur cristaux liquide. Il consomme relativement de 1 5 mA
et constitu de deux lames de verre, distante de 20 m environ, sur lesquelles sont dessines les mers
nantisses formant les caractres. Lapplication entre les deux faces dune tension alternative basse
frquence de quelques volts (35V) le rend absorbant .Un afficheur cristaux liquide ne peut tre utilis
quavec un bon clairage ambiant .Son lisibilit augmente avec lclairage

13-1-2 Principe de fonctionnement :


on utilise le mode 4 bits de lafficheur LCD. Dans ce mode, seul les 4 bits de poids fort (D4 D7) de
lafficheur sont utiliss pour transmettre les donnes et les lires. Les 4bits de poids faible (D0 D3) sont
alors connects la masse, on a donc besoin hors alimentation de sept fils pour commander lafficheur.
Les donnes sont crites squentiellement les quatre bits de poids fort suivi des quatre bits de poids faible.
Une impulsion positive dau moins 450ns doit tre envoye sur la ligne E pour valider chaque demi octet. On peut aprs chaque action sur lafficheur vrifier que celui-ci est en mesure de traiter
linformation suivante .Pour cela, il faut demander une lecture en mode commande et tester le flag Busy
BT. Lorsque BF=0, lafficheur est prs recevoir une nouvelle commande ou donne.

13-1-3 Prsentation dun cran LCD :


Quil soit une ou deux lignes, un afficheur LCD se prsente sous la forme suivante :

Au-dessus de lcran cristaux liquides proprement dit, on trouve une srie de 14 broches aux rles
Suivantes :

Broche 1 : masse ;
Broche 2 : Vcc ;
Broche 3 : luminosit ;
Broche 5, R/W : slection du mode lecture ou criture :

Page 77

Programmation des Microcontroleurs (PIC)

EL MORNAN

criture

lecture

Broche 6, E : Commande des oprations dcriture ou de lecture ;


Broche 7 14 : utilises pour le transfert des donnes ou des instructions. Le transfert peut se faire sur 8
bits, toutes les broches sont alors utilises, ou sur 4 bits, dans ce cas, seules les broches 11 14 sont
utilises.

Page 78

Programmation des Microcontroleurs (PIC)

EL MORNAN

U1

RD0/PSP0
RD1/PSP1
RD2/PSP2
RD3/PSP3
RD4/PSP4
RD5/PSP5
RD6/PSP6
RD7/PSP7

19
20
21
22
27
28
29
30

LCD

7
8
9
10
11
12
13
14

D0
D1
D2
D3
D4
D5
D6
D7

LM032L

RS
RW
E

RS
E

4
5
6

15
16
17
18
23
24
25
26

RW

VSS
VDD
VEE

RA0/AN0
RA1/AN1
RA2/AN2/VREFRA3/AN3/VREF+
RA4/T0CKI
RA5/AN4/SS
RC0/T1OSO/T1CKI
RC1/T1OSI/CCP2
RE0/AN5/RD
RC2/CCP1
RE1/AN6/WR
RC3/SCK/SCL
RE2/AN7/CS
RC4/SDI/SDA
RC5/SDO
RC6/TX/CK
RC7/RX/DT

33
34
35
36
37
38
39
40

RS
RW
E

8
9
10

RB0/INT
RB1
RB2
RB3/PGM
RB4
RB5
RB6/PGC
RB7/PGD

1
2
3

2
3
4
5
6
7

OSC1/CLKIN
OSC2/CLKOUT
MCLR/Vpp/THV

GND
VCC
VEE

13
14
1

PIC16F877
VDD=VCC
VSS=GND

Montages de lafficheur LCD avec le PIC

13.2 Le clavier
13-2-1 Prsentation :
Le clavier est le priphrique le plus commode pour saisir du texte, mais dans notre carte on va utiliser
un clavier alphanumrique 16 touches matrices pour saisir des numros et un peut dalphabets, pour
connecter le clavier au microcontrleur on est besoin dun codeur de clavier 74LS922 pour prserver les
ressources du microcontrleur.

Page 79

Programmation des Microcontroleurs (PIC)

EL MORNAN

13-2-2 Principe de fonctionnement :

Le clavier se compose de 16 touches reparties sur une matrice de 4 lignes (chaque ligne contient 4
touches) 4 pistes sont disposes horizontalement (elles correspondant aux 4 lignes de touches) et 4 autres
pistes sont disposes verticalement (elles correspondant aux 4 colonnes de touches). Chaque touche agit
comme un bouton poussoir qui tablit le contact entre une des 4 pistes horizontales et une des 4 pistes
verticales.

Chaque touche est un interrupteur, normalement en position ouverte .Lorsquune touche est
appuye un signal lectrique est envoy vers le codeur, circuit lectronique trs simple qui associe
chaque signal un code (par exemple le code ascii de la touche). Ce signal peut tre utilis pour envoyer
une interruption au processeur fin quil traite linformation. Les codeurs rellement utiliss assurent de
fonctions supplmentaires comme le dcodage automatique des touches appuyes longtemps.

Page 80

Programmation des Microcontroleurs (PIC)

EL MORNAN

13.3 Circuit ULN2003


LULN est un composant qui pour rle de commander les relais. Il comporte deux transistors, deux
diodes et deux rsistances. Le fait quil renferme tous les composants lui permet davoir une longue dure
de vie et de minimiser les pertes de courant.
LULN est capable d'couler un courant max de 500mA par transistor et supporte une tension max de 50V.
Ainsi vous pouvez connecter directement la majorit des relais sans problme

Figure : Structure interne de lULN2003


Page 81

Programmation des Microcontroleurs (PIC)

EL MORNAN

13.4 Circuit ULN2803


L'ULN2803 est dcrit comme "un conducteur 8 lignes". Cela signifie qu'il contient le circuit pour
contrler huit lignes de productions individuelles, chaque acte indpendamment des autres.

Page 82

Programmation des Microcontroleurs (PIC)

EL MORNAN

13.5 Les moteurs


13-5-1. Moteur pas pas :

Moteur pas pas


a) Prsentation :
Le moteur pas pas est un moteur qui tourne en fonction des impulsions lectriques reu dans ses
bobinages. Langle minimal entre deux modifications des impulsions lectrique sappelle un pas .On
caractrise un moteur par le nombre de pas par tour.
b) Principe de fonctionnement :
Pour identifier le brochage du moteur ,un simple ohmmtre(calibre 100 ou 200ohms)permet de dterminer
dune part les trois fils appartenant chaque bobinage [P1-com1-P1\]et[P2-com2-P2\] ,dautre part le point
milieu dun bobinage donne(si la rsistance entre le commun et une phase vaut alors que celle entre les
deux phase vaut2R) .les deux les deux bobinages sont interchangeable, ainsi que les deux phases extrmes
dun mme bobinage (P1etP1\) ; signalons que cette dernire manipulation entrane un changement du
sens de rotation. Un cycle tant ralis en quatre tapes successives, la squence ment est donc effectu
par un compteur binaire quatre sorties, lesquelles prsenteront donc cinq combinaisons diffrentes
(0000, 0001, 0010, 0100, 1000).Les tapes dfilent au rythme de lhorloge intgre au compteur.
c) Connexion du moteur pas pas sur la carte :

Page 83

Programmation des Microcontroleurs (PIC)

EL MORNAN

Le moteur pas pas+ULN2003A sont connects aux lignes RD0 RD3 du microcontrleur.
13-5-2 Moteur courant continu :
Le moteur courant continue est une machine lectrique tournante constitu de deux parties principales : le
stator (la partie fixe) et le rotor (la partie mobile).

Moteur courant continue


a) Connexion du moteur

Dans ce figure on utiliser deux relaies pour changer le sens de rotation du moteur courant continue. Les
deux pins MCC1 et MCC2 relier avec les pins RE0 etRE1 du microcontrleur.

Page 84

Programmation des Microcontroleurs (PIC)

EL MORNAN

Lorsqu'on veut commander le sens de rotation dun moteur ( courant continu ou pas pas) on est souvent
oblig d'inverser la polarit. De plus il est gnralement prfrable de pouvoir faire varier la vitesse du
moteur. La solution est dutiliser le pont en H.

Figure : Principe du pont en H


En regardant les schmas, on voit le sens de rotation du moteur : sur le schma a ; le moteur est l'arrt
(on devrait mme dire qu'il est frein : en effet court-circuiter les deux ples d'un moteur revient le
freiner).

Sur le schma b ; il tourne dans le sens inverse du schma c, et enfin sur le schma d ; il est frein. Et
bien voici la base du pont en H, toute l'ide rside dans ce schma. Bien sr, pour l'implmenter, il va
nous falloir remplacer les interrupteurs par des transistors.
IN1

IN2

ETAT MOTEUR

ARRET

SENS 1

SENS 2

ARRET

Figure : Tableau des diffrentes sequences

Page 85

Programmation des Microcontroleurs (PIC)

EL MORNAN

Lorsqu'on arrte le moteur, et qu'il continue tourner avec l'inertie, il se comporte comme une gnratrice.
Pour viter d'avoir des courants dans les transistors on monte des diodes de roues libres.

Figure: Schma dun pont en H


b) Commande de 2moteurs DC avec Times L293D

Page 86

Programmation des Microcontroleurs (PIC)

EL MORNAN

13.6 Les relais


Les relais sont pilots via un transistor de commande, une diode de roue libre est monte aux bornes du
relais pour la protection du transistor
RL
21

VCC

REL2

D2
1N4148

5
3

Q2

R2

2N2222

POMP1

RL
20

2.2k

Montage du relais

13.7 Isolation laide dun opto- triac


Exemple de commande dune lampe.

Page 87

Programmation des Microcontroleurs (PIC)

EL MORNAN

13.8 Les touches de commande


Si on dispose de trois boutons poussoirs (SW0, SW1 et SW2)qui sont relis trois entres numriques du
microcontrleur en les reliant respectivement aux rsistances (R10 ,R9 et R8) de rappel la source Vcc
de moyenne valeurs (2.2 K) pour ne pas consommer plus de lnergie .

SWO
1

RE0

SW1
1

RE1
2

RE2

SW2
1

R9
R10
2.2k
2.2k

R8
2.2k

VCC

Montage des boutons poussoirs

13.9 Communication srie avec RS232


Le circuit adaptateur de niveau de tension TTL :RS232 permet alors de relier un interface
(exemple le tlphone au port srie dun PC) .

Prsentation :
Les liaisons sries permettant la communication entre deux systmes numriques en limitant le
nombre de Fils de transmission..
DCD (Data Carrier Detecte ) : Cette ligne est une entre active ltat haute. Elle signal lordinateur
quune liaison a t tablie avec un correspondant.
Page 88

Programmation des Microcontroleurs (PIC)

EL MORNAN

RX( Reciver Data) : Cette ligne est une entre.Cest ici que transitent les informations du
correspondant vers lordinateur.
TX (Transmit Data ) : cette ligne est une sortie. Elle permet la vhicule des donnes de lordinateur
vers le correspondant.
DTR (Data Terminal Ready ) :Cette ligne est une sortie active ltat haut Elle permet lordinateur
de signaler au correspondant que le port srie t libr et quil peut tre utilis sil le souhaite.
GND (GrouND) : cest la masse.
DSR (Data Set Read) : Cette ligne est une entre active ltat haut. Elle permet au correspondant de
signaler quune donne est prte.
RTS (Request To Send ) : cette ligne est une sortie active ltat haut. Elle indique au correspondant
que lordinateur veut lui transmettre des donnes..
CTS (Clear To Send ) : Cette ligne est une entre active ltat haut.Elle indique lordinateur que le
correspondant est prt recevoir des donns.
RI( RING Indicator) :Cette ligne est une entre active ltat haut.Elle permet lordinateur de
savoir si un correspondant veut initier une communication avec lui.
Fonctionnement :
Pour pouvoir dialoguer avec le PC, le microcontrleur utilise son module USART signifie
(Universal Synchronous Asynchronous Reciever Transmitter ).
Cest donc un module qui permet denvoyer et de recevoir des donnes en mode srie, soit de
faon synchrone, soit asynchrone. Le module USART de notre PIC gre uniquement deux pins, savoir
RC6/TX/CK et RC7/RX/DT.
Une liaison srie synchrone ncessite une connexion ddie lhorloge, donc il reste une seule
ligne pour transmettre les donnes. Alors quen mode asynchrone on na pas besoin dune ligne
dhorloge, il nous restera alors deux lignes pour communiquer, chacune tant ddie un sens de
transfert. Nous pourrons donc envoyer et recevoir des donnes en mme temps.
Les liaisons RS 232 sont des liaisons asynchrones trs utilises en informatique. Elle ncessite que
lmetteur et le rcepteur soit inform de la vitesse choisie de transfert.
Puisque le rcepteur connat la vitesse du transfert il peut se passer de signal de synchronisation.
Trois lignes sont ncessaires cette liaison.
TX : transmission de donns.
RX:rcepteur de donn.
Page 89

Programmation des Microcontroleurs (PIC)

EL MORNAN

GND :masse
Grce cette liaison la carte peut servir dinterface entre un PC et un montage extrieure afin
dadapter les signaux TTL du microcontrleur au standard RS232
Un MAX232 est monte de faucon classique, les lignes RX, TX et la masse sont disponibles sur
un connecteur DB9 mle qui permet ainsi de relier la carte au PC avec un simple cble srie.

13.10 MAX 232


Le circuit intgr MAX232 qui cble avec ces condensateurs au tantale de 1F , permet dadapter les
niveaux de tension entre le PC et le tlphone comme certains PC ne disposent pas dune puissance
suffisante sur leur port srie, cest le cas notamment des portable , il est possible de connecter une
alimentation externe dlivrant une tension de 12V

Page 90

Programmation des Microcontroleurs (PIC)

EL MORNAN

Page 91

Programmation des Microcontroleurs (PIC)

EL MORNAN

13.11 BUS I2C


Le bus I2C (inter integrated circuit ce qui donne IIC et par contraction I2C), a t propos initialement par
Philips mais adopt de nos jours par des trs fabricants. Cest bus de communication de type srie.

1. Prsentation :
Le bus I2C qui nutilise que deux lignes de signal (et les masses correspondantes bien sr) permet un
certain nombre dappareils dchange des informations sous forme srie avec un dbit pouvant atteindre
100 Kbits par seconde ou 400 kbits par seconde pour les versions les plus rcentes. Mme si ces dbits
peuvent sembler relativement faibles, les premires applications du bus I2C sont des applications audio
ou vido pour lesquelles la simplicit de mise en uvre est nettement plus importante quun dbit lev.
Les points forts du bus I2C sont :
Premirement cest un bus srie bifilaire utilisant une ligne de donnes appele SDA (Serial Data) et une
ligne dhorloge appele SCL (Serial Clock).
Les donnes peuvent tre changes dans les deux sens sans restriction.
Le bus est multi-matre : chaque abonn dispose dune adresse code sur 7 bits, on peut donc connecter
simultanment 128 abonns dadresses diffrentes sur le mme bus.
Un acquittement est gnr pour chaque octet de donne transfr.
Le bus peut travailler une vitesse maximum de 100 K bits par seconde (ou 400 Kbits par seconde) tant
entendu que son protocole permet de ralentir automatiquement lquipement le plus rapide pour sadapter
la vitesse de llment le plus lent, lors dun transfert.

Le nombre maximum dabonns nest limit que par la charge capacitive maximale du bus qui peut tre de
400pF.
Les donnes envoyes par paquets de huit bits indpendants(le bit de poids fort est envoy le premier) sur
la ligne SDA, chaque octet est suivie par un bit dacquittement .La ligne SCL fonctionne comme une
horloge srielle dun registre dcalage, tant que cette ligne est ltat haut les donnes de la ligne SDA
doivent tre stables.
Page 92

Programmation des Microcontroleurs (PIC)

EL MORNAN

Figure : architecture interne du PCF8583

Certaines combinaisons particulires de niveaux et de fronts des deux lignes dterminant la condition de
dpart ou darrt de la transmission des donnes.
Condition de dpart : Un front descendant sur SDA quand SCL est ltat haut.
Condition darrt : Un front montant sur SDA quand SCL est ltat haut.

13.12 Module horloge temps rel :


PCF8583 :
Le PCF8583 fonctionne en vritable horloge calendrier c'est--dire en mode de 24 heures et sur une
priode de vingt quatre ans. Il possde une sortie dinterruption et de la RAM qui possde 232 octets
disponibles en plus de ceux de sa propre fonction.

Figure 15 : Schma de brochage


Caractristiques lectriques :
- consommation faible de courant.
- garantie de la fonction dhorloge et de rtention de mmoire sous 1v (et 2A) ce qui permet de le secourir
facilement par une batterie.
Page 93

Programmation des Microcontroleurs (PIC)

EL MORNAN

2. Connexion de PCF8583:

Lhorloge temps rel PCF8583 accs I2C est raccorde la ligne RC3 du Pic pour lhorloge (SCL) et
RC4 pour les donnes (SDA), la liaison aux lignes RC3 et RC4 seffectue en changeant ltat du SW9.
Les rsistances R48 et R49 maintiennent positivement ces signaux au repos. Le montage contient aussi
une pile rechargeable pour alimenter le PCF8583 en cas o la carte nest pas alimente.
Le bus I2C appartient la catgorie des bus srie par opposition aux bus parallle ou les donnes sont
transmises par bloc, les donnes sont ici envoyes bit par bit par groupe doctet sur la ligne SDA.La ligne
SCL fonctionne comme une horloge srielle dun registre dcalage. Tant que la ligne SCL est ltat
haut les donnes de la ligne SDA doivent tre stables.
Lorsque la ligne SCL est ltat bas, le circuit qui met les donnes peut modifier ltat.

Figure: condition de validit des donnes sur le bus I2C

Certaines combinaisons particulires de niveaux et de fronts des deux lignes dterminant la condition de
dpart ou darrt de la transmission des donnes.

Condition de dpart : Un front descendant sur SDA quand SCL est ltat haut.
Condition darrt : Un front montant sur SDA quand SCL est ltat haut.
Page 94

Programmation des Microcontroleurs (PIC)

EL MORNAN

14. Pic 16F877 :


Le pic 16F877 est un circuit intgre contenu dans un botier nommer DIL 40 , il prsente 40 broches,
20 de chaque cot. Les broches sont virtuellement numrotes de 1 40. La 1ere broche est plac dans le
coin situ gauche de lencoche de reprage.

Figure : Les pins du 16F877

14.1 Les PINS de 16F877 :

MCLR
Cette broche sert initialiser le microcontrleur.
Le microcontrleur dispose de plusieurs sources de RESET :
POR.
EXTERNAL RESET
WDT
BOR
POR: (POWER ON RESET) Mise sous tension.
Un front montant sur MCLR dclenche l'initialisation du microcontrleur. Le temps ncessaire est au
minimum de 72ms et au maximum de 72ms+1024*Tosc. Le microcontrleur dispos en interne dun
circuit de dtection de niveau, quand la tension VDD est comprise entre 1.2V et 1.7V, il dmarre une
procdure dinitialisation.
Cette broche peut tre simplement relie VDD si on na pas besoin de RESET externe. Par contre si on
souhaite implanter un bouton de remise zro, on pourra cbler un simple rseau RC sur la broche
MCLR.

Page 95

Programmation des Microcontroleurs (PIC)

EL MORNAN

Remarque importante : On peut se passer de circuit RC la seule condition que le temps de mont de
VDD soit suffisamment rapide (au minimum 50mV/ms). Si le temps de monte est infrieur 50mV/ms,
il faut rajouter un rseau RC.
EXTERNAL RESET (Mise ltat bas de MCLR). Remise zro extrieure. Il faut appliquer un
niveau bas sur l'entre RESET pendant au moins 2S pour que l'Initialisation soit prise en compte.
WDT: Chien de garde.
Si le WDT arrive la fin du temps de garde sans avoir t rafrachi il y aura alors une initialisation du
microcontrleur.
BOR: Baisse de lalimentation.
Si la tension VDD chute en dessous de 4V pendant 100S au moins, le microcontrleur peut gnrer un
RESET.

14.2 Oscillateur : OSC1 et OSC2 ou CLKIN et CLOUT.


Ces broches permettent de faire fonctionner loscillateur interne du PIC.
On peut utiliser 3 types doscillateurs :
- Un quartz ou rsonateur cramique
- Un oscillateur externe
- Un rseau RC
Remarque : Les instructions standards durent 1 cycle machine (sauf les instructions de sauts 2 cycles). Le
microcontrleur utilise 4 coups dhorloge pour raliser un cycle machine.
Si la frquence du QUARTZ est de 20MHz (T=50nS), une instruction sera excute toutes les 200nS,
Dans ce cas l, le microcontrleur a une puissance de calcul de 5MIPS (5 Millions dinstructions par
secondes ! ! !).
La frquence MAX est de 20MHz pour les microcontrleurs dont les rfrences se terminent par -20.Par
exemples : 16F876-20 (20MHz max) et 16F876-04 (4MHz max).

C1
U1

1nF

X1
C2
1nF

13

14
CRYS T AL
1
2
3
4
5
6
7
8
9
10

OSC1/CLK IN
OSC2/CLK OUT
MCLR/V pp/T HV
RA0/AN0
RA1/AN1
RA2/AN2/V RE FRA3/AN3/V RE F+
RA4/T 0CKI
RA5/AN4/S S
RE0/AN5/RD
RE1/AN6/W R
RE2/AN7/CS

RB 0/INT
RB1
RB2
RB3/PGM
RB4
RB5
RB6/PGC
RB7/PGD
RC0/T 1OS O/T 1CKI
RC1/T 1OSI/CCP2
RC2/CCP 1
RC3/S CK /S CL
RC4/SDI/S DA
RC5/SDO
RC6/T X/CK
RC7/RX/DT
RD0/PS P0
RD1/PS P1
RD2/PS P2
RD3/PS P3
RD4/PS P4
RD5/PS P5
RD6/PS P6
RD7/PS P7

33
34
35
36
37
38
39
40
15
16
17
18
23
24
25
26
19
20
21
22
27
28
29
30

PIC16F877

.
Brochage du circuit doscillation PIC16F877

Page 96

Programmation des Microcontroleurs (PIC)

EL MORNAN

Remarque : La consommation du circuit sera d'autant plus faible que la frquence sera petite, cela peut
tre intressant pour des applications de faible consommation (alimentation autonome).
Pour des applications faible consommation, on peut utiliser les sries LF (Low Frequency and Low
Power).

Alimentation : VDD et VSS.


Ce sont les broches d'alimentation du circuit. Les tensions qui peuvent tre appliques vont :
- De 4,5V 6V pour la gamme standard F.
- De 2 6V pour la gamme tendue LF.
L'intensit du courant consomm peut aller de 1A 10mA.
La consommation du microcontrleur sera fonction de :
- La tension d'alimentation.
- La frquence interne.
- Le mode de fonctionnement.
De plus ces bornes doivent tre dcouples par deux condensateurs :
- 1F lectrolytique.
- 10nF cramique.

LInterruption : RBO/INT.
Cette broche une double fonction elle peut tre utilise comme une broche standard RBO ou comme une
entre dinterruption INT.
Si cette broche est utilise comme une entre d'interruption externe, elle doit tre maintenue un niveau
haut par l'intermdiaire de rsistances de 10 k pour ne pas dclencher dinterruptions imprvues, cela
permet aussi de relier plusieurs sources d'interruptions sur une mme ligne (OU CABLE).

14.3 Architecture interne du16F877 :


Comme pour tous les circuits intgre, chacun de ses broches une ou plusieurs fonctions qui sont
rsumes par un sigle mnmotechnique.
Ce microcontrleur prsente une architecture Harvard, les donnes sont places dans une mmoire de type
RAM de 368 bytes. La mmoire de programme est constitue de mot de 14 bytes, est type FLASH (non
volatile).
Ces ressources sont donc prcieuses, en comparaison de celles dautres composantes. Le 16F877 possde
encore 5 ports (A E) et 3 temporisateurs (timers), ce diagramme bloc prsente les composantes du
16F877 :

Page 97

Programmation des Microcontroleurs (PIC)

EL MORNAN

Figure 2: Architecture interne du PIC 16F877


*Les 5 ports sont dentres sorties input/output, ils sont bidirectionnels :
-Le port A (6 bits) I/O pure et/ou convertisseur analogique et/ou TIMER 0.
La broche RA4 5Entre du timer 0 T0CKI) est de type DRAIN OUVERT.
-Le port B (8 bits) I/O pure et/ou programmation in situ ICSP/ICD, RB0 est entre dinterruption externe.
-Le port C (8 bits) I/O pure et/ou SPI/I2C et/ou USART.
-Le port D (8 bits) I/O pure et/ou port parallle 8 bits associ au port E.
-Le port E (3 bits) I/O pure et/ou pilotage du port E RE0/R, RE1/WR et RE/CS.
Remarque : Si le PIC est utilis en mode ICSP/ICD il faut laisser libre les broches RB3/PGM,
RB6/PGC ainsi que RB7/PGD) et les configurer en entre.
Page 98

Programmation des Microcontroleurs (PIC)

EL MORNAN

Le PORT C (8 bits) I/O pure et/ou TIMER 1 et/ou SPI / I2C et/ou USART.
Le PORT D (8 bits) I/O pure et/ou port parallle 8 bits associ au PORT E.
Le PORT E (3 bits) I/O pure et/ou pilotage du PORT E RE0/RD, RE1/WR et RE2/CS.

14.4 Configuration des PORTx, les registres PORTx et TRISx.


Tous les ports sont pilots par deux registres :
- Le registre de PORTx, si le PORT x ou certaines lignes de PORT X sont configures en sortie, ce
registre dtermine ltat logique des sorties.
- Le registre TRISx, cest le registre de direction. Il dtermine si le PORTx ou certaines lignes de port
sont en entre ou en sortie. Lcriture dune 1 logique correspond une entre (1 comme Input) et
lcriture dune 0 logique correspond une sortie (0 comme Output).
Au RESET toutes les lignes de ports sont configures en entres.
Remarque : Les registres TRISx appartiennent la BANQUE 1 des SFR.
Lors de linitialisation du microcontrleur il ne faut pas oublier de changer de page mmoire pour les
configurer.
Le tableau ci dessous reprsente les caractristiques de PIC :

Tableau de caractristiques

14.5 . Les mmoires du PIC 16F877 :


Les mmoires sont de trois types diffrents :
1 La mmoire FLASH :
Cest une mmoire programme de taille 8ko. Chaque case mmoire unitaire est de taille 13 bits. Cette
mmoire est de type mmoires stable, c'est--dire quon peut rcrire dessus volont, car le 16F877 est
caractris par la possibilit dcrire des donnes. La zone mmoire est caractrise par une adresse de 13
bits, alors ceci nous impose donc pour ladressage les registres EEAR et EEADRH. De mme, nous
aurons pour les donnes, les registres EEDATA et EEDATH.
2 La mmoire RAM :
Cette mmoire de taille 368 octets est une mmoire daccs rapide et elle est volatile (les donnes seront
perdus lorsque elle nest plus sous tentions). Elle contient tous les registres de configuration du PIC ainsi
Page 99

Programmation des Microcontroleurs (PIC)

EL MORNAN

que les diffrents registres de donnes. Elle contient galement les variables utilises par le programme.
La RAM est la mmoire la plus utilise. Toutes les donnes qui y sont stockes sont perdues lors dune
coupure de courant.
La RAM est subdivise de plus en deux parties dans chacune on trouve des cases mmoire spciales
appele REGISTRES SPECIAUX et des cases mmoire libre dont on peut se servir provoque un
fonctionnement spcial du PIC ou la mise en service dune fonction particulire.
3 LEPROM Interne :
Le pic 16F877contient galement la mmoire lectriquement effaable, rcrivable et stable. Ce type de
mmoire est daccs plus lent. Pour grer cette EEPROM on a besoin de quatre registres, savoir EEDR,
EEDATA, EECON1 et EECON2.
Le registre EEADR est utilis pour placer ladresse relative en EEPROM, tandis que le EEDATA contient
la donn lire ou crire.
Ladresse relative de laccs EEPROM est donc comprise entre 0000 et 00FF ce qui nous permet dutiliser
un registre de huit bit pour dfinir cette adresse.

14.6 Les Timers :


Il possde 3 timers qui sont :
-Le Timer0 (8bits) : il peut tre incrment par des impulsions extrieures via la broche (TOCKI/RA4) ou
par lhorloge interne (Fosc/4).
-Le Timer1 (16 bits) : il peut tre incrment soit par lhorloge interne par des impulsions sur la broche
T1CKI/RC0 ou par un oscillateur (RC ou quartz) connect sur les broches T1OSO/RC0 et T1OSI/RC1.
- Le Timer2 (8bits) : il est incrment par lhorloge interne, celle peut tre pr divise.
Tous ces timers peuvent dclencher une interruption interne, sils ont t autoriss.

14.7 Lunit centrale :

Organisation mmoire
Comme les PICs utilisent un bus pour les instructions et un bus pour les donnes, il faut considrer deux
plans mmoire lun pour les instructions et lautre pour les donnes ainsi que les registres internes.

Page
100

Programmation des Microcontroleurs (PIC)

EL MORNAN

Figure : Plan Mmoire pour les instructions


(Code programme)

Le plan mmoire est linaire les adresses vont de 0000h 1FFFh (8k mots de 14 bits), par page de 2K
mots. On peut remarquer, le vecteur de reset est fig en 0000h.
Les PICs nont quun seul vecteur dinterruption en 0004h. Lors dune interruption, le sous programme
associ devra dterminer quel priphrique a demand une interruption.
La pile utilise par les sous programmes nest pas implante en mmoire de donne comme avec les
microcontrleurs classiques, mais dans la mmoire programme. Elles sont utilises lors dappels de sous
programmes, on ne peut pas imbriquer plus de 8 sous programmes (Ce qui est dj beaucoup).

14.8 Les interruptions :


14-8- 1 Prsentation :
Le microcontrleur dispose de plusieurs sources d'interruptions.
Une interruption externe, action sur la broche INT/RB0.
Dbordement du TIMER0.
Changement dtat logique sur une des broches du PORTB (RB4 RB7).
Une interruption dun des priphriques (PEIE).
- Fin de programmation dune case mmoire de lEEPROM.
- Changement dtat sur le PORTD (PSPIE).
- Fin de conversion analogique numrique (ADIE).
- Rception dune information sur la liaison srie (RCIE).
- Fin dmission dune information sur la liaison srie (TXIE).
Page
101

Programmation des Microcontroleurs (PIC)

EL MORNAN

- Interruption SPI ou I2C du module MSSP (SSPIE).


- Interruption du registre de capture et/ou de comparaison 1 (CCPI1E).
- Interruption du registre de capture et/ou de comparaison 2 (CCPI2E).
- Dbordement du TIMER1 (TMR1E).
- Dbordement du TIMER2 (TMR2E).
- Collision de BUS (BCLIE)
14-8- 2 Fonctionnement :
Lors dun vnement dans un ou plusieurs des circuits priphriques (ADC, EEPROM, USART-SCI,
MSSP-I2C-SPI, TIMER1, TIMER2) comme par exemple : la fin de conversion, la fin de
programmation dun octet dans lEEPROM, la rception dune information, la dtection dun front,
etc. et si le bit de linterruption concerne a t autorise (EEIE, PSPIE, ADIE, RCIE, TXIE, SSPIE,
CCP1IE, TMR2IE, TMR1IE, CCP2IE ou BCLIE : Registres PIE1 et PIE2) alors une interruption
priphrique est dclenche. Pour que celle-ci soit prise en compte il faut que le bit dautorisation des
interruptions priphriques soit positionn 1 (PEIE) ainsi que le bit GIE dautorisation globale des
interruptions du registre INTCON.
Pour quune interruption du type TIMER0 ou INT/RB0 ou PORTB soit prise en compte il suffit que le bit
local dautorisation dinterruption soit positionn 1 (T0IE ou INTE ou RBIE) ainsi que le bit GIE
dautorisation globale des interruptions du registre INTCON.
Dans ces conditions le programme en cours dexcution est interrompu et le microcontrleur excute le
programme dinterruption partir de ladresse 0x0004. Au dbut de celui-ci il faut que le logiciel vrifie
quel priphrique a dclench linterruption.
14-8-3 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. Vous imaginez bien que votre
interlocuteur ne va pas attendre la fin de votre phrase pour vous 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).

Page
102

Programmation des Microcontroleurs (PIC)

EL MORNAN

14-8-4 Mcanisme gnrale dune interruption :


Une 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 autoris linterruption, cest dire doit avoir signal que lvnement en
question devait gnrer une interruption.

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.
Mcanisme dinterruption sur les PICs :
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.

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.
Page
103

Programmation des Microcontroleurs (PIC)

EL MORNAN

Le temps de raction dune interruption est calcul de la manire suivante : le cycle courant de
l'instruction est termin, le flag d'interruption est lu au dbut du cycle suivant. Celui-ci est achev, puis le
processeur s'arrte un cycle pour charger l'adresse 0x04 dans PC. Le processeur se connecte alors
l'adresse 0x04 o il lui faudra un cycle supplmentaire pour charger l'instruction 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.

14.9

Le convertisseur

Le CAN est un priphrique intgr destin mesurer une tension et la convertir en nombre binaire qui
pourra tre utilis par un programme.
Le16F877 travaille avec un convertisseur analogique/numrique qui permet un chantillonnage sur 10 bits.
Le signal numrique peut donc prendre 1024 valeurs possibles. On sait que pour pouvoir numriser 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. le principe de la conversion suit la
squence est la suivante :
- Le pic connecte le pin sur laquelle se trouve la tension mesurer 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 temps ncessaire la conversion est gal au temps ncessaire la conversion dun bit multipli par le
nombre de bits dsirs pour le rsultat. Concernant notre pic, il faut savoir quil ncessite, pour la
conversion dun bit, un temps nomm Tad.
Ce temps est driv par division dhorloge principale. Le diviseur peut prendre une valeur de 2, 8 ou 32. Le
temps de conversion Tad ne peut dtendre, pour des raisons lectroniques, en dessous de 1.6 us pour les
versions classiques de 16F87x, et en dessous de 6 us pour les versions LC. Donc en fonction des
frquences utilises pour le quartz du pic, on choisit le diviseur le plus appropri.
Voici un tableau qui reprend les valeurs de diviseur utiliser pour quelques frquences courantes du quartz
et pour les PICs de type classique :
Diviseur

20Mhz

5Mhz

4Mhz

2Mhz

1,25Mhz

333,3Khz

100ns

400ns

500ns

1s

1,6s

6s

400ns

1,6s

2s

4s

6,4s

24s

32

1,6s

6,4s

8s

16s

25,6s

96s

Osc RC

2-6s

2-6s

2-6s

2-6s

2-6s

2-6s

Page
104

Programmation des Microcontroleurs (PIC)

EL MORNAN

Les valeurs 400ns; 1,6s; 2s; 4s; 6,4; 24s correspondent au meilleur diviseur en fonction de la
frquence choisie, en ce qui nous concerne puisquon utilise une frquence de 4MHZ, on utilisera la
valeur de 2s dans notre programmation. Il faut prsent prciser que le PIC ncessite un temps Tad
avant le dmarrage effectif de la conversion, et un temps supplmentaire Tad la fin de la conversion.
Rsumons donc le temps ncessaire pour effectuer lensemble des oprations :
- On charge le condensateur interne (ncessite le temps Tacq).
- On effectue la conversion (ncessite le temps 12 * Tad).
- On doit attendre 2 * Tad avant de pouvoir recommencer une autre conversion.

Figure : cycle de conversion


Le module de conversion utilise 4 registres disposs comme suit :
*Registre de Rsultat High (ADRESH)
*Registre de Rsultat Low (ADRESL)
*Registre0 de Contrle (ADCON0)
*Registre1 de Contrle (ADCON1)
Regardons cela de prs dans la figure ci-dessous :
Configuration interne du module de convertisseur analogique/numrique :

Figure : module du convertisseur


Page
105

Programmation des Microcontroleurs (PIC)

EL MORNAN

On voit trs bien sur ce schma que les pins AN2 et AN3 servent selon la position du slecteur dentre
analogique ou de tension de rfrence. Le slecteur de canal permet de slectionner lequel des 8 canaux
va tre appliqu au convertisseur analogique/digital.
On voit que la slection de la source des tensions de rfrence dpend de bits du registre ADCON1, tandis
que le canal slectionn pour tre numris dpend dADCON0. Cest le registre ADCON1 qui
dtermine si ce port sera utilis comme port I/O ou comme port analogique. Nous en aurons besoin dans
la programmation.

Les registres ADRESL et ADRESH :


Le convertisseur donne un rsultat sur 10 bits, et donc que ce rsultat devra donc obligatoirement tre
sauvegard dans 2 registres. Ces registres sont tout simplement les registres ADRESL et ADRESH.
Comme 2 registres contiennent 16 bits, et que nous nen utilisons que 10, Microchip nous a laiss le
choix sur la faon dont est sauvegard le rsultat, nous pouvons soit justifier le rsultat gauche, soit
droite
La justification droite complte la partie gauche du rsultat par des 0 . Le rsultat sera donc de la
forme :
ADRESH

ADRESL

B9

B8

B7

B6

B5

B4

B3

B2

B1

B0

La justification gauche procde bien videmment de la mthode inverse :


ADRESH

B9

B8

ADRESL

B7

B6

B5

B4

B3

B2

B1

B0

La justification droite sera principalement utilise lorsque nous avons besoin de lintgralit des 10 bits
de rsultat, tandis que la justification gauche est trs pratique lorsque 8 bits vous suffisent. Dans ce cas,
les 2 bits de poids faibles se trouvent isols dans ADRESL, il suffit donc de ne pas en tenir compte. Cette
approche est destine nous pargner des dcalages de rsultats.
Le choix de la mthode seffectue laide du bit 7 dADCON1.
Le registre ADCON1 :
Ce registre permet de dterminer le rle de chacune des pins AN0 AN7. Il permet donc de choisir si un
pin sera utilis comme entre analogique, comme entre/sortie standard, ou comme tension de rfrence.
Il permet galement de dcider de la justification du rsultat.
Pour pouvoir utiliser un pin en mode analogique, il faudra que ce pin soit configur galement en entre
par TRISA. Le registre ADCON1 dispose, comme tout registre accessible de notre PIC, de 8 bits, dont
seulement 5 sont utiliss :

Page
106

Programmation des Microcontroleurs (PIC)

EL MORNAN

Tableau : le registre ADCON1


B7

ADFM

A/D result format select

B6

INUTILISE

lu comme 0

B5

INUTILISE

lu comme 0

B4

INUTILISE

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

PCFG1

Port Configuration control bit 0

Le bit ADFM permet de dterminer si le rsultat de la conversion sera justifi droite (1) ou gauche (0).
Nous trouvons dans ce registre les 4 bits de configuration des pins lis au convertisseur
analogique/numrique. Ces bits nous permettent donc de dterminer le rle de chaque pin.
Comme nous avons 16 combinaisons possibles, nous aurons autant de possibilits de configuration (en fait,
vous verrez que nous nen avons que15)
Le registre ADCON0 :
Ce registre est le dernier utilis par le convertisseur analogique/numrique. Il contient les bits que nous
allons manipuler lors de notre conversion. Sur les 8 bits de notre registre, 7 seront utiliss.

Page
107

Programmation des Microcontroleurs (PIC)

EL MORNAN

Tableau : le registre ADCON0 :


B7

ADCS1

A/D conversion Clock Select bit 1

B6

ADCS0

A/D conversion Clock Select bit 0

B5

CHS2

Analog Channel Select bit2

B4

CHS1

Analog Channel Select bit1

B3

CHS0

Analog Channel Select bit0

B2

GO/DONE

A/D conversion status bit

B1

Inutilis

lu comme 0

B0

ADON

A/D ON bit

14.10 loscillateur :
Lhorloge est un systme qui peut tre ralise soit avec un QUARTZ(a), soit avec une horloge
extrieur(b), soit avec un circuit RC(c), dans ce dernier la stabilit du montage est limite.
La frquence maximale dutilisation va dpendre de Microcontrleur utilis. Le suffixe indiqu sur le

botier donne la nature de lhorloge utiliser et sa frquence maximale

Page
108