0% ont trouvé ce document utile (0 vote)
38 vues25 pages

Iii. Microcontrôleur PIC16F84: I. Présentation

Le document présente le microcontrôleur PIC16F84, détaillant ses caractéristiques, son architecture interne et ses fonctionnalités, y compris la mémoire, les ports d'entrée/sortie, et les timers. Il décrit également les mécanismes d'interruption et de gestion de la mémoire EEPROM, ainsi que les modes de fonctionnement comme le mode SLEEP. Le PIC16F84 est un composant stable et polyvalent, utilisé dans divers systèmes embarqués.

Transféré par

Issam Chtaitif
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
38 vues25 pages

Iii. Microcontrôleur PIC16F84: I. Présentation

Le document présente le microcontrôleur PIC16F84, détaillant ses caractéristiques, son architecture interne et ses fonctionnalités, y compris la mémoire, les ports d'entrée/sortie, et les timers. Il décrit également les mécanismes d'interruption et de gestion de la mémoire EEPROM, ainsi que les modes de fonctionnement comme le mode SLEEP. Le PIC16F84 est un composant stable et polyvalent, utilisé dans divers systèmes embarqués.

Transféré par

Issam Chtaitif
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

17

III. Microcontrôleur PIC16F84


I. Présentation :
uC ( MCU en anglais, MicroController Unit) sont des systèmes embarqués, qui intègrent

Un processeur ou unité centrale de traitement UCT (CPU en anglais, Central Processing Unit) est un circuit intégré qui
exécute les opérations arithmétiques ( + - * / ) et logiques (portes logiques, affectations, décalages, comptages...) reçues
instructions machine.
Un microprocesseur est un processeur construit en un seul circuit intégré.
Caractéristiques du PIC16F84 et Brochage du PIC16F84 :
Une mémoire programme de type flash de 1K (1024) mots de 14 bits
Une mémoire RAM constituée :
o 17 registres de control SFR (Special Function Registers)
o 68 octets de RAM utilisateur appelés aussi GPR (General Propose
Registers)
Une mémoire EEPROM de donnée de 64 octets
Deux ports d'entrée sortie, un de 8 bits et un de 5 bits (RA et RB)
Un timer/Compteur cadencé par une horloge interne ou externe
Un chien de garde / compteur qui est un timer particulier
Un Pré-diviseur de fréquence programmable permettant d'étendre les possibilités
du Timer TMR0 et du chien de garde WDT
4 sources d'interruption
L'horloge peut être générée par 4 types d'oscillateurs sélectionnables
Protection de code
Fonctionnement en mode sleep pour réduction de la consommation
Programmation par mode ICSP (In Circuit Serial Programming)

II. Architecture interne :

2 STE ATC Prof. I.CHTAITIF


18
N.B. : Notez que les PICs sont des composants très stables
.
1. La mémoire programme (flash) :
Cette mémoire de 14bits * 1024 mots (1k) stocke le programme. Elle est non volatile et reprogrammable à souhait.
Chaque position de 14 bits contient une instruction. L'emplacement du programme peut se situer à n'importe quel
endroit de la mémoire. Cependant il faut savoir que suite à un RESET ou lors de la mise sous tension, le PIC commence
l'exécution à l'adresse 0000H. De plus, lorsqu'il y a une interruption, le PIC va à l'adresse 0004H. Il est donc conseillé de
placer le début du programme après l'adresse 0004H et de mettre un branchement au début du programme à l'adresse
0000H et un branchement au début de la routine d'interruption s'il y en a une à l'adresse 0004H. Le programme est
implanté dans la mémoire flash à l'aide d'un programmateur (hard+soft) sur lequel nous reviendrons dans la suite de ce
document.
2. PC (Program Counter):

3. L'ALU et l W:
ALU est une Unité Arithmétique et Logique (UAL) 8 Bits qui réalise les instructions / opérations arithmétiques et logiques
entre 2 opérandes : l'accumulateur W et n'importe quel autre registre 'F' ou constante K.
L'accumulateur W (Work) est le registre de travail 8 bits, il n'a pas d'adresse comme les autres SFR (il est implanté avec
ALU et non pas dans la RAM).

4. L'Horloge :
L'horloge peut être soit interne soit externe. L'horloge interne est constituée d'un oscillateur à quartz ou d'un oscillateur
RC.

Avec un oscillateur RC, la fréquence de l'oscillation est fixée par Vdd, Rext et Cext. Elle peut varier légèrement d'un
circuit à l'autre.

particulier.
Quel que soit l'oscillateur utilisé, l'horloge système dite aussi horloge instruction est obtenue en divisant la fréquence
par 4.
Avec un quartz de 4 MHz, on obtient une horloge instruction de 1 MHz, soit le temps pour exécuter une instruction de

5. La mémoire RAM - Registres :


La RAM est formée de registres de 8bits, des 2 types SFR et GPR, organisés en 2 pages (bank0-1)
Elle contient 256 registres adressés de 00h à FFh, sur 7bits (27=128 adresses) + le bit RP0 (21=2 pages)
Page 0 (RP0-adress 0000.0000 (00h) à 0111.1111 (7F)) Page 1 (RP0-adress 1000.0000 (80h) à 1111.1111 (FF))
Les registres des zones 50h à 7Fh et D0h à FF + les 2 adresses 07 et 87 ne sont pas utilisables
Les registres de 8C à CF (bank1) sont une copie matérielle des registres 0C à 4F (bank0)
Alors on reste avec 90 registres fonctionnelle :
17 registres SFR (Special Function Register), ce sont les registres de fonctionnement du PIC. Certain SFR sont
dupliqués, L'ensemble de ces (22 registres) est souvent appelé fichier des registres.
68 registres GPR (General Purpose Register) sont des positions mémoire que l'utilisateur peut utiliser pour stocker
ses variables et ses données.
48*2 Octets 68*2 Octets 11*2 Octets (07et87 exclus)

2 STE ATC Prof. I.CHTAITIF


19

Zone GPR Zone SFR


a) Le registre STATUT:
, il est situé dans la RAM, donc sur 8bits, il apparait dans les 2 banks de la RAM, et donc
accessible directement:
IRP et RP1 : Non utilisé dans ce PIC IRP RP1 RP0 Z DC C
RP0 : permet de choisir la bank
: prend 0 pour indiquer que WatchDog a atteint la fin de comptage (Lecture uniquement)
: prend est mis en « SLEEP » (Lecture uniquement)
C (Carry) : ce bit Il passe à "1" lorsque le résultat d'une opération dépasse la valeur FF ou si le résultat est négatif.
DC (Digital Carry) :
Z (Zero) : Ce bit passe à "1", pour indiquer que le résultat de l'opération est nul.

b) Le registre OPTION_REG:
Il est situé dans la bank1, il permet de gérer certaines options du PIC:
INTEDG TOCS TOSE PSA PS2 PS1 PS0
= 0 active la résistance de Pull up sur les 8bits du Port.
INTEDG = 1 : Interruption si front montant sur la broche PB0/IRQ
T0CS = 1
est utilisée comme E/S
TOSE = 1
PSA = 1 : prédiviseur est affecté au WatchDog, sinon il est affecté au timer

c) Le port d'E/S PORTA (8bits) :


Le port A relié électriquement au registre PORTA, est une interface E/S de 5 bits (RA0 à RA4) bidirectionnelle. Chaque
E/S du port est compatible TTL (0V-5V). La configuration de direction pour chaque bit du port est déterminée avec le
registre TRISA.
Bit i du TRIS à 0 bit i de PORT, PORTAi est configuré en Sortie
Bit i du TRIS à 1 bit i de PORT, PORTAi est configuré en Entrée
La valeur binaire à sortir ou à lire sur le port A est contenue dans le registre PORTA
N.B. : La broche RA4 est multiplexée avec l'entrée horloge du timer TMR0, elle peut donc être utilisée soit comme E/S
normale du port A, soit comme entrée horloge pour le Timer TMR0, le choix se fait à l'aide du bit T0CS du registre
OPTION_REG.

d) Le port d'E/S PORTB (8bits) :


Le port B relié électriquement au registre PORTB, est une interface E/S de 8 bits (RB0 à RB7) bidirectionnelle. Chaque E/S
du port est compatible TTL (0V-5V). La configuration de direction pour chaque bit du port est déterminée avec le
registre TRISB.
Bit i du TRIS à 0 bit i de PORT, PORTBi est configuré en Sortie
Bit i du TRIS à 1 bit i de PORT, PORTBi est configuré en Entrée
La valeur binaire à sortir ou à lire sur le port B est contenue dans le registre PORTB
N.B. : En entrée, le bit RB0 appelée aussi INT et peut déclencher . (Si cette interruption est
autorisée)
En entrée, un quelconque des bits RB4 à RB7 peut déclencher l'interruption RBI. (Si cette interruption est autorisée)
6. Le Timer TMR0 :
, et situé dans la RAM, il est caractérisé par :
Il est incrémenté en permanence
2 STE ATC Prof. I.CHTAITIF
20
Son horloge est déterminé par le bit T0CS du registre OPTION_REG :
o horloge interne Fosc/4 (mode timer)
o horloge externe appliquée à RA4 du port A (mode timer ou compter)
Dans le cas de l'horloge externe, on peut choisir le front sur lequel le TIMER s'incrémente.
o
o
Quel que soit l'horloge choisie, on peut la passer dans un diviseur de fréquence programmable (Prescaler) dont le
rapport est fixés par les bits PS0, PS1 et PS2 du registre OPTION_REG (tableau ci-contre).
L'activation ou non du prédiviseur se fait par le bit PSA du registre OPTION_REG :
o on utilise le prédiviseur
o pas de prédiviseur (il affecté au Watchdog)
Le contenu du timer TMR0 est accessible par le registre qui porte le même nom. Il peut être lu ou écrit à n'importe quel
moment. Après une écriture, l'incrémentation est inhibée pendant deux cycles instruction
Au débordement de TMR0 ( ), le drapeau T0IF est placé à 1. Ceci peut déclencher l'interruption T0I si celle-ci
est validée
Registre OPTION_REG :
RBPU INTEDG TOCS TOSE PSA PS2 PS1 PS0

7. Le Watchdog Timer WDT (Chien de garde) :


8 bits incrémenté en permanence

fonctionnement normal, le WDT time-out provoque un RESET


en cas de blocage du microcontrôleur par un processus indésirable non contrôlé.
mode SLEEP, le WDT time-out provoque un WAKE-UP (réveil), l'exécution du programme continue
normalement là où elle s'est arrêtée avant de rentrer en mode SLEEP. Cette situation est souvent exploitée pour
réaliser des temporisations.
L'horloge du WDT est ajustée pour que Le Time-Out arrive toutes les 18 ms. Il est cependant possible d'augmenter cette
durée en faisant passé le signal Time-Out dans un prédiviseur programmable (partagé avec le timer
:
o on utilise le prédiviseur
o pas de prédiviseur (affecté à TMR0)
Le rapport du prédiviseur est fixé par les bits PS0, PS1 et PS2 du registre OPTION_REG :
Pour éviter un WDT timeOut lors de l'exécution d'un programme, on a deux possibilités :
Inhiber le WDT d'une façon permanente en mettant à 0 le bit de configuration WDTE.
Remettre le WDT à 0 périodiquement dans le programme à l'aide de l'instruction CLRWDT pour éviter qu'il ne
déborde.

8. Le mode SLEEP :
Le PIC peut être placé en mode faible consommation à l'aide de l'instruction SLEEP (Veille). Dans ce mode, l'horloge
système est arrêtée ce qui arrête l'exécution du programme.
Pour sortir du mode SLEEP, il faut provoquer un WAKE-UP (réveiller), pour cela il y a 3 possibilités :
RESET externe dû à l'initialisation du PIC en mettant l'entrée à 0. Le PIC reprend l'exécution du programme à
partir du début.
TimeOut du WDT = 0 si celui-ci est validé. Le PIC reprend le programme à partir de l'instruction qui suit
l'instruction SLEEP
2 STE ATC Prof. I.CHTAITIF
21
Interruption : INT (sur RB0) ou RBI (sur RB4-RB7) ou EEI (fin d'écriture en EEPROM de données). Le
de l'interruption en question doit être validé, par contre, le WAKE-UP a lieu le bit de
validation globale. On a alors deux situations :
o GIE = 0, Le PIC reprend l'exécution du programme à partir de l'instruction qui suit l'instruction SLEEP, l'interruption
n'est pas prise en compte
o GIE = 1, Le PIC exécute l'instruction qui se trouve juste après l'instruction SLEEP puis se branche à l'adresse 0004
pour exécuter la procédure d'interruption. Dans le cas où l'interruption suivant SLEEP n'est pas désirée, il faut
utiliser l'instruction NOP après SLEEP.

9. La mémoire EEPROM de données


La mémoire EEPROM de données est constituée de 64 mot de 8bits commençant à l'adresse 0x2100, et que l'on peut
lire et écrire depuis un programme. Ces octets sont conservés après une coupure de courant et sont très utiles pour
conserver des paramètres semi permanents.
On y accède à l'aide des registres EEADR et EEDATA :
o toute lecture/écriture dans le registre EEDATA se fait dans la position mémoire pointée par EEADR.
o EEADR contient l'adresse relative par rapport à la page qui commence en 0x2100, autrement dit,
l'adresse va de 0 à 63.
Les Deux registres de contrôle (EECON1 et EECON2) sont associés à la mémoire EEPROM.
fin de chaque écriture réussie est annoncé par le drapeau
EEIF et la remise à zéro du bit RW du registre EECON1.
Le drapeau EEIF peut déclencher l'interruption EEI si elle a été validée.
10. Les interruptions
Une interruption est aléatoire du programme principal pour aller exécuter une procédure d'interruption. A la fin
ssède 4
sources d'interruption :
INT L'interruption port B
Cette interruption est provoquée par un changement d'état sur l'entrée RB0 du port B quand elle est programmée en
entrée.
Le bit INTEDG permet de choisir front de déclenchement, 1=montant, 0=descendant (registre OPTION_REG)
RBI L'interruption du PORTB (RB4 à RB7 du port B)
Cette interruption est provoquée par un changement d'état sur l'une des entrées RB4 à RB7 du port B, Le front n'a pas
d'importance.
T0I L'interruption de débordement du Timer TMR0
Cette interruption est provoquée par le débordement du timer TMR0. Les bits associés sont T0IE (validation) et T0IF
(drapeau)
EEI L'interruption de Fin d'écriture dans l'EEPROM
Cette interruption est déclenchée à la fin d'une écriture réussie dans l'EEPROM.

11. INTCON Registre des interruptions:


Les interruptions sont contrôlées par le registre INTCON qui se compose de :
Bit GIE (General Intarrutions
-si.
A chaque interruption sont associés deux bits:
o bit d'autorisation (Enable) il doit être mis à 1 pour utiliser ou non (à 0) l'interruption
o un indicateur/drapeau (Flag) prend 1 si une interruption est déclenchée il permet de savoir de quelle
interruption il s'agit
Interruption INT RBI T0I EEI
Tous bits ces Enable et Flag sont dans le registre INTCON à part le Bits INTE RBIE T0IE EEIE
drapeau EEIF de l'interruption EEI qui se trouve dans le registre
EECON1. Bit indicateur INTF RBIF T0IFF EEIF
Déroulement d'une interruption : (flag)
Lorsque l'événement déclencheur d'une interruption intervient, alors son indicateur est positionné à 1 (flag levé). Si
l'interruption correspondante a été autorisée, elle est alors déclenchée :
le programme principale arrête et le PIC exécute la procédure d'interruption qui se trouve à l'adresse 4 en exécutant
les étapes suivantes :
2 STE ATC Prof. I.CHTAITIF
22
l'adresse contenue dans le PC (Program Counter) est sauvegardée dans la pile, puis remplacée par la valeur 0004
(adresse de la routine d'interruption).
Le bit GIE est placé "0" pour bloquer interruptions (afin qu'on ne soit pas dérangés pendant l'exécution de
la procédure d'interruption).
A la fin de la procédure d'interruption (instruction RETFIE) :
o le bit GIE est replacé à l'état haut (autorisant ainsi un autre événement)
o le contenu du PC est rechargé à partir de la pile ce qui permet au programme de reprendre là où il
s'est arrêté
Deux remarques importantes sont à faire :
Remarque 1 :

"0" à la fin de la routine d'interruption sinon l'interruption sera déclenchée de nouveau juste après l'instruction RETFIE
Remarque 2 :
Seul le PC est empilé automatiquement. Si cela est nécessaire, les registres W et STATUS doivent être sauvegardés en
RAM puis restaurés à la fin de la routine pour que le microcontrôleur puisse reprendre le programme dans les mêmes
conditions où il l'a laissé.

2 STE ATC Prof. I.CHTAITIF


23
III. PIC16F84

Si d = 1 (ou d = F) F»
Si d = 0 (ou d = W) le résultat est stocké dans W

2 STE ATC Prof. I.CHTAITIF


24

IV. : Aspect Programmation


Fonctions générales sur des Registres :
Programme 1 : Charger/déplacer un registre
Charger la constante b'11011011' dans le registre 0x8C (bank1)
Charger la constante b'00100100' dans le registre 0x10 (bank0)
Déplacer le contenu du registre 0x10 au registre 0x11
Déplacer le contenu du registre 0x8C au registre 0x0D
Label Instruction Opérande Commentaires
List p=16f84 ; (instruction logiciel) choix du à programmer
include "p16f84.inc" ; (instruction logiciel) Librairie, qui contient les adresses des
registres et des bits
ORG 0x000 ; (instruction logiciel) Adresse Mémoire programme à laquelle
commence

; 0x000 la ligne du programme exécutée au démarrage ou après


MCLR
GOTO debut ; Sauter au label debut (adresse Mém. Prog. aléatoire définie par le logiciel)
; Chargement des constantes
debut ; Aller à la bank1 de la RAM
; mettre une constante binaire dans le registre de travail W
; Déplacer le contenu de W vers l'adresse 0x8C

; Aller à la bank0 de la RAM


; mettre une constante binaire dans le registre de travail W
; Déplacer le contenu de W vers l'adresse 0x10
; Déplacement des registre
; Rester à la bank0 car les registres GPR de la bank1 sont
; Déplacer le contenu de 0x10 dans le registre de travail W, résultat dans W
; Déplacer le contenu de W vers l'adresse 0x11

;
;
; Déplacer le Contenu du registre 0x0C vers le registre W
; Déplacer le contenu de W vers l'adresse 0x0D
END ; (instruction logiciel) fin programme
Programme 2 : Complément
Variable var1 et var2, puis appliquer le compliment à ces 2 adresses.
Label Instruction Opérande Commentaire
List p=16f84 ; (instruction logiciel) choix du à programmer
include "p16f84.inc" ; (instruction logiciel) inclure la librairie du
ORG 0x000 ; (instruction logiciel) Adresse de démarrage après reset (instruction logiciel)

GOTO debut ; Sauter au début (adresse définie par le logiciel)

debut ; Aller à la bank0

; mettre une constante décimale dans W


; Déplacer le contenu de W vers la variable var1
; mettre une constante binaire dans W
; déplacer le contenu de W vers la variable var2

2 STE ATC Prof. I.CHTAITIF


25
; Complément du contenu de la variable var1, résultat dans la
même variable
; Complément du contenu de la variable var2, résultat dans la
même variable
END ; (instruction logiciel) fin programme
Programme 3 : Somme et Soustraction
variables var1 et var2,
ddition des contenus de var1 et var2, puis resu2 reçoit la soustraction var2 var1
Label Instruction Opérande Commentaire
List p=16f84 à programmer (instruction logiciel)
include "p16f84.inc"
ORG 0x000 ; Adresse de départ après reset (instruction logiciel)
var1 ; Réserver des adresses pour les variables
var2
0x10
0x11
GOTO debut ; Sauter au début (adresse définie par le logiciel)

debut ; mettre une constante hexadécimale dans W


; Déplacer le contenu de W vers var1
; mettre une constante binaire dans W
; Déplacer le contenu de W vers var2

END ; (instruction logiciel) fin programme

Utilisation des ports Entrée/Sortie :


Programme 4 : Port en Sortie
Les ports A et B sont reliés à des afficheurs (Voir simulation)
Utiliser le PORTA pour afficher les valeurs hexadécimales sur 4 bits (5)16 (F)16 (A)16
Utiliser le PORTA pour afficher les valeurs binaires (11011011)2 (11110000)2 (00001111)2
Label Instruction Opérande Commentaire
List p=16f84
include "p16f84.inc"
ORG 0x000 ; Adresse de départ après reset (instruction logiciel)
GOTO debut ; Sauter au début (adresse définie par le logiciel)

debut ; Aller à la bank1


; Configurer le port en Sortie (en mettant à 0
; les bits du TRIS) par constante b'0000 0000' (TRISA pour configurer PORTA)
; ou par RAZ du registre TRIS (TRISB pour configurer PORTB)

; Aller à la bank0

Call temp ; appeler sous-programme « temp » (non-traité dans ce


programme)
2 STE ATC Prof. I.CHTAITIF
26

Call temp ; appeler sous-programme « temp » (non-traité dans ce


programme)

Call temp ; appeler sous-programme « temp » (non-traité dans ce


programme)
END ; fin programme (instruction logiciel)
Programme 5 : Port en entrée
Configurer le PORTA en entrée et stocker son contenu dans 0x10
Label Instruction Opérande Commentaire
List p=16f84 ; à programmer (instruction logiciel)
include "p16f84.inc" ; inclure la librairie (instruction logiciel)
ORG 0x000 ; Adresse de départ après reset (instruction logiciel)
GOTO debut ; Sauter au début (adresse définie par le logiciel)

Debut ; Aller à la bank1


; Configurer le port A en entrée (en mettant à 1
; les bits du TRISA) par constante b'11111111' W TRISA
; ou par RAZ du registre TRISA puis le complément
;

; Aller à la bank0
; Contenu du reg PORTA vers le reg W
; Contenu du reg W vers le reg 0x10
END ; fin programme (instruction logiciel)
Programme 6 : PORTA (Entrée) vers le PORTB (Sortie)
Configurer le PORTA en entrée et recopier son contenu vers le PORTB en sortie
Label Instruction Opérande Commentaire
List p=16f84 ; à programmer (instruction logiciel)
include "p16f84.inc" ; inclure la librairie du uC (instruction logiciel)
ORG 0x000 ; Adresse de départ après reset (instruction logiciel)
GOTO debut ; Aller au label debut (adresse définie par le logiciel)

Debut ; Aller à la bank1


; Configurer PORTB en Sortie (en mettant à 0
; les bits du TRISA) par constante b'0000 0000' W TRISA
; ou par mise à 0 du registre

BCF STATUS, RP0 ; Aller à la bank0


boucle ; Déplacer le Contenu du reg PORTA vers le reg W
; Déplacer le Contenu du reg W vers le reg PORTB
GOTO boucle ; répéter la boucle
END ; fin programme (instruction logiciel)

2 STE ATC Prof. I.CHTAITIF


27
Programme 7 : PORTB (4 Entrées) vers PORTB (4 Sorties)
Configurer le PORTA en entrée et recopier son contenu vers le PORTB en sortie
Label Instruction Opérande Commentaire
List p=16f84A ; Choix du µC à programmer (instruction logiciel)
include "p16f84A.inc" ; inclure la librairie du uC (instruction logiciel)
ORG 0x000 ; Adresse de la 1ère instruction dans la mémoire
programme(instruction logiciel)
GOTO deb ; Aller au label debut (adresse définie par le logiciel)
; Configuration du PORT
deb BSF STATUS, RP0 ; Aller à la bank1
; Configurer les bits 0,1,2,3 du PORTB en Sortie
; et les bits 4,5,6,7 en entrée
; utilisation du PORT
BCF STATUS, RP0 ; Aller à la bank0
MOVLW b'11110000' ; créer un masque
; Appliquer le masque // effacer les anciennes sorties et garder les entrées
; Contenu du PORTB vers W
MOVWF var1 ; Contenu du W vers var1
; inverser Quartet-Quartet - Entrée vers sortie
MOVF var1,W ; Contenu de var1 vers W
; Contenu du W vers PORTB
END ; fin programme (instruction logiciel)
Programme 8 : Structure de teste
0 du PORTA
Si elle est à 1, le PORTB reçoit Si elle est à 0, RAZ du PORTB
Label Instruction Opérande Commentaire
List p=16f84 ; Choix du µC à programmer (instruction logiciel)
include "p16f84.inc" ; inclure la librairie du uC (instruction logiciel)
ORG 0x000 ; Adresse de la 1ère instruction dans la mémoire
programme(instruction logiciel)
GOTO debut ; Aller au label debut (adresse définie par le logiciel)

; configuration des PORTs


debut BSF STATUS, RP0 ; Aller à la bank1
; Configurer PORTB en sortie // PORTA en entrée par défaut

; utilisation des Ports


BCF STATUS, RP0 ; Aller à la bank0

; Tester si l'entrée 0 de PORTA est à 1 (résultat vrai 1 ou faut 0),


Sauter si 1
sifaux ; Saut vers label [sifaux] si le résultat du test est Faut
sivrai ; Saut vers label [sivrai] si le résultat du test est Vrai

sivrai ; Charger la valeur binaire 10101010 dans W


PORTB ; contenu de W vers PORTB // affecter les sorties
GOTO test ; répéter depuis le label test
sifaux PORTB ; RAZ du PORTB
GOTO test ; répéter depuis le label test

END ; fin programme (instruction logiciel)

2 STE ATC Prof. I.CHTAITIF


28
Utilisation des Compteurs :
Programme 9 : Comptage 10 états
Créer une variable « counter » et réaliser un comptage de 10 états
Solution 1 : incrémentation de 0 à 10
Label Instruction Opérande Commentaire
List p=16f84A ; Choix du µC à programmer (instruction logiciel)
include "p16f84A.inc" ; inclure la librairie du uC (instruction logiciel)
ORG 0x000 ; Adresse de la 1ère instruction dans la mémoire
programme(instruction logiciel)
counter res 0x17 ; Réserver une adresse pour le compteur
GOTO deb ; Aller au label debut (adresse définie par le logiciel)

deb counter ; Mettre à 0 le compteur


increm counter, 1 ; Incrémenter le contenu du compteur
MOVLW ; charger la constante décimale 10 dans le reg W
; Soustraction (counter - W), résultat dans W
BTFSS ; Tester le Bit Z (Z=1 si résultat nul) (ce test donne 1 Vrai 0 Faux)
; Si Faux alors répéter depuis [increm]
END ; Si Vrai alors fin du comptage // fin programme

Solution 2 : incrémentation de 246 à 0


Label Instruction Opérande Commentaire
List p=16f84A ; Choix du µC à programmer (instruction logiciel)
include "p16f84A.inc" ; inclure la librairie du uC (instruction logiciel)
ORG 0x000 ; Adresse de la 1ère instruction dans la mémoire
programme(instruction logiciel)
counter res 0x17 ; Réserver une adresse pour le compteur
GOTO deb ; Aller au label debut (adresse définie par le logiciel)

deb MOVLW ; Charger une constante décimale 246 dans le reg W


MOVWF counter ; Déplacer Contenu du reg W vers counter
increm counter, 1 ; Incrémenter le contenu de counter et tester le bit Z (résultat du
test Vrai1-Faux0)
; Si Faux alors répéter depuis [increm]
END ; Si Vrai alors fin du comptage // fin programme

Solution 3 : décrémentation de 10 à 0
Label Instruction Opérande Commentaire
List p=16f84A ; Choix du µC à programmer (instruction logiciel)
include "p16f84A.inc" ; inclure la librairie du uC (instruction logiciel)
ORG 0x000 ; Adresse de la 1ère instruction dans la mémoire
programme(instruction logiciel)
counter res 0x17 ; Réserver une adresse pour le compteur
GOTO deb ; Aller au label debut (adresse définie par le logiciel)

deb MOVLW ; Charger constante décimale 10 dans le reg W


MOVWF counter ; Contenu du reg W vers counter
decrem counter, 1 ; Décrémenter le contenu de counter et tester le bit Z (résultat du
test Vrai1-Faux0) ; Si Faux alors répéter depuis [decrem]
END ; Si Vrai alors fin du comptage // fin programme

2 STE ATC Prof. I.CHTAITIF


29
Solution 4 : Cycle complet 255 avec décrémentation
Label Instruction Opérande Commentaire
List p=16f84A ; Choix du µC à programmer (instruction logiciel)
include "p16f84A.inc" ; inclure la librairie du uC (instruction logiciel)
ORG 0x000 ; Adresse de la 1ère instruction dans la mémoire
programme(instruction logiciel)
counter res 0x17 ; Réserver une adresse pour le compteur
GOTO deb ; Aller au label debut (adresse définie par le logiciel)

deb MOVLW ; Charger constante décimale 255 dans le reg W


/binaire1111.1111/hexa FF
MOVWF counter ; Contenu du reg W vers counter
decrem counter, 1 ; Décrémenter le contenu de counter et tester le bit Z (résultat du
test Vrai1-Faux0) ; Si Faux alors répéter depuis [decrem]
END ; Si Vrai alors fin du comptage // fin programme

Utilisation des temporisations :


Programme 10 : Réaliser des temporisations sur registres
Fréquence Cycle
Quartz (exemple) Fq Tq
Interne Fint Tint
Externe
Fex Tex
(exemple)
WatchDog fWD TWD

Solution 1 : Boucle simple


Label Instruction Opérande Nmbr de Cyc Commentaire
List p=16f84A ; Choix du µC à programmer (instruction logiciel)
include "p16f84A.inc" ; inclure la librairie du uC (instruction logiciel)
ORG 0x000 ; Adresse de la 1ère instruction dans la mémoire
programme(instruction logiciel)
counter res 0x10 ; Réserver une adresse pour le compteur
GOTO deb ; Aller au label debut (adresse définie par le logiciel)

deb 1 ;M ) dans counter


1 ; par RAZ puis complément ou par Cte -> W -> counter
decrem counter, 1 1*254 + 2 ; Décrémenter le registre et tester si 0 est atteint
2*254 ; Si Résultat du test est Faux alors Saut vers [decrem]
END ; Si Résultat du test est Vrai alors fin programme

Durée de la temporisation : 766*1us

D = N*Tint

Solution 2 : 2 Boucles imbriquées 3*255


Label Instruction Opérande Nmbr de Cyc Commentaire
List p=16f84A ; Choix du µC à programmer (instruction logiciel)
include "p16f84A.inc" ; inclure la librairie du uC (instruction logiciel)
ORG 0x000 ; Adresse de la 1ère instruction dans la mémoire
programme(instruction logiciel)
cntr1 res 0x10
cntr2 res 0x11
GOTO deb ; Aller au label debut (adresse définie par le logiciel)

2 STE ATC Prof. I.CHTAITIF


30
; initier la boucle principale
deb 1 compteur1
MOVWF cntr1 1 ; de la Boucle Principale

; boucle imbriquée
imbriq cntr2 1*3 compteur2
cntr2, 1 1*3 ; de la Boucle Imbriquée
decrem DECFSZ cntr2, 1 (1*254 + 2)*3 ; Décrémenter le registre et tester si 0 est atteint
GOTO decrem (2*254)*3 ; Si Résultat du test est Faux alors aller vers [decrem]

; décrémenter la boucle principale ; Si Résultat du test est Vrai


cntr1, 1 1*2 + 2 ; décrémenter principale et tester si 0 est atteint
GOTO 2*2 ; Si Résultat du test est Faux alors Saut vers [imbriq]
END ; Si Résultat du test est Vrai alors fin programme
Durée de la temporisation :
Si la boucle principale est de 3 cycles

D=N*Tint

Solution 3 : 3 boucles imbriquées 5*255*255


Label Instruction Opérande Nmbr de Cyc Commentaire
List p=16f84A ; Choix du µC à programmer (instruction logiciel)
include "p16f84A.inc" ; inclure la librairie du uC (instruction logiciel)
ORG 0x000 ; Adresse de la 1ère instruction dans la mémoire
programme(instruction logiciel)
cntr0 res 0x10
cntr1 res 0x11 e1
cntr2 res 0x12 e2
GOTO deb ; Aller au label debut (adresse définie par le logiciel)
; initier boucle principale
deb MOVLW 05 compteur1
MOVWF ; de la Boucle Principale

; initier boucle imbriquée1


imbriq1 MOVLW
MOVWF cntr1 ; de la boucle imbriquée1

; boucle imbriquée2
imbriq2 CLRF cntr2 ; mettre
COMF cntr2 ; de la boucle Imbriquée2
decrem2 DECFSZ cntr2, 1 ; Décrémenter cntr2 et tester si 0 est atteint
GOTO decrem2 ; Si Résultat du test est Faux alors répéter [decrem2]

; décrémenter boucle imbriquée1 ; Si Résultat du test est Vrai


DECFSZ ; Décrémenter principale et tester si 0 atteint
GOTO ; Si Résultat du test est Faux alors Saut vers [imbriq2]

; décrémenter boucle principale ; Si Résultat du test est Vrai


decR DECFSZ ; Décrémenter répétition et tester si 0 atteint
GOTO ; Si Résultat du test est Faux alors Saut vers [imbriq1]
END ; Si Résultat du test est Vrai alors fin programme

2 STE ATC Prof. I.CHTAITIF


31
Durée de la temporisation :
Si la boucle principale est de 3 cycles :

D = N*Tint
Si la boucle principale est de 255 cycles :

D = N*Tint

Programme 11 : Sous-programme de temporisation en utilisant le TMR0


Fréquence Cycle
Quartz (exemple) Fq Tq
Interne Fint Tint
Externe
Fex Tex
(exemple)
WatchDog fWD TWD
Solution 1 : Horloge interne sans prédiviseur
Label Instruction Opérande Nmbr de Cyc Commentaire
delai BSF STATUS, RP0 ; Aller à la Bank1 pour configurer le Option_reg
OPTION_REG,
OPTION_REG, ; Appliquer le prédiviseur au WatchDog
BCF STATUS, RP0 ; Aller à la bank0 qui contient le reg TMR0
; Remettre à 0 le TMR0
BCF ; Remettre à 0 le flag T0IF
test BTFSS [(x*1) + 2] = 255 TTMR0 ; Tester si le flag T0IF=1 (débordement TMR0)
GOTO test [(x*2)] ; Si Résultat du test est Faux alors Saut vers [test]
RETURN ; Si Résultat du test est Vrai alors retour vers le programme principal

Durée de la temporisation :
Durée cycle TMR0 : TTMR0

Solution 2 : Horloge interne avec prédiviseur /256


Label Instruction Opérande Nmbr de Cyc Commentaire
delai BSF STATUS, RP0 ; Aller à la Bank1 pour configurer le reg Option
MOVLW ; Config du TMR0 par reg OPTION
MOVWF ; Horloge interne et prédiviseur /256
BCF STATUS, RP0 ; Aller à la bank0 qui contient le reg TMR0
; Remettre à 0 le TMR0
BCF ; Remettre à 0 le flag T0IF
test BTFSS [(x*1) + 2] = 255 TTMR0 ; Tester si le flag T0IF=1 (débordement TMR0)
GOTO test ([x*2)] ; Si Résultat du test est Faux alors Saut vers [test]
RETURN ; Si Résultat du test est Vrai alors retour vers le programme principal

Durée de la temporisation :
Durée cycle TMR0 : TTMR0

Programme 13 : Sous-programme de temporisations en utilisant le WatchDog


Solution 1 : utilisation avec test du bit TO
Label Instruction Opérande Nmbr de Cyc Commentaire
delai BSF STATUS, RP0 ; Aller à la bank1
; Configurer le WD par registre Option
; en choisissant la prédivision par 1
BCF INTCON, GIE ; désactiver les interruptions
; remettre à 0 le WatchDog
test ; tester si le bit TO=0 (débordement
WatchDog)
2 STE ATC Prof. I.CHTAITIF
32
GOTO test ; Si Résultat du test est Faux alors Saut vers [test]
RETURN ; Si Résultat du test est Vrai alors retour vers le programme principal
Durée de la temporisation :

Dt = Cycle complet du cycle WD TWD


Durée du cycle WD : TWD = 18ms

Utilisation des interruptions :


Programme 12 : Réaliser un jeu de 8 LED sur le PORTB qui marche comme ci-
dessous :
- 2 LEDs sont allumées (0000.0011)
- ->1.2->2.3-
-
Solution : utilisation
Label Instruction Opérande Commentaire
List p=16f84 ; Choix du µC à programmer (instruction logiciel)
include "p16f84.inc" ; inclure la librairie du uC (instruction logiciel)

; Adresse de début de la routine

; Bloquer les interruptions


(automatiquement)
RLF PORTB, 1 ; Décalage à gauche du PORTB (à travers le bit C)
; Réinitialiser le TMR0 par la valeur 236
; (20cycles TMR0 -> environ 5s)
; d interruption T0IF (RAZ du
flag)
; Autoriser les interruptions
RETFIE ; Reprendre le programme principal

; Programme principal
ORG ; Adresse de la 1ère instruction dans la mémoire
programme(instruction logiciel)
GOTO ; Aller au label deb (adresse définie par le logiciel)
; Configurer PORTB, TMR0 et interruption T0I
deb ; Choisir une adresse aléatoire pour sauter

BSF STATUS,RP0 ; Aller à la bank1


CLRF TRISB ; Configurer PORTB en sortie (TRISB<-0000.000)
MOVLW b'00110111' ; Configurer du TMR0 par reg OPTION
MOVWF OPTION_REG ; Horloge externe et prédiviseur /256
BSF INTCON, T0IE
BSF INTCON, GIE ; Autoriser les interruptions
; initiation des valeurs sur PORTB
BCF STATUS, RP0 ; Aller à la bank0
MOVLW b'00000011' ; Charger une constance binaire dans W
MOVWF PORTB ; Contenu de W vers PORTB
; initier TMR0
MOVLW d'236' ; Réinitialiser le TMR0 par la valeur 236
MOVWF TMR0 ; (20cycles TMR0 -> environ 5s)

bcl NOP ; Appeler le sous-programme de temporisation


GOTO bcl ; Complémenter le PORTB
END

2 STE ATC Prof. I.CHTAITIF


33

Programme 13 : Réaliser un jeu de LED sur le PORTA qui marche comme ci-dessous :
Les LEDs sont allumée comme tel -> (10101)
L après une temporisation (delai)
Si une des entrées 4 à 7 du PORTB est modifiée, le cycle et interrompu
o Toutes les LED sont éteintes pendant une temporisation
o Puis on reprend le cycle normal
Si on appuie sur un bouton lié à
o Toutes les LED sont allumées pendant une temporisation
o Puis on reprend le cycle normal

Solution : utilisation des interruptions RBI et T0I


Label Instruction Opérande Commentaire
List p=16f84a ; Choix du µC à programmer (instruction logiciel)
include "p16f84a.inc" ; inclure la librairie du uC (instruction logiciel)
regW equ 0x0C ; Réserver des adresses pour les variables
regS equ 0x0D
regPA equ 0x0E
; sous-programme de temporisation
delai ; sous-programme « delai » non-détaillé ici
RETURN

ORG
; Bloquer les interruptions
(automatiquement)
;
; Stocker le registre W en mémoire
; Stocker le registre STATUS en mémoire

MOVF PORTA, 0 ; Stocker le registre PORTA en mémoire


MOVWF regPA
; Stocker les registres de temporisation
; gestion du PORT
BTFSS
GOTO
GOTO
CLRF PORTA ; Mettre à 0 le PORTA
CALL delai ; Appeler le sous-programme de temporisation
GOTO rec
CLRF PORTA ; Mettre à 1 le PORTA
COMF PORTA,1 ; Par RAZ puis complément de PORTA
Call delai ; Appeler le sous-programme de temporisation
GOTO rec ; Sauter vers
; Récupérer les registres de temporisation

rec MOVF regPA, 0 ; Récupérer le contenu du registre PORTA


MOVWF PORTA

SWAPé

; Récupérer le contenu du registre W par 2 SWAP

BCF ;
BCF ; RAZ des flags T0I et RBI
INTCON, GIE ; Autoriser les interruptions (automatiquement)
RETFIE ; Reprendre le programme principal

2 STE ATC Prof. I.CHTAITIF


34

; Programme Principal
ORG 0x000
GOTO deb ; Aller au label deb (adresse définie par le logiciel)
deb ORG 0x050 ; Adresse de la 1ère instruction dans la mémoire
programme(instruction logiciel)

BSF STATUS, RP0 ; Aller à la bank1


CLRF TRISA ; Config PORTA en sortie (TRISA<-0000.000)
BSF INTCON, RBIE ; Autoriser interruption du PORTB
BSF INTCON, INTE ; Autoriser interruption du TMR0
BSF INTCON, GIE ; Autoriser les interruptions
; utiliser le PORTA pour faire clignoter les LED
BCF STATUS, RP0 ; Aller à la bank0
MOVLW b'00001010' ; Charger une constance binaire dans W
MOVWF PORTA ; Contenu de W vers PORTA
cli CALL delai ; Appeler le sous-programme de temporisation (non détaillé ici)
COMF PORTA,1 ; Complément du PORTA, résultat dans PORTA
GOTO cli
END

Adressage indirect :
Programme 14 :
- Mettre à Zéro les adresse de la RAM 0x0C à 0x4F
- Stocker successivement les valeurs entrées sur le port B dans la RAM (0x0C à 0x4F)
Label Instruction Opérande Commentaire
List p=16f84a
include "p16f84a.inc"
ORG 0x000 ; Adresse de la 1ère instruction dans la mémoire
programme(instruction logiciel)
GOTO RAZ ; Aller au label deb(adresse définie par le logiciel)
; Mettre à Zéro les adresse de la RAM 0x0C à 0x0F
MOVLW ; Mettre la première adresse dans FSR
MOVWF ;
maz ; MAZ le registre INDF = le registre dont FSR

suivante
MOVF FSR, 0 ; Contenu du registre FSR vers le registre W
SUBLW 0x50 W) (tester si adresse
BTFSS STATUS, Z ; Tester si on a atteint la dernière adresse
GOTO maz ; Sifaux refaire une MAZ
GOTO sauv ; Si vrai, fin de programme

; Stocker successivement les valeurs entrées sur le port B dans la RAM (0x0C à 0x4F)
sauv ; Mettre la première adresse dans FSR
; (PORTB est configuré en entrée au
démarrage du PIC)
stock MOVF PORTB, 0 ; Contenu du registre PORTB vers le registre W
MOVWF INDF ; Contenu du registre W vers le registre INDF

INCF
MOVF ; Contenu du registre FSR vers le registre W
SUBLW W) (tester si adresse
BTFSS STATUS, Z ; Tester si (Z = 1) on a atteint la dernière adresse
GOTO stock ; Sifaux stocker le nouveau contenu du PORTB
END ; Si vrai fin du programme
2 STE ATC Prof. I.CHTAITIF
35
:
Programme 15
Stocker le mot binaire du PORTB (entrées) adresse 0x01, si RB7=0 lire le

Label Instruction Opérande Commentaire


List p=16f84a
include "p16f84a.inc"
ORG 0x000 ; (instruction logiciel) Adresse de démarrage après reset (instruction logiciel)
GOTO deb ; Aller au label deb(adresse définie par le logiciel)
deb BSF STATUS, RP0 ; Bank1
COMF TRISA,1 ; Configurer le PORTA en sortie
MOVLW
MOVWF ; GIE=1 et EEIE=1
BCF STATUS, RP0 ; Bank0
test BTFSS PORTB,7 ; tester si RB7=1
GOTO read ; si faux, lire
GOTO wri ; si vrai, écrire

; Stocker le mot binaire du PORTB ----


wri MOVLW

MOVWF

MOVF ; Déplacer la donnée à stocker (PORTB) vers le registre W


MOVWF ;Charger la donnée dans EEDATA

BSF STATUS, RP0 ; Aller à la bank1


BSF ; Autoriser

MOVLW
MOVWF EECON2
MOVLW ; dans le registre EECON2
MOVWF EECON2

BSF

SLEEP ; passer en mode de faible consommation en attendant


NOP
BCF
GOTO test

read MOVLW
MOVWF

BSF STATUS, RP0 ; Aller à la bank1


BSF ; Lancer la lecture de la donnée

BCF STATUS, RP0 ; Aller à la bank0


; Récupérer la donnée sur EEDATA
; Déplacer la donnée vers PORTA
GOTO test
E

2 STE ATC Prof. I.CHTAITIF


Architecture interne : Les Packages :

Comparaison du PIC16F877 au PIC16F84 :


La Mémoire programme

La RAM

Les Ports E/S :

Le PORTB (RB0...RB7) :

PORTC (RC0...RC7) :
PORTD (RD0...RD7) : La durée de la Conversion :

Le PORTA et le PORTE / entrées Analogiques :

acq
acq hold s ic ss

acq
ADCON1 ic
ss
s s max
hold

ADCON0 Temps de conversion TC:


e hold
NU AD AD

AD CAN AD
Les Interruptions :

Interruptions périphériques(PEIE) :

Les TIMERs :
Programme 1 :

Vous aimerez peut-être aussi