You are on page 1of 27

Prsentation

Introduction

Depuis l 'arrive du premier microprocesseur dans les annes 70 ( dj plus de 30 ans ), conu
par INTEL tm les progrs en intgration de composants n 'ont cess d 'voluer, faisant de ce
fait augmenter la puissance de calcul et la rapidit des microprocesseurs. Ce premier
microprocesseur le "4004" deviendra peut tre clbre, en effet la sonde pionner 10 lance
dans les annes 70 a quitt le systme solaire en emportant avec elle le fameux circuit.
Un microprocesseur peut tre assimil un circuit logique complexe excutant une une des
ordres ( instructions ) enregistrs dans une mmoire de programme externe.
Un microprocesseur ne fonctionne jamais seul on lui associe toujours des priphriques d
'entres- sorties afin de pouvoir excuter une fonction particulire et dialoguer avec "l
'extrieur" ( prise en compte de l 'tat d 'un capteur , commande d 'un relais , mmoire
programme de l 'application , etc.. .).
Le grand avantage de cette logique programmable est que la modification d 'une fonction ou
d'une tche ne ncessite pas de cblage supplmentaire, mais uniquement un nouveau
programme loger en mmoire.
L 'arrive du micro contrleur qui est un microprocesseur auquel on a intgr les
priphriques d 'entres sorties, va faire que les montages et applications deviennent encore
plus simple mettre en oeuvre, avec un gain de temps, de vitesse et un cot rduit ( le pic
16f84 est environ 50 f ).

Le PIC 16 F84 de la socit Microchip est un micro contrleur faisant partie de la famille
RISC ( reduced instruction set computer ) dont les caractristiques sont vitesse d 'excution et
jeu d 'instruction rduit ( le pic 16f84 ne comporte que 35 instructions ).

La mmoire de programme
C ' est dans cette mmoire que vous allez "loger" votre programme une fois compil, la
caractristique essentielle de cette mmoire est qu 'elle conserve ses donnes mme hors
tension ( heureusement sinon il faudrait recharger le programme assez souvent... )
Le pic 16f84 possde une mmoire de programme interne ( priphriques intgrs ... ) de
1024 emplacements mmoire comprenant chacun 14 bits ( taille d 'une instruction ). Cette
mmoire est du type "flash" , c' est de l que vient le "f" de 16f84...
La RAM
Lorsque un programme "tourne" il fait souvent des calculs intermdiaires par exemple un
dcomptage pour une temporisation, pour stocker ces calculs temporaires les micro
contrleurs possdent de la mmoire RAM interne qui en cas de coupure secteur perdent bien
videmment leur contenu ( ne pas confondre avec la mmoire de programme de type flash ).
Le PIC 16F84 intgre 68 octets de RAM. On appel galement ces emplacements mmoire des
registres usage gnral.

L ' EPROM
Il arrive parfois que l 'on souhaite mmoriser des vnements survenants au cours d 'un
programme en excution, par exemple une alarme. Certain micro contrleur ont la possibilit
de sauvegarder cet vnement dans une mmoire non volatile c'est dire une mmoire qui
conserve les donnes mme hors tension , un peu comme la mmoire de programme au dtail
prs que l 'on ne peut pas crire dans la mmoire de programme lors de l ' excution du
programme.
Le PIC 16F84 met votre disposition 64 octets de mmoire EPROM.

Le Watchdog
Sous ce nom trange nous allons dcouvrir une fonction capable de surveiller le bon
fonctionnement du programme que le micro contrleur excute. Le rle du Watchdog ( ou
chien de garde ) est de "rseter" le micro contrleur si l 'on ne remet pas zro
priodiquement ( intervalle dfinissable ) un registre interne grce l 'instruction clrwdt (
clear watchdog ), si le programme tourne par exemple dans une boucle sans fin ( c'est un bug
! ) , il ne peut remettre 0 le chien de garde et ainsi le micro contrleur se reset afin de
relancer le programme. Cette fonction est bien sr dsactivable au moment de la
programmation du micro contrleur, c' est la directive d 'assemblage __config qui dfinie
cette fonction.

Le TIMER
Un timer est un registre interne au micro contrleur , celui-ci s 'incrmente au grs d' un
horloge, ce registre peut servir par exemple pour raliser des temporisations, ou bien encore
pour faire du comptage ( par l 'intermdiaire d 'une broche spcifique : RA4/TOKI ).
Le PIC 16F84 possde un timer sur 8 bits ( il compte jusqu ' 256 ) configurable par logiciel.

Les entres - sorties


Que serait un micron contrleur ne possdant pas de broche d 'entres- sorties ? ( difficile d 'y
rpondre ) .
Lorsque vous envisagez de crer une application, en gnrale celle-ci commande un relais,
une led ou bien tout autre actionneur, de mme votre programme qui tourne peut voluer
selon des informations extrieures , l 'tat d 'un contact par exemple ou bien d 'un interrupteur.
Pour vous aidez raliser votre application le PIC 16F84 possde 13 entres sorties
configurables individuellement broches RA0 RA4 et RB0 RB7

Le brochage du PIC 16 F 84

RA0 RA4 : broches d 'entre-sortie configurables


RB0 RB7 : broches d 'entre-sortie configurables
OSC1 - OSC2 : oscillateur ( quartz par exemple )
MCLR/VPP : broche de raz
VSS : 0V VDD : +5V

Pour rsumer ...


Le PIC 16F84 est un micro contrleur comportant un jeu d 'instructions rduit
La mmoire de programme est du type mmoire flash elle peut loger un programme de
1024*14 bits
La mmoire ram utilisateur est de 68 octets
La mmoire Eprom est de 64 octets
Le pic 16f84 possde un timer intgr
13 entres - sorties configurables individuellement
Un watchdog intgr
Prsentation

Le timer du PIC 16 F84 est un registre 8 bits qui la fonction d 'un compteur
programmable. Ce compteur s 'incrmente soit au rhytme de l 'horloge du quartz divise par 4
ou bien sur un front montant ou descendant appliqu sur la broche d 'entre ( RA4), tout ceci
est programmable l 'aide de bits que l 'on crira dans un registre nomm Registre OPTION.
Ds que le compteur atteint la valeur de 255 le bit TOIF du registre INT CON passe 1
pour provoquer ventuellement une interruption, le registre TIMER ne s'arrte pas il recompte
partir de 0.
Trois autres bits du registre OPTION vont nous permettent de diviser le signal issu du quartz
par une valeur comprise entre 2 et 256 par multiple de 2 ( 2,4,8,16,32,64,128,256).
Pour les lecteurs possdant le coffret cliquer sur simulations internes puis sur timer.
Un exemple de programme tlchargeable ralise un clignotant l 'aide du TIMER, on fait
changer l 'tat d' une led ( clignoter) chaque fois que le TIMER passe par 0.

Pour rsumer ...

Le bit RTS du registre OPTION permet soit de slectionner l 'horloge interne ( issue du
quartz ) ou bien le signal appliqu sur la broche RA4.

Le bit RTE du registre OPTION permet de dfinir le choix du front montant ou descendant
du signal appliqu sur la broche RA4.

Le bit PSA du registre OPTION permet de dfinir si on utilise le diviseur programmable

Les bits PS0,PS1,PS2 du registre OPTION dfinissent le diviseur appliquer (


2,4,8,16,32,64,128) selon le tableau 1
Vue des bits PS2 PS1 et PS0 du registre OPTION

Bit PS2 Bit PS1 Bit PS0 Valeur de la division interne


0 0 0 2
0 0 1 4
0 1 0 8
0 1 1 16
1 0 0 32
1 0 1 64
1 1 0 128
1 1 1 256
Tableau 1
Le jeu d 'instruction du PIC 16F84

ADDLW : Additionner le registre W et une valeur immdiate , la somme est stocke en


W
( la srie PIC 16C5x ne comprend pas cette instruction)
( W ) + v -> ( W )
Nombre de cycle d'horloge : 1

Indicateurs positionns :

C si retenue ( C=1 )
DC si la somme des quatre bits de poids faible est > 15 ( DC=1 )
Z si la somme est nulle ( Z=1 )

Syntaxe :

Addlw 0x0F W + Ox0F le rsultat est stock dans W

ADDWF : Additionner le registre W et ( f ) , la somme est stocke en ( d )


( W ) + ( f ) -> ( d )

f est l'emplacement mmoire d 'un registre


Nombre de cycle d'horloge : 1

Indicateurs positionns :

C si retenue ( C=1 )
DC si la somme des quatre bits de poids faible est > 15 ( DC=1 )
Z si la somme est nulle ( Z=1 )

d est paramtrable
si d= 0 le rsultat va dans le registre W
si d= 1 le rsultat va dans le registre f

Exemple :

#define W 0 on affecte 0 la variable W utilise ci - aprs


Movf valeur1, W on met la valeur 1 dans le registre W
Addwf valeur2, W valeur 1 + valeur 2 stock dans W

ANDLW : Opration " ET " entre le contenu du registre W et une constante c

( W ) AND c -> ( W )

Nombre de cycle d'horloge : 1


Indicateurs positionns :

Z si le rsultat stock dans W est nul ( Z=1 )

Exemple :
Port_A equ 05h on affecte 05 la variable Port_A utilise ci - aprs
#define W 0 on affecte 0 la variable W utilise ci - aprs
Movf Port_A, W on met le contenu du port A dans le registre W
Andlw 55h on masque un bit sur 2 ( 55 h = 0101 0101 )

ANDWF : Opration " ET " entre le contenu du registre W et f le rsultat est en d

( W ) AND ( f ) -> ( d )

Nombre de cycle d'horloge : 1


Indicateurs positionns :

Z si le rsultat stock dans W ou f est nul ( Z=1 )


d est paramtrable
si d= 0 le rsultat va dans le registre W
si d= 1 le rsultat va dans le registre f

Exemple :

R_etat equ 03h on affecte 03 la variable R_etat utilise ci - aprs


Movlw 00000111b on met le contenu 00000111 dans le registre W
Andwf R_etat, F on masque et on configure le registre d' tat

BCF : Efface le bit spcifi de f

0 -> ( f{b} )
f est l'emplacement mmoire d 'un registre
Nombre de cycle d'horloge : 1

Indicateurs positionns : Aucun

Exemple :

Port_b equ 06h on affecte 06 la variable Port_B utilise ci - aprs


BCF Port_b, 2 on met 0 le bit 2 du port B

BSF : Positionne le bit "b" de f 1

1 -> ( f{b} )
Nombre de cycle d'horloge : 1
Indicateurs positionns : Aucun
Exemple :
Port_b equ 06h on affecte 06 la variable Port_B utilise ci - aprs
BSF Port_b, 3 on met 1 le bit 3 du port B

BTFSC : Vrifier l'tat du bit b de f et sauter l'instruction suivante si b = 0

"Saute l' instruction si" ( f{b} ) = 0

Nombre de cycle d'horloge : 1 ou 2

Indicateurs positionns : Aucun

Exemple :

Ex1 equ 0Ah on affecte le registre 0A la variable ex1 utilise ci - aprs


#define flag_Z 02h on affecte le flag Z la variable flag_Z utilise ci - aprs
R_etat equ 03h on affecte 03 la variable R_etat utilise ci - aprs

Incf Ex1 on incrmente la variable Ex1 ( registre 0A )


Btfsc R_etat,flag_Z on vrifie si il y a un dbordement ( Z=1 )
Movlw 54h si dbordement ( Z=1 ) alors on met la valeur 54 dans le registre W

BTFSS : Vrifier l'tat du bit b de f et sauter l'instruction suivante si b = 1

"Saute l' instruction si" ( f{b} ) = 1

Nombre de cycle d'horloge : 1 ou 2

Indicateurs positionns : Aucun

Exemple :
Ex1 equ 0Ah on affecte le registre 0A la variable ex1 utilise ci - aprs
#define flag_Z 02h on affecte le flag Z la variable flag_Z utilise ci - aprs
R_etat equ 03h on affecte 03 la variable R_etat utilise ci - aprs

Incf Ex1 on incrmente la variable Ex1 ( registre 0A )


Btfss R_etat,flag_Z on vrifie qu ' il n' y a pas de dbordement ( Z=0 )
Movlw 54h si aucun dbordement ( Z=0 ) alors on met la valeur 54 dans W

CALL : Appel du sous programme s


( PC ) + 1 -> Haut de la pile
s -> ( PC )

Nombre de cycle d'horloge : 2

Indicateurs positionns :
PA0 PA2 ( pour les PIC 16 C 5x )
Registre PCLATH pour les autres PIC

Exemple :

R_etat equ 03h on affecte 03 la variable R_etat utilise ci - aprs


#define f 1 on affecte la valeur 1 la variable f
#define Pa0 05h on affecte la valeur 05 la variable Pa0

Movlw 00111111b on charge un masque pour modifier le registre d' etat


bsf R_etat, Pa0 on met le bit 5 du registre d tat ( PA0 ) 1
Andwf R_etat, f on slectionne la page 1 pour un PIC 16 C 56 ( 0200 - 03FF )
Call sous_P Appel du sous programme sous_P la 2 eme page de programme

CLRF : Efface le contenu de ( f )

00 -> ( f )

Nombre de cycle d'horloge : 1

Indicateurs positionns :
Z=1
Syntaxe : CLRF registre
CLRW : Efface le contenu du registre W

00 -> W
Nombre de cycle d'horloge : 1

Indicateurs positionns :
Z=1
Syntaxe : CLRW

CLRWDT : Rinitialise le temporisateur du chien de garde


00 -> WDT
00 -> prdiviseur de WDT
Nombre de cycle d'horloge : 1

Indicateurs positionns :
TO = 1
PD = 1
Syntaxe : CLRWDT
COMF : Stocke en d le complment de f

f/ -> (d)
f est l'emplacement mmoire d 'un registre

Nombre de cycle d'horloge : 1


Indicateurs positionns :
Z si rsultat stock dans W ou f est nul ( Z=1 )

d est paramtrable
si d= 0 le rsultat va dans le registre W
si d= 1 le rsultat va dans le registre f

Exemple :

Dans cet exemple on charge une valeur dans un registre ici 55h puis on complmente cette
valeur qui devient alors AAh.

Reg_temp equ 0Ah OA correspond l'adresse d' un registre temporaire


#define f 1 on affecte la valeur 1 la variable f

Movlw 01010101b on charge 55h dans le registre W


Movwf Reg_temp on met W dans le registre temporaire
Comf Reg_temp, f on complmente le contenu du registre temporaire
D

DECF : Dcrmente f et range le rsultat dans d

(f) - 1 -> (d)


f est l'emplacement mmoire d 'un registre

Nombre de cycle d'horloge : 1

Indicateurs positionns :

Z si rsultat stock dans le registre W ou f est nul ( Z=1 )

d est paramtrable
si d= 0 le rsultat va dans le registre W
si d= 1 le rsultat va dans le registre f

Exemple :

Dans cet exemple on charge une valeur dans un registre ici 01h puis on dcrmente cette
valeur qui devient alors 00h ( flag Z = 1 dans cet exemple ) .

Reg_temp equ 0Ah OA correspond l'adresse d' un registre temporaire


#define f 1 on affecte la valeur 1 la variable f
Movlw 01h on charge 01h dans le registre W
Movwf Reg_temp on met W dans le registre temporaire
Decf Reg_temp, f on dcrmente le contenu du registre temporaire
DECFSZ : Dcrmente f et sauter l 'instruction suivante si f = 0

(f) - 1 -> ( d ) et sauter l' instruction suivante si f=0

f est l'emplacement mmoire d 'un registre


Nombre de cycle d'horloge : 1 ou 2
Indicateurs positionns : Aucun

d est paramtrable
si d= 0 le rsultat va dans le registre W
si d= 1 le rsultat va dans le registre f
G

GOTO : Branchement inconditionnel l' adresse a

a -> PC

Nombre de cycle d'horloge : 2

Indicateurs positionns :

PA0 : extension 9 bits pour les PIC ( PIC 16c56 et 16c57 )


PA1 : extension 10 bits pour le PIC ( PIC 16c57 )
PA2 : extension future
Registre PCLATH pour les autres PIC

Exemple :

Goto fin Va l'tiquette nomme "fin"


-
-
-
fin : Etiquette fin
I

INCF : Incrmente f et range le rsultat dans d

(f) + 1 -> (d)


f est l'emplacement mmoire d 'un registre

Nombre de cycle d'horloge : 1


Indicateurs positionns :

Z si rsultat stock dans le registre W ou f est nul ( Z=1 )

d est paramtrable
si d= 0 le rsultat va dans le registre W
si d= 1 le rsultat va dans le registre f

Exemple :

Dans cet exemple on charge une valeur dans un registre ici 55h puis on incrmente cette
valeur qui devient alors 56h.
Reg_temp equ 0Ah OA correspond l'adresse d' un registre temporaire
#define f 1 on affecte la valeur 1 la variable f

Movlw 01010101b on charge 55h dans le registre W


Movwf Reg_temp on met W dans le registre temporaire
Incf Reg_temp, f on complmente le contenu du registre temporaire

INCFSZ : Incrmente f et sauter l'instruction suivante si (f) = 0

(f) + 1 -> (d) et saute si le rsultat = 0

f est l'emplacement mmoire d 'un registre


Nombre de cycle d'horloge : 1 ou 2
Indicateurs positionns : Aucun

d est paramtrable
si d= 0 le rsultat va dans le registre W
si d= 1 le rsultat va dans le registre f

IORLW : Opration logique "OU" entre le registre W et une constante c

( W ) OR c -> ( W )

Nombre de cycle d'horloge : 1


Indicateurs positionns :
Z si rsultat stock dans le registre W est nul ( Z=1 )

Exemple :

Dans cet exemple on charge une valeur dans le registre W puis on xcute un ou logique avec
ne valeur immdiate

Movlw 01010101b on charge 01010101b dans le registre W


Iorlw 11110000b aprs le ou logique W = 11110101b

IORWF : Opration logique "OU" entre le registre W et f rsultat dans d

( W ) OR ( f ) -> ( d )

Nombre de cycle d'horloge : 1

d est paramtrable
si d= 0 le rsultat va dans le registre W
si d= 1 le rsultat va dans le registre f

Indicateurs positionns :

Z si rsultat stock dans le registre W ou f est nul ( Z=1 )

Exemple :

Dans cet exemple on charge une valeur dans le registre W puis on xcute un ou logique avec
le contenu d'un registre temporaire, le rsultat est dirig vers le registre temporaire..

Reg_temp equ 0Ah OA correspond l'adresse d' un registre temporaire


#define f 1 on affecte la valeur 1 la variable f

Movlw 01010101b on charge 55h dans le registre W


Movwf Reg_temp on met W dans le registre temporaire
Movlw 00001111b on charge 0Fh dans le registre W
Iorwf Reg_temp, f ou logique avec W le contenu du registre temporaire= 01011111b

MOVF : Copier le registre ( f ) dans ( d )

(f) + 1 -> (d)


f est l'emplacement mmoire d 'un registre
Nombre de cycle d'horloge : 1
Indicateurs positionns :

Z si rsultat stock dans le registre W ou f est nul ( Z=1 )

d est paramtrable
si d= 0 le rsultat va dans le registre W
si d= 1 le rsultat va dans le registre f

Exemple :

Dans cet exemple on copie le contenu d'un registre temporaire dans le registre W

Reg_temp equ 0Ah OA correspond l'adresse d' un registre temporaire


#define W 0 on affecte la valeur 0 la variable W

Movf Reg_temp, W on copie Reg_temp dans W

MOVLW : Charge une constante c dans le registre W

c -> ( W )

Nombre de cycle d'horloge : 1

Indicateurs positionns : Aucun

Exemple :

Dans cet exemple on charge une valeur dans le registre W


Movlw 01010101b on charge 55h dans le registre W

MOVWF : Charge le registre W dans le registre f

( W ) -> ( f )
Nombre de cycle d'horloge : 1
Indicateurs positionns : Aucun

Exemple :

Dans cet exemple on charge une valeur dans le registre W puis on charge le contenu vers un
registre temporaire..

Reg_temp equ 0Ah OA correspond l'adresse d' un registre temporaire


#define f 1 on affecte la valeur 1 la variable f
Movlw 01010101b on charge 55h dans le registre W
Movwf Reg_temp on met W dans le registre temporaire
N

NOP : Aucune opration

(PC) + 1 -> (PC)

Nombre de cycle d'horloge : 1

Indicateurs positionns : Aucun

Syntaxe : NOP

OPTION : Charger le registre OPTION

( W ) -> ( OPTION )

Nombre de cycle d'horloge : 1

Instruction utilisable sur les PIC de la famille 16 C 5x ( reconnue par les autres PIC )

Indicateurs positionns : Aucun

Exemple :

Dans cet exemple on utilise la broche RTCC avec cadence horloge externe et prdivision de 8
le flanc actif sur la broche RTCC = front montant
( se reporter au tableau qui suit )

#define Def_option 22h on affecte 22 la variable Def_option (22 correspond


l'nonc )

Movlw Def_option on met la variable Def_option dans le registre W


Option transfert du contenu de W dans le registre OPTION
R

RETFIE : Retour d' interruption

1 -> GIE
Haut de pile -> ( PC )

( la srie PIC 16C5x ne comprend pas cette instruction)

Nombre de cycle d'horloge : 2

Indicateurs positionns : aucun

Syntaxe : RETFIE retour d' interruption

RETLW c : Retour de routine , chargement d ' une valeur c dans le registre W

c -> ( W )
Haut de pile -> ( PC )

Nombre de cycle d'horloge : 2

Indicateurs positionns : PA0 PA2 pour PIC 16C56 et 16C57

Syntaxe : RETLW 0afh retour de sous programme et on charge 0afh dans W

RETURN : Retour de sous programme

Haut de pile -> ( PC )


( la srie PIC 16C5x ne comprend pas cette instruction)
Nombre de cycle d'horloge : 2

Indicateurs positionns : aucun


Syntaxe : RETURN retour d'un sous programme

RLF : Rotation gauche de ( f ) au travers du bit carry le rsultat va dans d

Carry -> ( d0 )
( f0 ) -> ( d1 )
( f1 ) -> ( d2 )
( f2 ) -> ( d3 )
( f3 ) -> ( d4 )
( f4 ) -> ( d5 )
( f5 ) -> ( d6 )
( f6 ) -> ( d7 )
( f7 ) -> ( Carry )
d est paramtrable
si d= 0 le rsultat va dans le registre W
si d= 1 le rsultat va dans le registre f
Nombre de cycle d'horloge : 1

Indicateurs positionns :
ventuellement le bit C

RRF : Rotation droite de ( f ) au travers du bit carry le rsultat va dans d

( f0 ) -> Carry
( f1 ) -> ( d0 )
( f2 ) -> ( d1 )
( f3 ) -> ( d2 )
( f4 ) -> ( d3 )
( f5 ) -> ( d4 )
( f6 ) -> ( d5 )
( f7 ) -> ( d6 )
Carry -> ( d7 )

Nombre de cycle d'horloge : 1

Indicateurs positionns : :
ventuellement le bit C

SLEEP : Mise en veille du microcontrleur ( Power Down mode )

0 -> PD
1 -> TO
00 -> WDT
00 -> Prdiviseur de WDT

Nombre de cycle d'horloge : 1

Indicateurs positionns :

PD=0 et TO=1

Syntaxe : SLEEP
La consommation de courant est minimale.

SUBLW : Soustraction entre une valeur et le registre W


v - ( W ) -> ( W )
( la srie PIC 16C5x ne comprend pas cette instruction)

Nombre de cycle d'horloge : 1


Indicateurs positionns :

C si retenue ( C=1 )
DC si la somme des quatre bits de poids faible est > 15 ( DC=1 )
Z si la somme est nulle ( Z=1 )

Syntaxe : SUBLW 0x01 xcute la soustraction 01 - contenu de W rsultat dans W


( mthode du complment 2 )

SUBWF : Soustraire le contenu du registre W du contenu du registre f rsultat dans d

( f ) - ( W ) -> ( d )

Nombre de cycle d'horloge : 1

Indicateurs positionns :
Z si rsultat stock dans le registre W ou f est nul ( Z=1 )
C = 1 si f > W ou f = W

d est paramtrable
si d= 0 le rsultat va dans le registre W
si d= 1 le rsultat va dans le registre f

Exemple :

Dans cet exemple on charge une valeur dans le registre W puis on la soustraie avec le contenu
d'un registre temporaire, le rsultat est dirig vers le registre temporaire..
( mthode du complment 2 )

Reg_temp equ 0Ah OA correspond l'adresse d' un registre temporaire


#define f 1 on affecte la valeur 1 la variable f

Movlw 00001010b on charge 0Ah dans le registre W


Movwf Reg_temp on met W dans le registre temporaire
Movlw 00000001b on charge 01h dans le registre W
Subwf Reg_temp, f on soustraie avec W le registre temporaire= 00001001b

SWAPF : change de quartets entre le registre ( f ) et ( d )

( f bit 0 bit 3) -> ( d bit 4 bit 7 )


( f bit 4 bit 7) -> ( d bit 0 bit 3 )

Nombre de cycle d'horloge : 1


Indicateurs positionns : Aucun

d est paramtrable
si d= 0 le rsultat va dans le registre W
si d= 1 le rsultat va dans le registre f

TRIS : Charge le registre TRIS f

Cette instruction concerne les PIC 16 C 5x ( compatible avec les autre PIC )

(W) -> ( TRIS f )

Nombre de cycle d'horloge : 1

Indicateurs positionns : Aucun

TRIS 5 configure le port A


TRIS 6 configure le port B
TRIS 7 configure le port C

si bit = 0 alors la broche est en sortie

Exemple :
Dans cet exemple les broches A0 A1 et A7 du port A sont dclares en sortie, les autres
broches en entres
#define Sens_port_A 01111100b on affecte 7C ( en hexa ) la variable Sens_port_A
Port_A equ 05h on affecte 05 la variable Port_A ( adresse du port A )
Movlw Sens_port_A on met la variable Sens_port_A dans le registre W
Tris Port_A transfert du contenu de W dans le registre de direction du Port A

XORLW : Opration logique XOR ( ou exclusif ) entre le contenu de W et une


constante c

( W ) XOR c -> ( W )

Nombre de cycle d'horloge : 1

Indicateurs positionns:
Z si rsultat stock dans le registre W est nul ( Z=1 )

Exemple :

Dans cet exemple on charge une valeur dans le registre W puis on xcute un ou exclusif avec
une valeur immdiate , le rsultat est dirig vers le registre W

Movlw 01010101b on charge 55h dans le registre W


Xorlw 00111100b ou exclusif avec W le contenu du registreW = 01101001b

XORWF : Opration logique XOR ( ou exclusif ) entre le contenu de W et f le rsultat


en d

( W ) XOR ( f ) -> ( d )

Nombre de cycle d'horloge : 1

Indicateurs positionns :

Z si rsultat stock dans le registre W est nul ( Z=1 )

d est paramtrable
si d= 0 le rsultat va dans le registre W
si d= 1 le rsultat va dans le registre f

Exemple :

Dans cet exemple on charge une valeur dans le registre W puis on xcute un ou exclusif avec
le contenu d'un registre temporaire, le rsultat est dirig vers le registre temporaire..

Reg_temp equ 0Ah OA correspond l'adresse d' un registre temporaire


#define f 1 on affecte la valeur 1 la variable f

Movlw 01010101b on charge 55h dans le registre W


Movwf Reg_temp on met W dans le registre temporaire
Movlw 00001111b on charge 0Fh dans le registre W
Xorwf Reg_temp, f ou exclusif avec W le contenu du registre temporaire= 01011010b
Prsentation

L' EPROM ( Electrically Erasable Programmable Read Only Memory ) du PIC 16F84 est
une mmoire pouvant stocker 64 octets. L ' atout majeure de ce type de mmoire est qu' elle
conserve les donnes une fois l 'alimentation disparue.
L 'inconvnient des EPROM est leur temps d'accs assez long, cette mmoire ne convient
pas pour mmoriser des calculs intermdiaires demandant de la rapidit ( exemple :
asservissement ).
Le constructeur Microchip donne une dure de vie d 'environ un million de cycles en lecture-
criture.

Lors de l 'criture d 'un programme il est possible d' aller crire en EPROM, pour par
exemple entrer un paramtre, ou bien encore pour donner le numro de la version
logiciel.
Pour ce faire une syntaxe prcise indique au prcompilateur de stocker les
informations mentionnes vers l ' EPROM. La premire adresse de la mmoire
EPROM est 2100 en hxa.
La syntaxe org permet de dfinir l 'endroit ou l 'on code l 'instruction qui suit. Dans la
syntaxe suivante 'org 2100' le compilateur "sait" que l 'instruction qui suit doit tre
loge l 'adresse 2100. La syntaxe 'de' indique au compilateur que la donne qui suit
doit tre crite en EPROM.

Syntaxe:

org h'2100'
de "Programme d' essai ver 1.0 01/08/01 "

Au cours de l 'excution d 'un programme il est possible de lire ou d 'crire en


EPROM pour ce faire il faut respecter le cheminement donn dans l 'exemple suivant
:

1 - criture en EPROM :

bsf STATUS,5 ; on met 1 le 5eme bit du registre status pour


accder la 2eme page mmoire MOVLW 0x04 ; on met 04
dans le registre W
MOVWF EECON1 ; on met 04 dans le registre EECON1
bcf STATUS,5 ; on remet 0 le 5eme bit du registre status

movf adresse,W ; on met le registre adresse ( dclar auparavant )


dans W
MOVWF EEADR ; on met W sur EEADR ( adresse EPROM )

movf donne,W ; on met le contenu du registre donne dans W


MOVWF EEDATA ; on met W sur EEDATA ( donne EPROM )
bsf STATUS,5 ; on met 1 le 5eme bit du registre status pour accder la 2eme page
mmoire ( EECON 1 et 2 )
movlw 0x55 ; passage obligatoire pour crire en EPROM
movwf EECON2 ;...
movlw 0xAA ;...
movwf EECON2 ;...
bsf EECON1,1 ;...
bcf STATUS,5 ; on remet 0 le 5eme bit du registre status

2 - Lecture en EPROM :

MOVF adresse, W ; on met le registre adresse ( dclar auparavant )


dans W
MOVWF EEADR ; on met W sur EEADR ( adresse EPROM )
bsf STATUS,5 ; on met 1 le 5eme bit du registre status pour
accder la 2eme page mmoire MOVLW 0x01 ; on met 01 dans
le registre W
MOVWF EECON1 ; on met 01 dans le registre EECON1
bcf STATUS,5 ; on remet 0 le 5eme bit du registre status
MOVF EEDATA, W ; on met la donne EPROM dans W

Pour rsumer ...


La mmoire Eprom du PIC 16F84 comporte 64 octets disponibles pour l 'utilisateur
Cette mmoire sauvegarde les donnes mme hors tension
Pour crire dans cette mmoire il faut respecter une syntaxe rigoureuse dcrite
prcdemment
Prsentation

Vous tes tranquillement en pleine conversation tlphonique avec votre ami(e) prfr(e)
et soudain quelqu'un sonne la porte, le premier rflexe est de faire patienter votre
interlocuteur au tlphone et d 'aller voir votre porte qui se prsente...
on vous interrompu pendant votre conversation.

Finalement c 'tait un reprsentant , vous lui signifiez que vous n ' tes pas intress et vite
vous retournez votre premire tche , c'est dire votre conversation tlphonique, vous
avez trait le plus urgent.

Pour un programme qui se droule "tranquillement" le principe est le mme.


Une tche de fond s ' excute, c'est votre programme principal, par exemple vous faites
clignoter une lampe ( led ).
Soudain l ' utilisateur "appui" sur le bouton "plus rapide" , que fait votre programme ?
en fait il fait comme vous avez fait prcdemment, c 'est dire que quelque soit l 'endroit ou l
'on se situe dans le programme
( c'est votre conversation tlphonique ) , il excute le plus urgent, dans notre exemple il
dtecte l 'appui sur le bouton et enregistre cette information .
Ensuite l 'appui tant mmoris le programme "revient" l 'endroit ou il s 'tait arrt
auparavant et la lampe clignote plus vite.
Pour rsumer ...
Le programme principal s excute normalement ( clignotement de la led )
Un vnement extrieur survient ( un appui sur le bouton )
Le micro contrleur termine l 'instruction qu 'il excutait et mmorise l 'adresse en
cours ( cette adresse lui servira revenir l 'endroit ou il s 'est "drout" ds la fin de l
'interruption )
Le micro contrleur saute l 'adresse du sous-programme d 'interruption ( comme on le
verra sur le pic 16f84 l 'adresse de sous-programme d 'interruption est 04 )
Le micro contrleur excute le programme d 'interruption
Le micro contrleur revient l 'adresse suivante par rapport la dernire instruction excut
dans le programme principal.

Sur le PIC 16F84 il y a quatre vnements qui peuvent dclencher une interruption :

Une modification de de l 'tat d 'une des broches (configures en entres) RB4 RB7
Une modification de l 'tat de la broche RB0/int
De la fin de l 'criture en EPROM
Du dbordement du timer interne

Pour que le micro contrleur accepte une ou plusieurs de ces sources d 'interruptions il va
falloir lui prciser par l 'intermdiaire de bits que l 'on dclarera dans un registre nomm
INTCON

Vue des bits du registre INTCON


bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0
GIE EEIE TOIE INTE RBIE TOIF INTF RBIF
Ce bit
Ce bit signale que
Ce bit Ce bit
Ce bit signale que l
Ce bit valide l valide l Ce bit
permet de Ce bit valide l 'interruption
permet de 'interruption 'interruption signale que l
valider l l 'interruption en cours
valider les du du 'interruption
'interruption 'interruption en cours provient d
interruptions. programme programme en cours
issue de la issue du provient d 'un
C'est une suite un suite un provient du
fin d dbordement 'un changement
validation changement changement dbordement
'criture en du TIMER changement d 'tat sur l
gnrale d 'tat sur d 'tat sur du TIMER
EPROM d 'tat sur la 'une des
RB0 RB4-RB7
broche RB0 broches
RB4-RB7
Tableau 1

Synoptique des modes d' interruptions


Maintenant un exemple de programme avec une interruption.
Dans cet exemple on configure le pic pour que ds l'apparition d 'une impulsion sur la broche
RB0 ( sur un front montant, c'est le bit INTEDG du registre OPTION ( bit 6 ) qui prcise front
montant ou front descendant sur RB0 ),
on droute le programme principal qui tait en mode sleep pour allumer une led connecte sur
RB1.
Le passage 1 ( front montant ) sur la broche RB0 va provoquer une interruption du
programme principal le compteur de programme va charger l 'adresse 04 ( sur le pic 16f84 ce
sera toujours cette unique adresse ) correspondant l 'adresse du sous-programme
d'interruption.
A la fin d 'un programme d 'interruption il ne faut pas oublier :
- de remettre le flag ( un bit qui se positionne 1 ds qu 'une interruption est active ) de l
'interruption dclenche :
( soit TOIF soit INTF soit RBIF , dans notre exemple se sera INTF )
- de mettre l 'instruction de retour d 'interruption RETFIE afin que le programme
revienne l' endroit ou il a t drout

;************** Dbut du programme *********************

;------------ Directive d' assemblage pour PLAB --- -


list p=16f84A
#include p16f84A.inc
__config H'3FF9'
ORG 0
goto init
;****** Le programme d' interruption se dclenche ***
;****** lorsque l' entre RB0 passe de 0 1 ***

ORG 4
;*********** Programme d 'interruption **********************
bsf PORTB,1 ; on allume la led connecte sur rb1
bcf INTCON,INTF ; on remet 0 le bit du registre d' IT qui est pass 1
RETFIE ; retour d 'interruption
;************* Programme d' INIT **************************
init
bsf STATUS,5 ; on met 1 le 5eme bit du registre status pour accder
; la 2eme page mmoire ( pour configurer trisa et trisb
; -> broches en entre ou en sortie )
MOVLW B'10011001' ; rb0,rb3,rb4 en entre ( rb0 sera la broche utilise
; pour l ' interruption )
MOVWF TRISB

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


; la 1ere page mmoire

bsf OPTION_REG,INTEDG ; Le passage de 0 1 sur RB0 provoque une IT


; sur un front montant

bsf INTCON,INTE ; autorise l ' IT sur RB0

bsf INTCON,GIE ; autorise les Interruptions


clrf PORTB
;************ Programme principal en rebouclage *********************
debut
sleep ; mise en sommeil du PIC conso : 3.2 mA, attente impulsion sur RB0
GOTO debut
;*********** Fin du programme ***********

You might also like