Académique Documents
Professionnel Documents
Culture Documents
Introduction
Depuis l 'arrivée du premier microprocesseur dans les années 70 ( déjà plus de 30 ans ), conçu
par INTEL tm les progrès en intégration 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 célèbre, en effet la sonde pionner 10 lancée
dans les années 70 a quitté le système solaire en emportant avec elle le fameux circuit.
Un microprocesseur peut être assimilé à un circuit logique complexe exécutant une à une des
ordres ( instructions ) enregistrés dans une mémoire de programme externe.
Un microprocesseur ne fonctionne jamais seul on lui associe toujours des périphériques d
'entrées- sorties afin de pouvoir exécuter une fonction particulière et dialoguer avec "l
'extérieur" ( prise en compte de l 'état d 'un capteur , commande d 'un relais , mémoire
programme de l 'application , etc.. .).
Le grand avantage de cette logique programmable est que la modification d 'une fonction ou
d'une tâche ne nécessite pas de câblage supplémentaire, mais uniquement un nouveau
programme à loger en mémoire.
L 'arrivée du micro contrôleur qui est un microprocesseur auquel on a intégré les
périphériques d 'entrées sorties, va faire que les montages et applications deviennent encore
plus simple à mettre en oeuvre, avec un gain de temps, de vitesse et un coût réduit ( le pic
16f84 est à environ 50 f ).
Le PIC 16 F84 de la société Microchip est un micro contrôleur faisant partie de la famille
RISC ( reduced instruction set computer ) dont les caractéristiques sont vitesse d 'exécution et
jeu d 'instruction réduit ( le pic 16f84 ne comporte que 35 instructions ).
La mémoire de programme
C ' est dans cette mémoire que vous allez "loger" votre programme une fois compilé, la
caractéristique essentielle de cette mémoire est qu 'elle conserve ses données même hors
tension ( heureusement sinon il faudrait recharger le programme assez souvent... )
Le pic 16f84 possède une mémoire de programme interne ( périphériques intégrés ... ) de
1024 emplacements mémoire comprenant chacun 14 bits ( taille d 'une instruction ). Cette
mémoire 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 intermédiaires par exemple un
décomptage pour une temporisation, pour stocker ces calculs temporaires les micro
contrôleurs possèdent de la mémoire RAM interne qui en cas de coupure secteur perdent bien
évidemment leur contenu ( à ne pas confondre avec la mémoire de programme de type flash ).
Le PIC 16F84 intègre 68 octets de RAM. On appel également ces emplacements mémoire des
registres à usage général.
L ' E²PROM
Il arrive parfois que l 'on souhaite mémoriser des événements survenants au cours d 'un
programme en exécution, par exemple une alarme. Certain micro contrôleur ont la possibilité
de sauvegarder cet événement dans une mémoire non volatile c'est à dire une mémoire qui
conserve les données même hors tension , un peu comme la mémoire de programme au détail
près que l 'on ne peut pas écrire dans la mémoire de programme lors de l ' exécution du
programme.
Le PIC 16F84 met à votre disposition 64 octets de mémoire E²PROM.
Le Watchdog
Sous ce nom étrange nous allons découvrir une fonction capable de surveiller le bon
fonctionnement du programme que le micro contrôleur exécute. Le rôle du Watchdog ( ou
chien de garde ) est de "réseter" le micro contrôleur si l 'on ne remet pas à zéro
périodiquement ( à intervalle définissable ) un registre interne grâce à 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 contrôleur se reset afin de
relancer le programme. Cette fonction est bien sûr désactivable au moment de la
programmation du micro contrôleur, c' est la directive d 'assemblage __config qui définie
cette fonction.
Le TIMER
Un timer est un registre interne au micro contrôleur , celui-ci s 'incrémente au grès d' un
horloge, ce registre peut servir par exemple pour réaliser des temporisations, ou bien encore
pour faire du comptage ( par l 'intermédiaire d 'une broche spécifique : RA4/TOKI ).
Le PIC 16F84 possède un timer sur 8 bits ( il compte jusqu ' à 256 ) configurable par logiciel.
Le brochage du PIC 16 F 84
Le timer du PIC 16 F84 est un registre 8 bits qui à la fonction d 'un compteur
programmable. Ce compteur s 'incrémente soit au rhytme de l 'horloge du quartz divisée par 4
ou bien sur un front montant ou descendant appliqué sur la broche d 'entrée ( RA4), tout ceci
est programmable à l 'aide de bits que l 'on écrira dans un registre nommé Registre OPTION.
Dès 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'arrête 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 possédant le coffret cliquer sur simulations internes puis sur timer.
Un exemple de programme téléchargeable réalise un clignotant à l 'aide du TIMER, on fait
changer l 'état d' une led ( clignoter) à chaque fois que le TIMER passe par 0.
Le bit RTS du registre OPTION permet soit de sélectionner l 'horloge interne ( issue du
quartz ) ou bien le signal appliqué sur la broche RA4.
Le bit RTE du registre OPTION permet de définir le choix du front montant ou descendant
du signal appliqué sur la broche RA4.
Indicateurs positionnés :
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 :
Indicateurs positionnés :
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 paramétrable
si d= 0 le résultat va dans le registre W
si d= 1 le résultat va dans le registre f
Exemple :
( W ) AND c -> ( W )
Exemple :
Port_A equ 05h on affecte 05 à la variable Port_A utilisée ci - après
#define W 0 on affecte 0 à la variable W utilisée ci - après
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 )
( W ) AND ( f ) -> ( d )
Exemple :
0 -> ( f{b} )
f est l'emplacement mémoire d 'un registre
Nombre de cycle d'horloge : 1
Exemple :
1 -> ( f{b} )
Nombre de cycle d'horloge : 1
Indicateurs positionnés : Aucun
Exemple :
Port_b equ 06h on affecte 06 à la variable Port_B utilisée ci - après
BSF Port_b, 3 on met à 1 le bit 3 du port B
Exemple :
Exemple :
Ex1 equ 0Ah on affecte le registre 0A à la variable ex1 utilisée ci - après
#define flag_Z 02h on affecte le flag Z à la variable flag_Z utilisée ci - après
R_etat equ 03h on affecte 03 à la variable R_etat utilisée ci - après
Indicateurs à positionnés :
PA0 à PA2 ( pour les PIC 16 C 5x )
Registre PCLATH pour les autres PIC
Exemple :
00 -> ( f )
Indicateurs positionnés :
Z=1
Syntaxe : CLRF registre
CLRW : Efface le contenu du registre W
00 -> W
Nombre de cycle d'horloge : 1
Indicateurs positionnés :
Z=1
Syntaxe : CLRW
Indicateurs positionnés :
TO = 1
PD = 1
Syntaxe : CLRWDT
COMF : Stocke en d le complément de f
f/ -> (d)
f est l'emplacement mémoire d 'un registre
d est paramétrable
si d= 0 le résultat va dans le registre W
si d= 1 le résultat va dans le registre f
Exemple :
Dans cet exemple on charge une valeur dans un registre ici 55h puis on complémente cette
valeur qui devient alors AAh.
Indicateurs positionnés :
d est paramétrable
si d= 0 le résultat va dans le registre W
si d= 1 le résultat va dans le registre f
Exemple :
Dans cet exemple on charge une valeur dans un registre ici 01h puis on décrémente cette
valeur qui devient alors 00h ( flag Z = 1 dans cet exemple ) .
d est paramétrable
si d= 0 le résultat va dans le registre W
si d= 1 le résultat va dans le registre f
G
a -> PC
Indicateurs à positionnés :
Exemple :
d est paramétrable
si d= 0 le résultat va dans le registre W
si d= 1 le résultat va dans le registre f
Exemple :
Dans cet exemple on charge une valeur dans un registre ici 55h puis on incrémente 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
d est paramétrable
si d= 0 le résultat va dans le registre W
si d= 1 le résultat va dans le registre f
( W ) OR c -> ( W )
Exemple :
Dans cet exemple on charge une valeur dans le registre W puis on éxécute un ou logique avec
ne valeur immédiate
( W ) OR ( f ) -> ( d )
d est paramétrable
si d= 0 le résultat va dans le registre W
si d= 1 le résultat va dans le registre f
Indicateurs positionnés :
Exemple :
Dans cet exemple on charge une valeur dans le registre W puis on éxécute un ou logique avec
le contenu d'un registre temporaire, le résultat est dirigé vers le registre temporaire..
d est paramétrable
si d= 0 le résultat va dans le registre W
si d= 1 le résultat va dans le registre f
Exemple :
Dans cet exemple on copie le contenu d'un registre temporaire dans le registre W
c -> ( W )
Exemple :
( W ) -> ( f )
Nombre de cycle d'horloge : 1
Indicateurs positionnés : Aucun
Exemple :
Dans cet exemple on charge une valeur dans le registre W puis on charge le contenu vers un
registre temporaire..
Syntaxe : NOP
( W ) -> ( OPTION )
Instruction utilisable sur les PIC de la famille 16 C 5x ( reconnue par les autres PIC )
Exemple :
Dans cet exemple on utilise la broche RTCC avec cadence horloge externe et prédivision de 8
le flanc actif sur la broche RTCC = front montant
( se reporter au tableau qui suit )
1 -> GIE
Haut de pile -> ( PC )
c -> ( W )
Haut de pile -> ( PC )
Carry -> ( d0 )
( f0 ) -> ( d1 )
( f1 ) -> ( d2 )
( f2 ) -> ( d3 )
( f3 ) -> ( d4 )
( f4 ) -> ( d5 )
( f5 ) -> ( d6 )
( f6 ) -> ( d7 )
( f7 ) -> ( Carry )
d est paramétrable
si d= 0 le résultat va dans le registre W
si d= 1 le résultat va dans le registre f
Nombre de cycle d'horloge : 1
Indicateurs positionnés :
Éventuellement le bit C
( f0 ) -> Carry
( f1 ) -> ( d0 )
( f2 ) -> ( d1 )
( f3 ) -> ( d2 )
( f4 ) -> ( d3 )
( f5 ) -> ( d4 )
( f6 ) -> ( d5 )
( f7 ) -> ( d6 )
Carry -> ( d7 )
Indicateurs positionnés : :
Éventuellement le bit C
0 -> PD
1 -> TO
00 -> WDT
00 -> Prédiviseur de WDT
Indicateurs positionnés :
PD=0 et TO=1
Syntaxe : SLEEP
La consommation de courant est minimale.
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 )
( f ) - ( W ) -> ( d )
Indicateurs positionnés :
Z si résultat stocké dans le registre W ou f est nul ( Z=1 )
C = 1 si f > W ou f = W
d est paramétrable
si d= 0 le résultat va dans le registre W
si d= 1 le résultat 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 résultat est dirigé vers le registre temporaire..
( méthode du complément à 2 )
d est paramétrable
si d= 0 le résultat va dans le registre W
si d= 1 le résultat va dans le registre f
Cette instruction concerne les PIC 16 C 5x ( compatible avec les autre PIC )
Exemple :
Dans cet exemple les broches A0 A1 et A7 du port A sont déclarées en sortie, les autres
broches en entrées
#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
( W ) XOR c -> ( W )
Indicateurs positionnés:
Z si résultat stocké dans le registre W est nul ( Z=1 )
Exemple :
Dans cet exemple on charge une valeur dans le registre W puis on éxécute un ou exclusif avec
une valeur immédiate , le résultat est dirigé vers le registre W
( W ) XOR ( f ) -> ( d )
Indicateurs positionnés :
d est paramétrable
si d= 0 le résultat va dans le registre W
si d= 1 le résultat va dans le registre f
Exemple :
Dans cet exemple on charge une valeur dans le registre W puis on éxécute un ou exclusif avec
le contenu d'un registre temporaire, le résultat est dirigé vers le registre temporaire..
L' E²PROM ( Electrically Erasable Programmable Read Only Memory ) du PIC 16F84 est
une mémoire pouvant stocker 64 octets. L ' atout majeure de ce type de mémoire est qu' elle
conserve les données une fois l 'alimentation disparue.
L 'inconvénient des E²PROM est leur temps d'accès assez long, cette mémoire ne convient
pas pour mémoriser des calculs intermédiaires demandant de la rapidité ( exemple :
asservissement ).
Le constructeur Microchip donne une durée 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 E²PROM, pour par
exemple entrer un paramètre, ou bien encore pour donner le numéro de la version
logiciel.
Pour ce faire une syntaxe précise indique au précompilateur de stocker les
informations mentionnées vers l ' E²PROM. La première adresse de la mémoire
E²PROM est 2100 en héxa.
La syntaxe org permet de définir 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
logée à l 'adresse 2100. La syntaxe 'de' indique au compilateur que la donnée qui suit
doit être écrite en E²PROM.
Syntaxe:
org h'2100'
de "Programme d' essai ver 1.0 01/08/01 "
1 - Écriture en E²PROM :
2 - Lecture en E²PROM :
Vous êtes tranquillement en pleine conversation téléphonique avec votre ami(e) préféré(e)
et soudain quelqu'un sonne à la porte, le premier réflexe est de faire patienter votre
interlocuteur au téléphone et d 'aller voir à votre porte qui se présente...
on vous à interrompu pendant votre conversation.
Finalement c 'était un représentant , vous lui signifiez que vous n ' êtes pas intéressé et vite
vous retournez à votre première tâche , c'est à dire à votre conversation téléphonique, vous
avez traité le plus urgent.
Sur le PIC 16F84 il y a quatre événements qui peuvent déclencher une interruption :
• Une modification de de l 'état d 'une des broches (configurées en entrées) RB4 à RB7
• Une modification de l 'état de la broche RB0/int
• De la fin de l 'écriture en E²PROM
• Du débordement du timer interne
Pour que le micro contrôleur accepte une ou plusieurs de ces sources d 'interruptions il va
falloir lui préciser par l 'intermédiaire de bits que l 'on déclarera dans un registre nommé
INTCON
ORG 4
;*********** Programme d 'interruption **********************
bsf PORTB,1 ; on allume la led connectée 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 accéder
; à la 2eme page mémoire ( pour configurer trisa et trisb
; -> broches en entrée ou en sortie )
MOVLW B'10011001' ; rb0,rb3,rb4 en entrée ( rb0 sera la broche utilisée
; pour l ' interruption )
MOVWF TRISB