You are on page 1of 28

Les microcontrleurs PIC de Microchip : le 16F84

I- Introduction
1.1 Dfinition
Un PIC est un microcontrleur (C), cest--dire une unit de traitement de linformation laquelle
on a ajout des priphriques internes permettant de faciliter linterfaage avec le monde extrieur sans
ncessiter lajout de composants externes.
Microcontrleur = CPU + Mmoire + Interface dentre/sortie
1.2 Architecture Harvard contre Von Neumann
1.2.1 Architecture Von Neumann
Mmoire de programme contenant instructions et donnes
Unit centrale

Bus de donnes

Architecture de la plupart des microprocesseurs ;


La mmoire contient la fois les instructions et les programmes places les unes la suite
des autres ;
Un seul bus (bus de donnes) sert vhiculer tour tour les codes des instructions et les
donnes qui leur sont associes ;
Lexcution dune seule instruction ncessite plusieurs changes sur le seul bus dvolu cet
usage lenteur.

1.2.2

Architecture Harvard

Mmoire de programme ne contenant que des instructions


Unit
Mmoire de donnes
Bus de donnescentrale

Bus dinstructions

Les donnes et les instructions sont diffrencies ;


Lexcution dune instruction ne fait appel qu un seul cycle machine puisque lon peut
simultanment, grce aux deux bus, rechercher le code de linstruction et la ou les donnes
quelle manipule vitesse dexcution des programmes impressionnante.

Les microcontrleurs PIC utilisent une architecture Harvard. Ils font galement appel une
architecture de type RISC (Reduced Instruction Set Computer).
-

Les circuits RISC utilisent une structure de type pipe-line qui leur permet dexcuter une
instruction tout en recherchant la suivante en mmoire ;
- De plus, les circuits RISC excutent toutes leurs instructions en un seul cycle machine d en
grande partie au codage de linstruction en un seul mot.
1.3 Les rfrences des Pics
Les microcontrleurs PIC de Microchip- Le 16F84- Notes de cours- Anne 2010- Dr. ALI Eugne

Page 1

Une rfrence de microcontrleur Microchip est toujours de la forme :


NN LLL XXX

NN : famille laquelle appartient le circuit : peut tre 12, 16, 17 ou 18. On distingue 3
grandes familles :
-

LLL : ensemble de une, deux ou trois lettres dsignant tout la fois, le type de mmoire
de programme contenu dans le circuit et la plage de tension dalimentation (tendue ou
normale) :
-

12 : Base-line (instruction sur 12 bits)


16 : Mid-range (instruction sur 14 bits)
16 ou 17 : High-range (instruction sur 16 bits)

CC : mmoire EPROM
CR : mmoire ROM
F : mmoire Flash.

XXX : ensemble de deux ou trois chiffres constituant la rfrence du circuit dans la


famille et permettant de savoir de quelles ressources internes il dispose.

Un suffixe peut galement suivre la rfrence : il dsigne en gnral la frquence maximale du


circuit dhorloge.
Exemple : 16 F 84-04 : PIC Mid-range dont la mmoire programme est de type Flash, de
rfrence 84 et capable daccepter une frquence dhorloge de 4 MHz.
Remarque :
Les PICs sont des composants statiques, cest--dire que la frquence dhorloge peut tre
abaisse jusqu larrt complet sans perte de donnes et sans disfonctionnement.

II- Le hardware

Les microcontrleurs PIC de Microchip- Le 16F84- Notes de cours- Anne 2010- Dr. ALI Eugne

Page 2

2.1 Prsentation gnrale du PIC 16F84


Les caractristiques principales du 16F84 sont :
-

Une mmoire programme de type flash de 1024 mots de14 bits ;


Une RAM constitue :
des registres de contrle SFR (Special Function Register)
64 octets de RAM utilisateurs appels aussi GPR (General Propose Register).
Une mmoire EEPROM de 64 octets ;
2 ports dE/S, un de 8 bits et un de 5 bits ;
1 timer/compteur cadenc par une horloge interne ou externe ;
1 chien de garde/compteur qui est un timer particulier ;
1 prdiviseur de frquences programmables permettant dtendre les possibilits du timer
TMRO et du chien de garde WDT ;
4 sources dinterruption ;
Lhorloge peut tre gnre par 4 types doscillateurs slectionnables ;
Protection en mode sleep pour rduction de consommation ;
Programmation par mode ICSP (In Circuit Serial Programming).

2.2 Le brochage
Le 16F84 est un boitier de 18 broches constitues de :
Les microcontrleurs PIC de Microchip- Le 16F84- Notes de cours- Anne 2010- Dr. ALI Eugne

Page 3

Lalimentation Vdd/Vss;
2 entres dhorloge OSC1 et OSC2 ;
1 entre RESET qui est la broche MCLR ;
13 broches constituant les lignes dE/S des ports A et B dont 2 sont multiplexs : RA4/TOCK1
et RBO/INT.

2.3 Architecture interne du 16F84


2.3.1 LALU et le registre W
Cest une ALU 8 bits qui ralise les oprations arithmtique et logique entre laccumulateur W
et nimporte quel autre registre f ou constante k. Laccumulateur W est un registre de travail 8 bits,
il na pas dadresse comme les autres SFR. Pour les instructions 2 oprandes, cest toujours le registre
W qui contient lun des oprandes. Pour les instructions un oprande, celui-ci peut tre soit dans W
soit nimporte quel registre f.
2.3.2 Les registres de lunit centrale (la mmoire RAM)
Ces registres permettent de configurer tous les modules internes du PIC. On distingue :
-

Les registres INDF et FSR : les registres dadressage indirect ;


PCL et PCLATH : les registres du compteur programme ;
STATUS : bits C, DC, Z : permettent de tester le rsultat dune opration;
OPTION-REG pour dfinir le mode du timer, prescaler, etc. ;
INTCON pour les interruptions ;
PORTA, PORTB, TRISA, TRISB pour les ports ;
TMRO pour le timer ;
EEADR, EEDATA, EECON1, EECON2 pour la mmoire EEPROM.

Ces registres sont accessibles en lecture et criture suivant leur fonction. Lespace mmoire
contenant ces registres est scinde en 2 parties : BANK0 et BANK1. Ces deux parties sont accessibles
par la mme adresse ; la slection de lun des bank se fait selon deux bits de contrle : (RP1 et RP0) du
registre dtat STATUS.
adresses
00
01
02
03

Bank 0
INDF
TMRO
PCL
STATUS

Bank 1
INDF
OPTION
PCL
STATUS

adresses
80
81
82
83

Les microcontrleurs PIC de Microchip- Le 16F84- Notes de cours- Anne 2010- Dr. ALI Eugne

Page 4

04
05
06
07
08
09
0A
0B
0C
.
.
.
4F

FSR
PORTA
PORTB

FSR
TRISA
TRISB

EEDATA
EEADR
PCLATH
INTCON

EECON1
EECON2
PCLATH
INTCON

Mmoire utilisateur
(GPR) : positions
mmoires pour
stocker des variables
et des donnes

Mapped in bank 0

84
85
86
87
88
89
8A
8B
8C
.
.
.
CF

Remarques :

Pour accder un registre, il faut dabord se placer dans le bank o il se trouve : ceci se
fait grce aux bits RP0 et RP1 du registre dtat STATUS :
- Si RP0 = 0 on accde au bank 0
- Si RP0 = 1 on accde au bank 1
Pour la mmoire utilisateur, lutilisation des bank nest pas ncessaire puisque le bank 1
est mapped au bank 0. Cela signifie qucrire une donne ladresse 0CH ou
ladresse 8CH revient au mme.

2.3.3 Etude de quelques registres


a) Le registre INDF dadresse 00 ou registre dadressage indirect
Ce registre na aucune existence physique. En criture, un NOP est produit. En lecture, on y
trouve toujours 00. Ce registre sert uniquement spcifier lutilisation de ladressage indirect de la
faon suivante :
ADDWF INDF,W ; ajouter au contenu du registre W, le contenu de la case mmoire adresse par le registre FSR.
On ralise ladressage indirect par rapport au contenu du registre FSR en se servant de INDF
comme mode de notation.
b) Le registre PCL dadresse 02
Cest un registre de 8 bits. Ce nest autre que les 8 bits de poids faible du registre PC (program
counter). Le contenu de ce registre est complt avec tout ou partie du registre PCLATH pour gnrer
la valeur relle du PC lors de certaines instructions particulires.

c) Le registre STATUS dadresse 03 ou registre dtat


Ce registre contient les bits dtat de lunit centrale et les bits RP0 et RP1 de slection des
pages (bank) de la mmoire de donnes.
Les microcontrleurs PIC de Microchip- Le 16F84- Notes de cours- Anne 2010- Dr. ALI Eugne

Page 5

IRP

RP1

RP0

TO

PD

DC

C =1 si retenue, 0 sinon
DC=1 si une retenue est gnre du bit 3 vers le quartet suprieur dans les instructions
ADDLW et ADDWF. DC =0 sinon.
Z=1 si le rsultat de lopration arithmtique ou logique excute est nul et 0 sinon.
PD = 0 lors de lexcution de linstruction SLEEP. Il est 1 suite une mise sous
tension ou lexcution de linstruction CLRWDT.
TO =1 lors du dbordement du timer chien de garde et est 0 suite une mise sous
tension ou lexcution de linstruction CLRWDT ou SLEEP.
RP0 = 0 : choix du bank 0 et RP0 = 1, choix du bank 1.

d) Le registre FSR dadresse 04 ou registre de slection de registre.


Le contenu de ce registre est utilis pour raliser ladressage indirect. Cest un registre de 8 bits.
e) Le registre PCLATH dadresse 0A
Ce registre nest cit que pour mmoire puisque son rle a t dtaill lors de ltude du registre
PCL.
Remarque :
Les autres registres seront tudis ultrieurement lors de ltude dtaille des ports A et B, des
interruptions, du timer et de lEEPROM.
2.3.4 La mmoire programme (FLASH)
Cette mmoire de 1024 mots ($000-$3FF) de 14 bits stocke le programme. Elle est volatile et
reprogrammable souhait. Chaque position de 14 bits contient une instruction. Ce qui permet de coder
sur un mot linstruction et loprande ou son adresse. Le code produit est ainsi compact.
Lemplacement du programme peut se situer nimporte quel endroit de la mmoire.
Remarque :
Suite un RESET, le PIC commence lexcution ladresse 0000 H. De plus, lorsquil y a une
interruption, le PIC va ladresse 0004H. On conseille donc de placer le dbut du programme aprs
ladresse 0004H et de mettre un branchement au dbut du programme ladresse 0000 H et un
branchement au dbut de la routine dinterruption sil y en a une ladresse 0004H.

org 0
goto L0
org 4
Les microcontrleurs PIC de Microchip- Le 16F84- Notes de cours- Anne 2010- Dr. ALI Eugne

Page 6

goto L1
org 0x30
L0

..
..
..

L1

..
..
retfie
end

NB : ltiquette L0 correspond ladresse 0x30 et L1 correspond ladresse du sous programme


dinterruption.

III- Le software du 16F84


3.1 Les modes dadressage
3.1.1 Dfinition
Les modes dadressage sont un ensemble de techniques permettant daccder aux oprandes
dune opration ou leur adresse.
3.1.2 Etude des modes dadressage
a) Adressage immdiat (ou littral)
Dans ce mode dadressage, la donne manipule par linstruction est code avec linstruction
elle-mme. La donne en question sappelle ici un litral .
MOVLW k ; transfrer le litral k, qui est une valeur quelconque code sur 8 bits (de 0 255) dans le registre W.
b) Adressage direct
Ce mode consiste coder le nom du ou des registres directement dans linstruction.
MOVWF f ; transfrer le contenu du registre W dans le registre f repr par son adresse
MOVF f,d ; transfrer le contenu du registre f dans W si d = 0 ou dans f lui-mme si d = 1.

c) Adressage permettant la manipulation des bits


Ce mode dadressage ne semploie jamais seul mais toujours coupl avec ladressage direct.
BCF f,b ; mettre zro le bit b du registre f ; b varie entre 0 et 7 ; f est repr par son adresse.
Les microcontrleurs PIC de Microchip- Le 16F84- Notes de cours- Anne 2010- Dr. ALI Eugne

Page 7

d) Adressage indirect
Le registre FSR dadresse 04 ou registre de slection du registre dans lequel on place le numro
du registre adress. Le mode de notation correspondant utilise le registre INDF sous la forme par
exemple :
MOVWF INDF ; transfrer le contenu de W dans lemplacement mmoire adress par FSR.
3.2 Les instructions du 16F84
Tous les PICs Mid-range ont un jeu de 35 instructions. Chaque instruction est code sur un mot
de 14 bits qui contient le code opration ainsi que loprande. A part les instructions de saut, toutes les
instructions sont excutes en un cycle dhorloge. Sachant que lhorloge fournie au PIC est prdivise
par 4, si on utilise par exemple un quartz de 4 MHz, on obtient donc 1 000 000 de cycles/ seconde, soit
une puissance de lordre de 1MIPS (1 Million dInstructions par seconde).
3.2.1 Les instructions orientes octet (adressage direct)
Ce sont des instructions qui manipulent les donnes sous forme doctets.
f : registre (file register), de 0 7Fh
d : destination ; d = 0 rsultat dans W ; d = 1 rsultat dans f.
Exemple :
MOVF f,d
3.2.2 Les instructions orientes bits
Ce sont des instructions destines manipuler directement les bits dun registre particulier.
b : numro du bit affect par lopration (varie de 0 7)
f : registre cod par son adresse
Exemple :
BCF PORTA,0 ; mettre le bit 0 du port A 0.
BTFSS PORTB,5 ; tester le bit 5 du port B, saut si gal 1.
3.2.3 Les instructions oprant sur une donne (adressage immdiat)
Ce sont les instructions qui manipulent des donnes (litral) qui sont codes dans linstruction
directement. La valeur immdiate appele litral est code sur 8 bits (de 0 255).

Remarque :
Les mnmoniques de ces instructions comportent un L pour litral. Ce sont des instructions
un seul oprande qui est le litral k.
Exemple :
Les microcontrleurs PIC de Microchip- Le 16F84- Notes de cours- Anne 2010- Dr. ALI Eugne

Page 8

ANDLW k ; ET logique entre le litral k et le contenu du registre W. Le rsultat est stock dans W.
SUBLW k ; k - W W.
3.2.4 Les instructions de saut et dappel de procdure
Elles provoquent une rupture dans la squence de droulement du programme.
Exemple :
CALL L ; appel du sous programme L
GOTO L ; branchement ltiquette L
NOP ; pas dopration
RETURN ; retour dun sous programme
RETFIE ; retour dinterruption
RETLW ; retour dun sous programme avec k dans le registre W.
SLEEP ; mise en mode standby
La liste complte des instructions du PIC 16F84 se trouve en annexe.
IV- Programmation du PIC 16F84
4.1 Structure de base dun programme en assembleur
Elle se prsente selon le modle suivant :
List p = 16F84A

; dclaration du processeur

#include <p16F84.inc>

; dclaration du fichier des registres

_config H3FF1

; protection off ; PWRTE on; WDT off; XT

Constante1

equ

valeur1

Constante2

equ

valeur2

; liste des quivalences et des constantes

.
cblock

0x0C ; dclaration des registres usage gnral

Reg1
Reg2
endc
.
org 0
bsf

STATUS, RP0; choix du bank 1

Les microcontrleurs PIC de Microchip- Le 16F84- Notes de cours- Anne 2010- Dr. ALI Eugne

Page 9

Debut

movlw

bxxxxxxxx ; charger le registre w avec le nombre binaire (x=0 ou 1)

movwf

TRISB

bcf

STATUS, RP0 ; choix du bank 0

; configuration des lignes du port B en entre ou en sortie

instruction 1
Instruction 2
end

; fin du programme

Les tiquettes (ou labels) commencent toujours la premire colonne ;


Les instructions, les directives (LIST, _CONFIG ou ORG) commencent partir de la
deuxime colonne ;
Une ligne commenant par un point virgule ( ;) est un commentaire ;
La fin du programme est signifie par end .

4.2 Exemples de programmes


4.2.1 Exemple 1
Ecrire un programme permettant de compter les bits nuls du registre W. Mettre le rsultat
lemplacement mmoire dadresse 12 du bank 0.

cpt

List p = 16F84A

; dclaration du processeur

#include <p16F84.inc>

; dclaration du fichier des registres

_config H3FF1

; protection off ; PWRTE on; WDT off; XT

equ

0x0E

; cpt = emplacement mmoire dadresse 0E

cblock

0x0C

resul

; resul = emplacement mmoire dadresse 0C

reg

; reg = emplacement mmoire dadresse 0D

endc
org 0

M1

bcf

STATUS,rp0 ; choix du bank 0

clrf

resul

; initialiser registre resul 0

movwf

reg

; charger reg avec contenu du registre W

movlw

0x08

; charger W avec la valeur hexadcimale 08

movwf

cpt

; cpt = 08h

btfsc

reg,0

; tester bit 0 du registre reg, saut dune ligne si nul

Les microcontrleurs PIC de Microchip- Le 16F84- Notes de cours- Anne 2010- Dr. ALI Eugne

Page 10

rotation

Goto

rotation

; si bit test = 1, aller ltiquette rotation

Incf

resul,1

; si bit test = 0, incrmenter registre resul

rrf

reg,1

; rotation du contenu de reg dun rang vers la droite

decf

cpt,1

; dcrmenter cpt de 1

btfss

STATUS,z

; tester le bit z de STATUS, saut dune ligne si bit z = 1

goto

M1

; si bit z = 0 (cpt 0), saut ltiquette M1

end

; si bit z = 1 (cpt=0), fin du programme

4.2.2 Exemple 2
Soit une table de 10 octets commenant lemplacement mmoire dadresse 20H. Ecrire un
programme permettant de complmenter les lments de cette table lorsquelle est parcourue dans le
sens des adresses croissantes.
List p = 16F84A

; dclaration du processeur

#include <p16F84.inc>

; dclaration du fichier des registres

_config H3FF1

; protection off ; PWRTE on; WDT off; XT

Cblock

0x20

; adresse dbut de RAM

Tab :

0x0A

; taille de la table

cpt
endc

main

M0

org

0x00

goto

main

org

0x30

bcf

STATUS,RP0 ; choix du bank 0

movlw

0x0A

; charger W avec 0Ah

movwf

cpt

; cpt = 0Ah

movlw

0x20

; charger W avec 20h

movwf

FSR

; FSR pointe lemplacement mmoire dadresse 20H

comf

INDF,f

; complmenter la case mmoire adresse par FSR

decfsz

cpt,f

; dcrmenter cpt, saut dune ligne si cpt = 0

goto

encore

; si cpt 0 , aller ltiquette encore

goto

fin

; si cpt=0, aller ltiquette fin

Les microcontrleurs PIC de Microchip- Le 16F84- Notes de cours- Anne 2010- Dr. ALI Eugne

Page 11

encore

fin

incf

FSR,f

; incrmenter le contenu du pointeur FSR

goto

M0

; saut ltiquette M0

end

; fin du programme

4.2.3 Multiplication de 2 nombres de 8 bits, rsultat sur 16 bits


4.2.3.1 Recherche de lalgorithme sur la multiplication de 2 nombres de 4 bits
Exemple : multiplier 12 (1100 en binaire) par 13 (1101 en binaire)

Procdure classique
1100

multiplicande

1101
1100
00000
110000
1100000
10011100

multiplicateur

rsultat du calcul cod sur 8 bits avec un bit de retenue

Explication de la procdure :
- On a multipli 1100 par 1, on obtient 1100 ;
- On a multipli 1100 par 0 et on dcale le rsultat vers la gauche, on obtient 00000 ;
- On a multipli 1100 par 1, et on dcale le rsultat vers la gauche, on obtient 110000 ;
- On a multipli 1100 par 1, on procde de mme, on obtient 1100000 ;
- Enfin, on additionne le tout et on obtient 10011100.
Si on ralisait ce programme, il faudrait 4 variables supplmentaires pour stocker les rsultats
intermdiaires, 8 dans le cas dune multiplication 8 bits.
On peut procder laddition au fur et mesure du rsultat intermdiaire avec le rsultat. On
obtient lalgorithme suivant :
- On multiplie 1100 par 1, on place le rsultat dans rsultat final ;
- On multiplie 1100 par 0, on dcale une fois gauche puis on lajoute au rsultat final ;
- On multiplie 1100 par 1, on dcale deux fois gauche puis on lajoute au rsultat final ;
- On multiplie 1100 par 1, on dcale trois fois gauche puis on lajoute au rsultat final.
Cet algorithme est pratique mais au lieu de dcaler le multiplicateur vers la gauche, on peut
procder autrement en dcalant le rsultat vers la droite pour navoir que des additions de 8 bits faire.
Si on appliquait cette dernire mthode lexemple de 4 bits, on aurait lalgorithme suivant :
- On multiplie 1100 par 1, on obtient 1100 qui est le quartet haut du rsultat final, ce qui
donne 11000000 ;
- On dcale ce rsultat vers la droite, on obtient 01100000 ;
- On multiplie 1100 par 0 et on ajoute ce rsultat au rsultat final, on obtient 01100000 ;
- On dcale ce rsultat vers la droite pour obtenir 00110000 ;
- On multiplie 1100 par 1 puis on ajoute le rsultat au quartet de poids fort du rsultat final, ce
qui donne : 11000000 + 00110000 = 11110000 ;
- On dcale ce rsultat dun rang vers la droite : 01100000 ;
- On multiplie 1100 par 1 puis on ajoute le rsultat au quartet de poids fort du rsultat final, ce
qui donne : 11000000 + 01100000 = 100111000 (9 bits dont le bit de retenue va dans la
carry) ;
Les microcontrleurs PIC de Microchip- Le 16F84- Notes de cours- Anne 2010- Dr. ALI Eugne

Page 12

On dcale le rsultat dun rang vers la droite, on obtient : 10011100.

Remarque :
On ajoute toujours au quartet de poids fort. Dans le cas dune multiplication 8 bits, on ajoutera
loctet de poids fort du rsultat qui est sur 16 bits. Aprs le dcalage, la carry est amene dans le
rsultat, on rcupre donc le bit de retenue qui devient le 7 me bit du rsultat aprs dcalage vers la
droite.
Lalgorithme, pour une multiplication 8 bits est le suivant :
- Initialiser le registre rsultat 0 ;
- Pour chacun des 8 bits du multiplicateur ;
Si le LSB du multiplicateur est gal 1 ;
o Ajouter le multiplicande loctet de poids fort du rsultat ;
Dcaler le rsultat (16 bits) dun rang vers la droite ;
Dcaler le multiplicateur dun rang vers la droite ;
- bit suivant.
Si on place le dcalage du multiplicateur avant le test du bit, on rcupre le bit tester dans la
carry. Do lalgorithme final suivant :
- initialiser le registre rsultat 0 ;
- pour chacun des 8 bits du multiplicateur ;
dcaler le multiplicateur vers la droite
si carry = 1
o ajouter multiplicateur loctet de poids fort du rsultat ;
dcaler le rsultat de 16 bits dun rang vers la droite.

cpt

Pour la programmation, adoptons les variables suivantes :


multiplicande : multan
multiplicateur : multi
octet de poids fort du rsultat : resul_H
octet de poids faible du rsultat : resul_L
multiplicateur temporaire : multemp (registre temporaire ou de travail)
compteur : cpt

List p = 16F84A

; dclaration du processeur

#include <p16F84.inc>

; dclaration du fichier des registres

_config H3FF1

; protection off ; PWRTE on; WDT off; XT

equ

0x0C

; cpt = emplacement mmoire dadresse 12

cblock

0x0D

Les microcontrleurs PIC de Microchip- Le 16F84- Notes de cours- Anne 2010- Dr. ALI Eugne

Page 13

resul_L

; resul_L = emplacement mmoire dadresse 13

resul_H

; resul_H = emplacement mmoire dadresse 14

multi

; multi= case mmoire dadresse 15

multan

; multan= case mmoire dadresse 16

multemp

; multemp = case mmoire dadresse 17

endc

main

boucle

org

0x00

goto

main

org

0x30

bcf

STATUS,RP0 ; choix du bank 0

clrf
clrf
movlw
movwf
movf
movwf
movf
rrf
btfsc
addwf
rrf
rrf
decfsz

resul_H
resul_L
0x08
cpt
multi,w
multemp
multan,w
multemp,f
STATUS,C
resul_H,f
resul_H,f
resul_L,f
cpt,f

goto

boucle

end

; intialiser loctet de poids fort du rsultat 0


; intialiser loctet de poids faible du rsultat 0
; charger le registre W avec 08h
; initialiser le compteur 08h
; charger le multiplicateur dans le registre W
; charger le multiplicateur dans le registre temporaire
; charger le registre W avec le multiplicande
; dcaler le multiplicateur dun rang vers la droite
; carry = 1?
; si carry = 1, ajouter au poids fort du rsultat
; si carry = 0 dcaler poids fort rsultat vers la droite
; dcaler poids faible du rsultat dun rang vers la droite
; dcrmenter le compteur
; si cpt 0 , saut ltiquette boucle
; si cpt = 0, fin du programme

Utilisation de la multiplication gyptienne


aXb=a+a+ a++ a
(b fois)

Ici, le multiplicande est a et le multiplicateur b est pris comme un compteur.


Exemple :
Ecrire un programme effectuant la multiplication de deux nombres de 8 bits.
List p = 16F84A

; dclaration du processeur

#include <p16F84.inc>

; dclaration du fichier des registres

_config H3FF1

; protection off ; PWRTE on; WDT off; XT

cblock

0x0C

Les microcontrleurs PIC de Microchip- Le 16F84- Notes de cours- Anne 2010- Dr. ALI Eugne

Page 14

multi

; multi = emplacement mmoire dadresse 12

multan

; multan = emplacement mmoire dadresse 13

resul_L

; resul_L = emplacement mmoire dadresse 14

resul_H

; resul_H = emplacement mmoire dadresse 15

endc

main

M0

fin

org

0x00

goto

main

org

0x20

bcf

STATUS,RP0 ; choix du bank 0

clrf
clrf
movf
movf
btsfc
goto
addwf
btsfc
incf
decfsz

resul_l
resul_H
multan,0
multi,1
STATUS,Z
fin
resul_L,1
STATUS,C
resul_H,1
multi_L,1

goto

M0

end

; initialisation 0 de loctet de poids faible du rsultat


; initialisation 0 de loctet de poids fort du rsultat
; charger W avec le multiplicande
; charger la case mmoire d@ 12 avec le multiplicateur
; tester le bit z du registre STATUS
; si bit z = 1, aller fin du programme
; si bit z = 0, ajouter multiplicande au rsultat
; laddition gnre-t-il une retenue?
; si oui, incrmenter octet de poids fort du rsultat
; si non, dcrmenter le multiplicateur
; si multiplicateur 0 , saut ltiquette M0
: si multiplicateur = 0, fin du programme

4.2.4 Les comparaisons

Pour faire une comparaison, il suffit de faire une soustraction.


Movf
mem1,w
; charger W avec mem1
Subwf
mem2,w
; faire mem2-mem1, rsultat dans W

Il suffit ensuite de tester les bits c et z du registre STATUS pour connatre le rsultat de la
comparaison.
-

Si z = 1, il y a galit ;
Si z = 0 et c = 1, le rsultat est positif, donc mem2 > mem1 ;
Si z = 0 et c = 0, le rsultat est ngatif, donc mem2 < mem1.

Pour comparer lidentit entre deux valeurs, sans modifier c, on peut utiliser le ou exclusif
XOR .
Movf
mem1,w
; charger W avec mem1
Xorwf
mem1,w
; ou exclusif entre mem1 et mem2, rsultat dans W
-

Si z = 1, il y a galit entre les deux nombres compars ;


Si z = 0, il y a ingalit (les deux nombres sont diffrents).

Les microcontrleurs PIC de Microchip- Le 16F84- Notes de cours- Anne 2010- Dr. ALI Eugne

Page 15

Exemple :
Ecrire un programme permettant de classer par ordre croissant, 36 octets non signs partir de
ladresse 20. On utilisera la technique du tri bulle.

main
M0

M1

M2
M3

List p = 16F84A

; dclaration du processeur

#include <p16F84.inc>

; dclaration du fichier des registres

_config H3FF1

; protection off ; PWRTE on; WDT off; XT

org

0x00

goto

main

org

0x20

bcf
bcf
movlw
movwf
movlw
movwf
clrf
movf
movwf
incf
subwf
btfss
goto
movf
decf
movwf
incf
decfsz
goto
movf
btfsc
goto

STATUS,RP0
STATUS,RP1
.35
.12
.20
FSR
.13
INDF, w
.14
FSR, 1
INDF, w
STATUS, C
M2
INDF, w
FSR, 1
INDF
FSR 1
.12, 1
M1
.13 , f
STATUS, Z
M0

end

4.2.5 Adressage indirect pointant sur deux zones diffrentes


Le 16F84 ne dispose que dun seul pointeur qui est le registre FSR. Comment alors pointer sur
deux zones la fois ?

Les microcontrleurs PIC de Microchip- Le 16F84- Notes de cours- Anne 2010- Dr. ALI Eugne

Page 16

Soient mem1 ladresse de dbut du premier tableau et mem2, celle du second tableau.
Supposons contiennent par exemple 15 octets chacun. On propose dans cet exemple de copier les
lments du premier tableau dans le second. Le programme principal se prsente comme suit :

main

boucle

fin

bcf
movlw

STATUS,RP0 ; choix du bank 0


mem1
; charger W avec ladresse mem1

movwf

FSR

; FSR pointe mem1

movlw

d15

; charger W avec la valeur dcimale 15

movwf

cpt

; cpt = 15

movf

INDF,w

; lecture dans W de loctet adress par FSR

movwf

tampon

; sauver loctet lu dans tampon

movlw

mem2-mem2 ; charger W avec mem2-mem1

addwf

FSR,f

; FSR pointe mem2 car (mem2-mem1+mem1) = mem2

movf

tampon,w

; charger W loctet lu

movwf

INDF

; crire loctet lu dans le 2nd tableau l@ point par FSR

movlw

(mem1-mem2)+1

addwf

FSR,f

; FSR pointe mem1 + 1

decfsz

cpt,f

; dcrmenter le compteur

goto

boucle

; si cpt 0 , saut boucle

end

; charger W avec la valeur (mem1-mem2)+1

; si cpt = 0, fin du programme

V- La mmoire EEPROM de configuration


Pendant la phase d'implantation d'un programme dans la mmoire programme du PIC, on
programme aussi une EEPROM de configuration constitue de 5 mots de 14 bits :
Les microcontrleurs PIC de Microchip- Le 16F84- Notes de cours- Anne 2010- Dr. ALI Eugne

Page 17

4 mots didentification (ID) partir de ladresse 0x2000 pouvant contenir un reprage


quelconque que nous n'utiliserons pas,

1 mot de configuration (adresse 0x2007) qui permet :


o de choisir le type de l'oscillateur pour l'horloge
o de valider ou non le WDT timer
o dinterdire la lecture des mmoires EEPROM de programme et de donnes.

13

122 11

CP

CP

CP

10

CP

CP

CP

CP

CP

CP

CP

PWRT
E

WDT
E

FOSC
1

FOSC
0

bits 1:0 FOSC1:FOSC0 Slection du type d'oscillateur pour l'horloge


11 : Oscillateur RC
10 : Oscillateur HS (High speed) : quartz haute frquence (jusqu' 10 MHz)
01 : Oscillateur XT, c'est le mode le plus utilis, quartz jusqu' 4 MHz
00 : Oscillateur LP (Low power), consommation rduite, jusqu' 200 kHz

bit 2 WDTE validation du timer WDT (chien de garde)


1 : WDT valid
0 : WDT inhib

Bit 3 PWRTE validation d'une temporisation la mise sous tension


1 : temporisation inhibe
0 : temporisation valide

Bit 13:4 CP Protection en lecture du code programme


1 : pas de protection
0 : protection active

VI- La mmoire EEPROM de donnes


La mmoire EEPROM de donnes est constitue de 64 octets commenant l'adresse 0x2100
que l'on peut lire et crire depuis un programme. Ces octets sont conservs aprs une coupure de
courant et sont trs utiles pour conserver des paramtres semi permanents. On y accde l'aide des
registres EEADR et EEDATA : toute lecture ou criture dans le registre EEDATA se fait dans la
position mmoire pointe par EEADR. En fait, EEADR contient l'adresse relative par rapport la page
qui commence en 0x2100, autrement dit, l'adresse va de 0 63.
Deux registres de contrle (EECON1 et EECON2) sont associs la mmoire EEPROM. La
dure dcriture dun octet est de lordre de 10 ms. La fin de chaque criture russie est indique par le
drapeau EEIF et la remise zro du bit RW du registre EECON1. Le drapeau EEIF peut dclencher
l'interruption EEI si elle a t valide.
EECO

EEIF

WRERR

WREN

RW

RD

6.1 Procdure de lecture dans l'EEPROM de donnes


Les microcontrleurs PIC de Microchip- Le 16F84- Notes de cours- Anne 2010- Dr. ALI Eugne

Page 18

1. Placer ladresse relative dans EEADR ;


2. Mettre le bit RD de EECON1 1 ;
Lire le contenu du registre EEDATA.

6.2 Procdure d'criture dans l'EEPROM de donnes


1. Ecriture dans L'EEPROM doit tre autorise par le positionnement 1 du bit WREN ;
2. Placer ladresse relative dans EEADR ;
3. Placer la donne crire dans EEDATA ;
4. Placer 0x55 dans EECON2 ;
5. Placer 0xAA dans EECON2 ;
6. Dmarrer l'criture en positionnant le bit WR (bit 1 du registre EECON1);
7. Attendre la fin de l'criture, (10 ms) (EEIF=1 ou WR=0) ;
8. Recommencer au point 2 si on a d'autres donnes crire.
Remarque :
-

Le drapeau WRERR est positionn si une erreur d'criture intervient.


EECON2 nest pas vritablement un Registre. Microchip lutilise en tant que registre de
commande. Lcriture de valeurs spcifiques dans EECON2 provoque lexcution dune
commande spcifique dans llectronique interne du PIC.

VII- Les interruptions


Une interruption provoque larrt du programme principal pour aller excuter une procdure
d'interruption. A la fin de cette procdure, le microcontrleur reprend le programme lendroit o il
stait arrt. Le PIC16F84 possde 4 sources d'interruption. A chaque interruption sont associs deux
bits: un bit de validation et un drapeau. Le premier permet d'autoriser ou non l'interruption, le second
permet au programmeur de savoir de quelle interruption il s'agit. Tous ces bits sont dans le registre
INTCON part le drapeau EEIF de l'interruption EEI qui se trouve dans le registre EECON1.

7.1 Le droulement dune interruption


Lorsque l'vnement dclencheur d'une interruption intervient, alors son drapeau est positionn
un (lev). Si l'interruption correspondante a t valide, elle est alors dclenche : le programme
arrte ce qu'il est en train de faire et va excuter la procdure d'interruption qui se trouve l'adresse 4
en excutant les tapes suivantes :
l'adresse contenue dans le PC (Program Counter) est sauvegarde dans la pile, puis remplace
par la valeur 0004 (adresse de la routine d'interruption).
Le bit GIE est mis "0" pour inhiber toutes les interruptions (afin qu'on ne soit pas drangs
pendant l'excution de la procdure d'interruption).
A la fin de la procdure d'interruption (instruction RETFIE) :
o le bit GIE est replac l'tat haut (autorisant ainsi un autre vnement)
o le contenu du PC est recharg partir de la pile, ce qui permet au programme de
reprendre l o il s'est arrt
Les microcontrleurs PIC de Microchip- Le 16F84- Notes de cours- Anne 2010- Dr. ALI Eugne

Page 19

Remarques :
- Le drapeau reste ltat haut mme aprs le traitement de linterruption. Par consquent, il
faut toujours le remettre "0" la fin de la routine d'interruption sinon l'interruption sera
dclenche de nouveau juste aprs l'instruction RETFIE.
-

Seul le PC est empil automatiquement. Si cela est ncessaire, les registres W et STATUS
doivent tre sauvegards en RAM puis restaurs la fin de la routine pour que le
microcontrleur puisse reprendre le programme dans les mmes conditions o il l'a
laiss.

7.2 Linterruption INT (entre RB0 du port B)


Cette interruption est provoque par un changement d'tat sur l'entre RB0 du
port B quand elle est programme en entre. Elle est gre par les bits :
- INTE : bit de validation (1=oui, 0=non) ;
- INTF : drapeau ;
- INTEDG : front de dclenchement, 1=montant, 0=descendant (registre

OPTION_REG).
7.3 L'interruption RBI (RB4 A RB7 du port B)
Cette interruption est provoque par un changement d'tat sur l'une des entres RB4 RB7 du
port B, Le front n'a pas d'importance. Les bits associs sont RBIE (validation) et RBIF (drapeau) du
registre INTCON.
7.4 L'interruption TOI : dbordement du timer TMRO
Cette interruption est provoque par le dbordement du timer TMR0. Les bits associs sont
T0IE (validation) et T0IF (drapeau) du registre INTCON.
7.5 L'interruption EEI : fin dcriture dans lEEPROM
Cette interruption est dclenche la fin d'une criture russie dans l'EEPROM. Les bits
associs sont EEIE (validation) et EEIF (drapeau) du registre INTCON.

INTCON
EECON1
OPTION_REG

GIE
-

EEIE
-

T0IE
-

INTE
EEIF

RBPU

INTED
G

TOCS

TOSE

RBIE
WRER
R
PSA

T0IF
WREN

INTF
WR

RBIF
RD

PS2

PS1

PS0

VIII- Linterface parallle du PIC 16F84


Les microcontrleurs PIC de Microchip- Le 16F84- Notes de cours- Anne 2010- Dr. ALI Eugne

Page 20

8.1 Le port A
Cest un port de 5 bits (RA0-RA4). Chaque entre/sortie est compatible TTL. La configuration
de direction pour chaque ligne dE/S est dtermine par le registre TRISA.

bit i de TRISA = 0 bit i du port A en sortie ;


bit i de TRISA = 1 bit i du port A en entre.

La broche RA4 est multiplexe avec lentre horloge du timer TMRO. Le choix se fait laide du
bit TOCS du registre OPTION_REG.

TOCS = 0 RA4 est une entre normale ;


TOCS = 1 RA4 = entre horloge externe pour le timer TMRO.
Registre
OPTION_REG
RBP
INTED

TOC
S

TOS
E

PSA

PS2

PS1

PS0

Le registre de sortie de ce port est PORTA dadresse 05 du bank 0.

8.2 Le port B
Cest un port bidirectionnel de 8 bits (RB0-RB7). Toutes les broches sont compatibles TTL. La
configuration de direction se fait grce au registre TRISB. En entre, la ligne RB0 appele aussi INT
peut dclencher une interruption externe INT. En entre, une quelconque des lignes RB4 RB7 peut
dclencher une interruption RBI. Le registre de sortie est PORTB dadresse 06 du bank 0.
IX- Le timer TMRO
Cest un compteur 8 bits ayant les caractristiques suivantes :
Il est incrment en permanence soit par lhorloge interne Fosc/4 (mode timer) soit par une
horloge externe applique la broche RA4 du port A (mode compteur). Le choix de l'horloge se
fait l'aide du bit T0CS du registre OPTION_REG
o TOCS = 0 horloge interne
o TOCS = 1 horloge externe applique RA4

Dans le cas de l'horloge externe, on peut choisir le front sur lequel le TIMER s'incrmente.
o TOSE = 0 incrmentation sur fronts montants
o TOSE = 1 incrmentation sur fronts descendants

Quelque soit l'horloge choisie, on peut la passer dans un diviseur de frquence programmable
(prescaler) dont le rapport est fix par les bits PS0, PS1 et PS2 du registre OPTION_REG
(tableau ci-contre). L'affectation ou non du prdiviseur se fait l'aide du bit PSA du registre
OPTION_REG
o PSA = 0 on utilise le prdiviseur
o PSA = 1 pas de prdiviseur (affect au chien de garde)

Les microcontrleurs PIC de Microchip- Le 16F84- Notes de cours- Anne 2010- Dr. ALI Eugne

Page 21

PS2
0
0
0
0
1
1
1
1

PS1
0
0
1
1
0
0
1
1

PS0
0
1
0
1
0
1
0
1

DIV
2
4
8
16
32
64
128
256

Le contenu du timer TMR0 est accessible par le registre qui porte le mme nom. Il peut tre lu
ou crit n'importe quel moment. Aprs une criture, l'incrmentation est inhibe pendant deux
cycles instruction.

Au dbordement de TMR0 (FF00), le drapeau T0IF est plac 1. Ceci peut


dclencher l'interruption T0I si celle-ci est valide.

Horloge

X- Le Watchdog timer WDT (chien de garde)


Cest un compteur 8 bits incrment en permanence (mme si le microcontrleur est en mode
sleep) par une horloge RC intgre indpendante de l'horloge systme. Lorsquil dborde, (WDT
TimeOut), deux situations sont possibles :

Si le C est en fonctionnement normal, le WDT time-out provoque un RESET. Ceci permet


dviter de rester planter en cas de blocage du microcontrleur par un processus indsirable non
contrl.

Si le C est en mode SLEEP, le WDT time-out provoque un WAKE-UP, l'excution du


programme continue normalement l o elle s'est arrte avant de rentrer en mode SLEEP. Cette
situation est souvent exploite pour raliser des temporisations

L'horloge du WDT est ajuste pour que Le Time-Out arrive toutes les 18 ms. Il est cependant
possible d'augmenter cette dure en faisant passer le signal Time-Out dans un prdiviseur
programmable (partag avec le timer TMR0). Laffectation se fait l'aide du bit PSA du registre
OPTION_REG.
PSA = 1 on utilise le prdiviseur
PSA = 0 pas de prdiviseur (affect TMR0)
Les microcontrleurs PIC de Microchip- Le 16F84- Notes de cours- Anne 2010- Dr. ALI Eugne

Page 22

Le rapport du prdiviseur est fix par les bits PS0, PS1 et PS2 du registre OPTION_REG.
L'utilisation du WDT doit se faire avec prcaution pour viter la rinitialisation (inattendue) rpte
du programme. Pour viter un WDT timeOut lors de l'excution d'un programme, on a deux possibilits
:

Inhiber le WDT d'une faon permanente en mettant 0 le bit WDTE dans l'EEPROM de
configuration.
Remettre le WDT 0 priodiquement dans le programme l'aide de l'instruction CLRWDT
pour viter qu'il ne dborde WDT.

XI- Le mode SLEEP


Le PIC peut tre plac en mode faible consommation l'aide de l'instruction SLEEP. Dans ce
mode, l'horloge systme est arrte ce qui arrte l'excution du programme. Pour sortir du mode
SLEEP, il faut provoquer un WAKE-UP, pour cela il y a 3 possibilits :
RESET externe d l'initialisation du PIC en mettant l'entre MCLR 0. Le PIC reprend
l'excution du programme partir du dbut.
Timeout du chien de garde WDT si celui-ci est valid. Le PIC reprend le programme partir de
l'instruction qui suit l'instruction SLEEP
Interruption INT (sur RB0) ou RBI (sur RB4-RB7) ou EEI (fin d'criture en EEPROM de
donnes). Le bit de validation de l'interruption en question doit tre valid, par contre, le
WAKE-UP a lieu quelque soit la position de bit de validation globale GIE. On a alors deux
situations :
o GIE = 0, Le PIC reprend l'excution du programme partir de l'instruction qui suit
l'instruction SLEEP, l'interruption n'est pas prise en compte.
o GIE = 1, Le PIC excute l'instruction qui se trouve juste aprs l'instruction SLEEP puis
se branche l'adresse 0004 pour excuter la procdure d'interruption. Dans le cas o
l'instruction suivant SLEEP n'est pas dsire, il faut utiliser l'instruction NOP.

XII- Exemples de programmes dapplication


Les microcontrleurs PIC de Microchip- Le 16F84- Notes de cours- Anne 2010- Dr. ALI Eugne

Page 23

;
***********************************************************************************
********************
; programme led_int.asm
; on connecte un interrupteur sur RB0 (entre) et une LED sur RB1 (sortie)
; Si on place l'interrupteur 1, la LED doit s'allumer, si on le met zro, elle doit s'teindre
;
***********************************************************************************
*********************
LIST p=16f84A, f=inhx8m, r = dec
#INCLUDE <p16f84A.inc>
__CONFIG _CP_OFF & _XT_OSC & _PWRTE_OFF & _WDT_OFF

tst

off

bsf
movlw
movwf
bcf
btfss
goto
bsf
goto
bcf
goto
end

STATUS,RP0 ; bank 1
B'00000001'
TRISB
; RB0 en entre , RB1 en sortie
STATUS,RP0 ; bank 0
PORTB,0
; tester le bit 0 du registre PORT B, saut dune ligne si gal 1
off
PORTB,1
; allumer la led
tst
PORTB,1
; teindre la led
tst

;
***********************************************************************************
**********************************************
; programme led-tmr0-1.asm
; faire clignoter une LED connecte sur une sortie du port B, la temporisation permettant d'ajuster la
frquence
; est obtenue par scrutation des dbordements du timer TMR0
;
***********************************************************************************
**********************************************
LIST p=16f84A, f = inhx8m, r = dec
__CONFIG _CP_OFF & _XT_OSC & _PWRTE_OFF & _WDT_OFF
#INCLUDE "p16f84A.inc"
CTR
equ
0x0C
bsf
STATUS,RP0 ; bank 1 (pour TRISB et OPTION_REG)
clrf
TRISB
; PORTB en sortie
movlw
B'00000111'
movwf
OPTION_REG
; PSA=0, prdiviseur affect TMR0, PS1 PS2 PS3 = 111,
; div = 256, T0CS=0, horloge TMR0 = fosc/4/div
bcf
STATUS,RP0 ; retour bank 0
encore
comf
PORTB,f
; complmenter PORTB
call
delay
; appel du sous-programme delay
goto
encore
; recommencer
delay
movlw
5
; pour attendre que TMR0 dborde 5 fois
movwf
CTR
; ce qui donne 5 x 256 x 256 s
tst:
btfss
INTCON,T0IF
; attendre que TMR0 dborde
goto
$-1
bcf
INTCON,T0IF
; baisser le drapeau
Les microcontrleurs PIC de Microchip- Le 16F84- Notes de cours- Anne 2010- Dr. ALI Eugne

Page 24

decfsz
goto
return
end

CTR,f
tst

; pour recommencer CTR fois

;
***********************************************************************************
************************************* ********************************************
; programme led-tmr0-2.asm
; faire clignoter une LED connecte sur une sortie du port B. La temporisation permettant d'ajuster la
; frquence est obtenue en comptant les dbordements du timer TMR0 l'intrieur de l'interruption T0I
; TMR0 est utilis en timer avec un prdiviseur de 256. En comptant 5 dbordements on obtient une
; temporisation de 5 x 256 x 256 s.
;
***********************************************************************************
*********************************** **********************************************
list p=16f84,f=inhx8m,r=dec
__config _PWRTE_OFF & _CP_OFF & _WDT_OFF & _XT_OSC
#include "p16f84.inc"
CTR
equ
0x0C
; variable de comptage
; ================= dmarrage sur RESET
org 0
goto
start
;================= procedure d'interruption
org 4
bcf
INTCON,T0IF
; baisser le drapeau lev par l'interruption
decfsz
CTR,f
retfie
comf
PORTB,f
; changer l'tat de la LED
movlw
5
; initialiser compteur
movwf
CTR
retfie
;================= Programme principal
start
bsf
STATUS,RP0 ; select bank1
clrf
TRISB
; programme tous les bits du bort B en sortie
movlw
B'00000111'
; mode timer, prdiviseur pour TMR0, div=256
movwf
OPTION_REG
bcf
STATUS,RP0
; select bank0
movlw
B'10100000'
; autorisation Interruption T0I
movwf
INTCON
movlw
5
; initialise CTR pour le premier passage
movwf
CTR
Loop
goto
Loop
; le PIC reste plant ici et n'en sort que pour aller
; excuter une interruption due au dbordement de TMR0

end

Les microcontrleurs PIC de Microchip- Le 16F84- Notes de cours- Anne 2010- Dr. ALI Eugne

Page 25

;**********************************************************************************
; Clignotement d'une LED relie la sortie 0 du port B. Les autres bits du port B ne sont pas affects
; La temporisation est ralise l'aide du Watchdog timer
;**********************************************************************************
list p=16f84, f=inhx8m, r = dec
__config _PWRTE_OFF & _CP_OFF & _WDT_ON & _XT_OSC
#include "p16f84A.inc"

Loop

bsf
bcf
movlw
movwf
bcf
movlw
sleep
xorwf
goto
end

STATUS,RP0 ; select bank1


TRISB,0
; RB0 en sortie
B'00001101'
; prescaler affect au WDT, prescaler = 101 = 32
OPTION_REG
; dbordement du WDT tous les 32 x 18ms = 0.576 s
STATUS,RP0 ; select bank0
1
; bit 0 de W 1, les autres 0,
; passe en mode sleep, rveil dans 0.576 s
PORTB,f
; complmente le bit 0 de PORTB
Loop
; recommence la loupe indfinitivement

;***************************************************************************
; Clignotement d'une LED relie n'importe quelle sortie du port B. La temporisation est ralise
l'aide d'une boucle de
; retard base de 3 boucles imbriques N1 (256), N2 (256), N3 ( prciser)
; T1 : (N1-1) x (1+2) + 2 => N1=0=256 => T1 = 767 s
; T2 : T1 + (N2-1) x (1+2+T1) + 2, N2=0 => T2 = 196352 s
; T3 : T2+(N3-1) x (1+2+T2) + 2 + 2 = N3 x 196355 + 1 s.
;***************************************************************************
list p=16f84, f=inhx8m, r=dec
#include "p16f84A.inc"
__config _CP_OFF & _WDT_OFF & _XT_OSC & _PWRTE_OFF
N1
equ
0x0D
; N1, N2, N3 = compteurs temporisateur
N2
equ
0x0E
N3
equ
0x0F
;=================================Programme principal
bsf
STATUS,RP0 ; select bank1
clrf
TRISB
; programme tous les bits du bort B en sortie
bcf
STATUS,RP0 ; select bank0
loop
comf
PORTB,f
; complmenter PORTB
movlw
3
; 3 donne une tempo voisine de 0.6 s
call
tempo
goto
loop
; recommence la loupe indfinitivement
;=================================Procdure de temporisation
tempo
movwf
N3
; copier W dans N3
tmp
decfsz
N1,f
; boucle intrieure
goto
tmp
decfsz
N2,f
; boucle mdiane
goto
tmp
Les microcontrleurs PIC de Microchip- Le 16F84- Notes de cours- Anne 2010- Dr. ALI Eugne

Page 26

decfsz
goto
return
end

N3,f
tmp

; boucle extrieure

Les microcontrleurs PIC de Microchip- Le 16F84- Notes de cours- Anne 2010- Dr. ALI Eugne

Page 27

XIII- Rfrences
[1]
[2]
[3]

PIC16F8X, document DS30430C, www.microchip.com


PIC16F84a, document DS35007A, www.microchip.com
Programmation des PIC, Premire partie-PIC16F84-Rvision 5, par BIGONOFF,
http://www.abcelectronique.com/bigonoff/organisation.php?2654c

You might also like