DESCRIPTION GENERALE
Le PIC16F84
est un microcontrôleur 8 bits de faible coût. Certes, il ne peut se substituer
aux autres microcontrôleurs (68HC11 par exemple) mais il permet toutefois de
créer de nombreuses applications.
De plus,
avec son jeu d'instructions réduit, il est très agréable a utiliser lorsqu'on
désire s'initier à l'étude d'un microcontrôleur.
Enfin, ses
caractéristiques internes et externes sont très appréciable:
> 1K de
mémoire programme
68 octets
de RAM
64 octets
D'EEPROM
13
ENTREE/SORTIE
4 SOURCES
D'INTERRUPTION
1
TIMER/COMPTEUR
1 CHIEN DE
GARDE
MODE SLEEP
(pour une faible consommation)
4 SOURCES
D'OSCILLATEUR SELECTIONNABLE
PROTECTION
DU CODE
PROGRAMMATION
PAR ISP (In Serial Programming)
STRUCTURE EXTERNE
Le PIC16F84
est logé dans un boîtier 18 broches DIL ou SOIC ( version CMS).
La figure
ci-dessous nous décrit le brochage du PIC16F84:
PIN 1: 3ème bit du PORTA PIN 2:
4ème bit du PORTA PIN 3:
5ème bit du PORTA / TOCK PIN 4: RESET PIN 5: GND PIN 6: 1er
bit du PORTB PIN 7:
2ème bit du PORTB PIN 8:
3ème bit du PORTB PIN 9:
4ème bit du PORTB |
|
PIN 18:
2ème bit du PORTA PIN 17:
1er bit du PORTA PIN 16:
OSCILLATEUR PIN15:
OSCILLATEUR 2 PIN 14:
VCC PIN 13:
8ème bit du PORTB PIN 12:
7ème bit du PORTB PIN 11:
6ème bit du PORTB PIN 10:
5ème bit du PORTB |
Le PIC
existe aussi en deux versions:
PIC16F 84 :
pour une utilisation dans une gamme d'alimentation classique (4.5 à 5.5V).
PIC16LF84:
pour une gamme étendue de l'alimentation (2 à 6V).
STRUCTURE INTERNE
L'architecture
interne nous présente les principaux organes qui composent le
microcontrôleur.
Le but ici
n'est pas d'expliquer chaque organe (puisqu'un chapitre leur est consacré) mais
permet de visualiser l'ensemble pour mieux comprendre le fonctionnement du
monochip.
Cependant,
même si les opcodes sont codés sur 14 bits, les données et les
résultats sont et seront toujours sur 8 bits.
ORGANISATION DE LA
MEMOIRE
La mémoire
du PIC16F84 est divisée en deux parties distinctes:la mémoire programme et la
mémoire de donnée.
Le premier
contient les instructions du programme ainsi que les vecteurs RESET et
INTERRUPTION.
Dans la
mémoire de donnée se trouve tout les registres nécessaires pour la
configuration et l'utilisation des périphériques internes ainsi que 68 octets
de RAM utilisateurs.
LA
MEMOIRE PROGRAMME
Cette
mémoire de 1K stock le programme. l'emplacement de celui-ci peut être à
n'importe quel endroit de la mémoire. Cependant, il faut savoir que le PIC16F84
,suite à un RESET ou lorsqu'on l'alimente, commence toujours à l'adresse 0000H
(Vecteur RESET).
De plus,
lorsqu'il y a une interruption, et si celle-ci est validée,le microcontrôleur
va à l'adresse 0004H (Vecteur d'INTERRUPTION).
Par
conséquent, garder toujours à l'esprit ces deux adresses particulières de la
mémoire programme.
Voici un
exemple typique d'un programme où l'on utilise l'instruction GOTO et CALL pour
gérer les vecteurs:
ORG 0000
;Début de la
mémoire programme
GOTO
debut ;Là, on indique au microcontrôleur que le début du
programme se trouve à l'adresse debut
ORG
0004 ;Début de
l'adresse d'une l'interruption.
CALL
GESTIN ; S'il y a une interruption, le monochip ira appelle
le sous-programme GESTIN.
debut
bla bla ; début du
programme.
bla bla
LA
MEMOIRE RAM
La mémoire
de donnée est divisée en deux parties. Une partie appelée SFR est encore
divisée en deux pages (Bank0 et Bank 1). Toutes les données de la mémoire sont
appelées registres y compris les données utilisateurs.
LE SFR
(Special Function Registers).
Le SFR
permet de configurer tout les modules internes du PIC16F84 (les PORTS, le TIMER,
la gestion des interruptions, etc...). Il est de plus utilisé par le CPU.
Pour accéder
a l'un de ces registres, il faut d'abord se positionner sur la page (Bank)
appropriée. Ensuite, il suffit de lire ou d'écrire dans le registre nommé.
L'adressage directe
des pages se fait par deux bits du registre de STATUS (RP0 et RP1). On peut
utiliser l'adressage indirecte avec le registre FSR.
La figure
ci-dessous nous montre les différents registres du SFR ainsi que leur adresse
associée.
LE GPR (
General Purpose Register)
Le GPR est
en fait la RAM (8bits) utilisateurs. C'est ici que l'on stocke les variables et
les données. L'utilisation des pages (Bank ) n'est pas nécessaire puisque le
Bank 1 est "mapped" avec le Bank0. Cela signifie qu' écrire une
donnée à l'adresse 0CH ou à l'adresse 8CH revient au même.
Enfin,
l'adressage peut se faire de manière directe ou indirecte (en utilisant le
registre FSR).
PREREQUIS
Ces
registres spéciaux font partie du SFR (Special Function Registers) et
configurent le microcontroler: Certains registres initialisent les
périphériques alors que d'autres sont utilisés par le CPU.
Cette partie
décrit uniquement les bits du registre nommé. On donne ici, l'organisation de
la mémoire du PIC16F84:
LES DIFFERENTS REGISTRES
DU PIC16F84
LE REGISTRE
INDF (ADRESSE 00, 80H).
Voir le
registre FSR.
LE
REGISTRE FSR (ADRESSE 04,84H).
Le registre
INDF ainsi que FSR permettent l'adressage INDIRECTE.
Le principe
est d'utiliser deux registres intermédiaires pour accéder aux données:
Dans le
premier ,appelé FSR, on inscrit l'adresse (en fait, il est utilisé comme un
pointeur).
L'autre
registre (INDF), contient la valeur qui se trouve à l'adresse définie dans le
FSR.
exemple:
Admettons la
situation suivante:
ADRESSE
VALEUR
10
3
11
4
12
5
Si l'on veut
lire successivement les données se trouvant entre l'adresse 10 et 12, une des
premier méthode est de lire une après une les données.
L'autre
méthode, beaucoup plus souple, réalise la même fonction avec l'adressage
indirecte:
BOU
MOVLW
0X10
MOVWF FSR ; on
initialise le registre FSR avec l'adresse 10
MOVF INDF,W ; on retrouve dans W la
valeur 3
MOVF
VAR ;que l'on met dans VAR
INCF FSR
; on incrémente FSR et a pour
adresse maintenant la valeur 11
GOTO BOU
; et on retourne en BOU. Au prochain passage, VAR conteindra la valeur 4.
LE
REGISTRE TMRO (ADRESSE 01H).
Ce registre
de 8 bits s'incrémente de "1" a chaque impulsion de l'horloge
(externe ou interne). Il est associé au module TIMER/COMPTEUR.
LE
REGISTRE OPTION (ADRESSE 81H)
Le registre
d'OPTION contiens les bits de contrôles du PRESCALER, de l'interruption externe
INT, de la sélection TIMER/COMPTEUR et du "tirage au plus" du PORT B.
TABLEAU
bit 7 |
bit 6 |
bit 5 |
bit 4 |
bit 3 |
bit 2 |
bit 1 |
bit 0 |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
RBPU |
INTEDG |
TOCS |
TOSE |
PSA |
PS2 |
PS1 |
PS0 |
DESCRIPTION
DES BITS
BIT 0,1 et 2:
Sélectionnent le ratio du PRESCALER.
Ces trois
bits déterminent le ratio (effectue une division de la fréquence d'horloge) du
PRESCALER.
TABLEAU:
PS2 |
PS1 |
PS0 |
RATIO TMRO |
RATIO WDT |
0 |
0 |
0 |
1:2 |
1:1 |
0 |
0 |
1 |
1:4 |
1:2 |
0 |
1 |
0 |
1:8 |
1:4 |
0 |
1 |
1 |
1:16 |
1:8 |
1 |
0 |
0 |
1:32 |
1:16 |
1 |
0 |
1 |
1:64 |
1:32 |
1 |
1 |
0 |
1:128 |
1:64 |
1 |
1 |
1 |
1:256 |
1:128 |
BIT 3: PSA (
PreScaler Assignment).
Si PSA=1
alors le prescaler est associé avec le WDT.
Si PSA=0
alors le prescaler est associé avec le TIMER.
BIT 4: TOSE ( TMRO Source Edge).
Ce bit
détermine sur quel front ( montant ou descendant) l'entrée RA4 incrémentera le
registre TMRO
TOSE=1 Front
descendant.
TOSE=0 Front
montant.
BIT 5: TOCS ( TMRO Clock Source)
Il permet de
sélectionner le mode de fonctionnement du TIMER/COMPTEUR.
TOCS=1
sélection de l'horloge externe ( broche RA4) qui correspond au COMPTEUR.
TOCS=0
sélection de l'horloge interne et permet au module de travailler en mode TIMER.
BIT 6: INTEDG ( INTerrupt EDGe)
Si INTEDG=1
alors la broche RBO/INT génère une interruption sur un front montant.
Si INTEDG=0
alors la broche RBO/INT génère une interruption sur un front descendant.
BIT 7: RBPU ( PORT B Pull-Up).
RBPU=1 Le
"tirage au plus" interne du PORT B est desactivé.
RBPU=0 Le
"tirage au plus" interne du PORT B est activé.
LE
REGISTRE STATUS (ADRESSE 03 ET 83H)
Divisé en
plusieurs blocks, il contient:
Le résultat
d'un calcul de l'ALU représenté par les bits C, DC, et Z.
Le status d'un
RESET par l'intermédiaire des bits PD et TO.
L'accès aux
différents bancs de la mémoire par les bits IRP, RP1 et RP0
TABLEAU
bit 7 |
bit 6 |
bit 5 |
bit 4 |
bit 3 |
bit 2 |
bit 1 |
bit 0 |
R/W |
R/W |
R |
R |
R/W |
R/W |
R/W |
R/W |
IRP |
RP1 |
RP0 |
TO |
PD |
Z |
DC |
C |
DESCRIPTION
DES BITS
BIT0: C (Carry).
Il passe à
"1" lorsque le résultat d'une opération dépasse la valeur FF ou d'un
résultat négatif.
BIT1: DC (Digital Carry).
il se
positionne à "1" lorsque une retenue s'est produite entre les bit 3
et 4.
BIT2: Z (Zero).
quand il est
à "1", il indique que le résultat de l'opération est nul.
BIT3: PD (Power-Down).
PD=1 après
un Power-up ou suite à l'instruction CLRWDT.
PD=0 lorsque
l'instruction SLEEP est exécutée.
BIT4: TO (Time-Out).
il passe à
"1" après les instructions SLEEP et CLRWDT. Lorsque le WDT (chien de
garde) déborde, ce bit passe à "0".
BIT5 et 6:
RP0 et RP1 (bits de sélection de bancs).
Avec ces 2
bits, on accède aux différents bancs de la mémoire.
RP1 |
RP0 |
BANC |
ADRESSE |
0 |
0 |
0 |
00 à 7F |
0 |
1 |
1 |
80 à FF |
1 |
0 |
2 |
100 à 17F |
1 |
1 |
3 |
180 à 1FF |
BIT7: IRP.
Ce bit n'est
pas utilisé avec le PIC16F84 et doit rester à "0".
LE
REGISTRE TRISA (ADRESSE 85H).
Le registre
TRISA configure chaque E/S du PORTA en ENTREE ou en SORTIE. Apres un RESET,
toutes les E/S sont en ENTREE. Si le bit associé à la porte est à
"1", alors elle sera configurée en ENTREE. Si le bit est à
"0", elle sera en SORTIE.
La broche
RA4 est multipléxée avec l'entrée d'horloge du registre TMRO.
TABLEAU
bit 7 |
bit 6 |
bit 5 |
bit 4 |
bit 3 |
bit 2 |
bit 1 |
bit 0 |
|
|
|
R/W |
R/W |
R/W |
R/W |
R/W |
|
|
|
TRISA4 |
TRISA3 |
TRISA2 |
TRISA1 |
TRISA0 |
LE
REGISTRE PORTA (ADRESSE 05H).
Le PORTA est
un port de 5 bits (RA0 à RA4). chaque E/S est compatible TTL. La configuration
de chaque BIT du port est déterminée avec le registre TRISA.
TABLEAU
bit 7 |
bit 6 |
bit 5 |
bit 4 |
bit 3 |
bit 2 |
bit 1 |
bit 0 |
|
|
|
R/W |
R/W |
R/W |
R/W |
R/W |
|
|
|
RA4/TOCK |
RA3 |
RA2 |
RA1 |
RA0 |
LE
REGISTRE TRISB (ADRESSE 86H)
Le registre
TRISB configure chaque E/S du PORTB en ENTREE ou en SORTIE. Apres un RESET,
toutes les E/S sont en ENTREE. Si le bit associé à la porte est à
"1", alors elle sera configurée en ENTREE. Si le bit est à
"0", elle sera en SORTIE.
La broche
RB0 est multiplexée avec l'interruption INT.
les broches
RB4 à RB4, à condition qu'elles sont configurées en ENTREE, peuvent générer une
interruption lorsqu'elles changent d'états.
Enfin,
toutes les broches du PORTB bénéficient d'un "tirage au plus"
interne.
TABLEAU
bit 7 |
bit 6 |
bit 5 |
bit 4 |
bit 3 |
bit 2 |
bit 1 |
bit 0 |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
TRISB7 |
TRISB6 |
TRISB5 |
TRISB4 |
TRISB3 |
TRISB2 |
TRISB1 |
TRISB0 |
LE
REGISTRE PORTB (ADRESSE 06H).
Le PORTB est
un port bi-directionnel de 8 bits. Toutes les broches sont compatibles TTL. La
configuration du PORTB est réalisée avec le registre TRISB.
TABLEAU
bit 7 |
bit 6 |
bit 5 |
bit 4 |
bit 3 |
bit 2 |
bit 1 |
bit 0 |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
RB7 |
RB6 |
RB5 |
RB4 |
RB3 |
RB2 |
RB1 |
RB0 |
LE
REGISTRE EEDATA (ADRESSE 08H).
Ce registre
de 8 bits permet de lire ou d'écrire une donnée dans la mémoire non volatile
(EEPROM).
LE
REGISTRE EEADR (ADRESSE 09H).
Registre de
8 bits qui contient l'adresse de la donnée se trouvant dans l'EEPROM.
LE
REGISTRE EECON1 (ADRESSE 88H)
C'est un
registre de contrôle qui permet d'exécuter une lecture ou une écriture dans
l'EEPROM.
Seuls les 5
bits de poids faible sont utilisés.
TABLEAU
bit 7 |
bit 6 |
bit 5 |
bit 4 |
bit 3 |
bit 2 |
bit 1 |
bit 0 |
|
|
|
R/W |
R/W |
R/W |
W |
W |
|
|
|
EEIF |
WRERR |
WREN |
WR |
RD |
DESCRIPTION
DES BITS
BIT 0: RD
(ReaD EEPROM).
Lorsque ce
bit est mis à "1", il indique au microcontroler que l'on souhaite une
lecture de l'EEPROM.
Apres le
cycle de lecture, il est mis automatiquement à 0.
BIT 1: WR (WRite EEPROM).
Lorsque ce
bit est mis à "1", il indique au microcontroler que l'on souhaite une
écriture de l'EEPROM.
Apres le
cycle d'écriture, il est mis automatiquement à 0.
BIT 2: WREN (EEPROM WRite ENABLE).
C'est un bit
de confirmation d'écriture dans l'EEPROM. En effet, il ne suffit pas de définir
un cycle d'écriture uniquement avec le bit WR. Il faut impérativement valider
le bit WREN (WREN=1) pour autoriser une écriture.
BIT 3: WRERR (EEPROM WRite ERROR flag).
Ce drapeau
indique qu'une erreur c'est produite lors d'un cycle d'écriture dans l'EEPROM.
WRERR=1 une
opération d'écriture a échoué.
WRERR=0 le
cycle d'écriture c'est déroulé normalement.
BIT 4: EEIF ( EEPROM Interrupt
Flag).
EEIF est une
drapeau qui génère une interruption lorsqu'un cycle d'écriture c'est déroulé
normalement. Il doit être mis à 0 lors de la routine d'interruption.
EEIF=1
l'opération c'est déroulé correctement.
EEIF=0 soit
l'opération n'a pas commencé, soit n'est pas terminée.
LE
REGISTRE EECON2 (ADRESSE 89H).
Ce registre
de 8 bits est exclusivement utilisé pour les séquences d'écritures dans
l'EEPROM. Il n'a pas d'adresse physique et la lecture de ce registre retourne
une valeur nulle.
LE
REGISTRE INTCON (ADRESSE 0B et 8BH)
Le registre
INTCON contient tout les bits de validation de chaque source d'interruption
ainsi que leur drapeau (Flag).
Les drapeaux
doivent être mise à 0 après l'interruption.
TABLEAU
bit 7 |
bit 6 |
bit 5 |
bit 4 |
bit 3 |
bit 2 |
bit 1 |
bit 0 |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
GIE |
EEIE |
TOIE |
INTE |
RBIE |
TOIF |
INTF |
RBIF |
DESCRIPTION
DES BITS
BIT 0: RBIF (
RB port change Interrupt Flag).
C'est un
drapeau d'interruption qui indique un changement d'état du PORT B (RB4 à RB7).
RBIF=1 une
broche (RB4 à RB7) à changé d'état.
RBIF=0 pas
de changement d'état.
BIT 1: INTF
(INT interrupt Flag).
Drapeau
d'interruption de l'entrée RB0.
RBIF=1 une
interruption est apparue.
RBIF=0 pas
d'interruption.
BIT 2: TOIF ( TMRO Overflow Interrupt Flag).
Ce drapeau
indique un dépassement du registre TMRO (passage de FF à 00).
TOIF=1
dépassement de TMRO.
TOIF=0 pas
de dépassement.
BIT 3: RBIE
(RB Interrupt Enable).
Bit de
validation qui autorise une interruption lors d'un changement d'état du PORT B
(RB4 à RB7).
RBIE=1
Autorise l'interruption.
RBIE=0 Les
changement d'état du PORT B (RB4 à RB7) ne généront pas d'interruption.
BIT 4: INTE (
INT interrupt Enable).
Valide ou
non l'interruption généré par la broche RB0/INT
INTE=1
Valide l'interruption INT.
INTE=0 Pas
d'interruption provenant de INT.
BIT 5: TOIE (TMRO Overflow Interrupt Enable).
Autorise ou
non l'interruption provoqué par le dépassement du registre TMRO (passage de FF
à 00)
TOIE=1
Valide l'interruption.
TOIE=0 Pas
d'interruption provenant du registre TMRO.
BIT 6 : EEIE (EE write Interrupt Enable).
Ce bit
autorise ou non une interruption lorsqu'un cycle d'écriture dans L'EEPROM c'est
déroulé normalement.
EEIE=1
Génère une interruption lorsqu'une cycle d'écriture c'est déroulé normalement.
EEIE=0 Pas
d'interruption.
BIT 7: GIE
(Global Interrupt Enable).
Ce bit
autorise ou non toutes les interruptions.
GIE=1 Toutes
les interruptions sont prises en compte par le microcontroler.
GIE=0 Aucune
interruption ne sera validée.
LE
REGISTRE PCL (ADRESSE 02, 82H).
Le PC
(Program Counter) est un pointeur de 13 bits qui contient l'adresse de la
prochaine instruction a exécuter.
Il est
composé de deux registres:
le PCL:
C'est un registre de 8 bits accessible en écriture et en lecture et compose la
partie basse du PC.
Le PCLATH:
C'est un registre de 8 bits dont seuls les 5 bits de poids faible sont
utilisés. Non accessible directement, il définie la partie haute du PC. Il
permet d'une part, de sélectionner les différentes page de la mémoire programme
et d'autre part, son contenue est transféré lorsque le PC est chargé avec une
nouvelle valeur.
REMARQUE:
Le PIC16F84 n'a que 1 K de programme mémoire. Par conséquent, les bits 3 et 4
du PCLATH ne sont pas utilisés.
LE REGISTRE
PCLATH (ADRESSE 0A, 8AH).
Voir le
registre PCL.
LE PORTA ET B
les PORTS A
et B sont des ENTREE/SORTIE réalisant le dialogue entre le microcontroler et
son environnement extérieur. Le PI16F84 possède 13 entrées/sorties reparties
sur deux PORTS (A et B) de la manière suivante :
Le PORT
A est un bus de donnée bidirectionnel de 5 bits. Chaque bit peut être
configuré en ENTREE ou en SORTIE. Le niveau d’ENTREE/SORTIE est compatible TTL.
Le PORT B
est aussi un bus de donnée bidirectionnel, mais de 8 bits. Chaque bit peut être
configuré en ENTREE ou en SORTIE. Le niveau d’ENTREE/SORTIE est compatible TTL.
STRUCTURE
INTERNE DU PORT A
Le PORT A
est constitué de 5 bits. Les bits RA0 à RA3 ont un niveau d'entrée TTL et une
paire de transistors CMOS complémentaires en sortie.
Le bit RA4
est lui aussi compatible TTL en entrée mais sa sortie est en DRAIN OUVERT.
De plus,
configuré en ENTREE, il peut être utilisé pour l'incrémentation du compteur
interne TMRO.
C'est le
registre de direction TRISA qui détermine l'orientation de chaque broche du
port. Un "1" dans le registre TRISA positionne la broche associée en
ENTREE, alors qu'un "0" la met en SORTIE.
Après un
RESET, le PORTA est configuré en ENTREE.
Une lecture du PORTA lit
la valeur qui se trouve directement sur les broches, alors qu'une écriture
s'effectue en revanche en plusieurs étapes :
Lecture du
port - modification de la donnée lue - écriture dans les
bascules de donnée.
REGISTRE ASSOCIES.
ADR |
NOM |
BIT 7 |
BIT 6 |
BIT 5 |
BIT 4 |
BIT 3 |
BIT 2 |
BIT 1 |
BIT 0 |
05H |
PORTA |
|
|
|
RA4/TOCK |
RA3 |
RA2 |
RA1 |
RA0 |
85H |
TRISA |
|
|
|
TRISA4 |
TRISA3 |
TRISA2 |
TRISA1 |
TRISA0 |
STRUCTURE
INTERNE DU PORT B
C'est un
port bidirectionnel de 8bits (RB0 a RB7).
Chaque
broche est compatible TTL. L'orientation de chaque bit se fera avec le registre
de direction TRISB. On remarquera au passage l'utilisation d'un BUFFER
tri-states (3 états) pour l'étage de SORTIE. Celui-ci passe à l'état de HAUTE
IMPEDANCE lorsqu'une broche est configurée en ENTREE (un "1" dans le
registre TRISB).
Un tirage au
plus, "weak pull-up" (WPU), a été intégré sur chaque broche. Il
permet ainsi d'avoir un "1" logique lorsqu'une broche est en ENTREE
(évitant ainsi des composants externes supplémentaires). Le contrôle s'effectue
avec le bit RBPU du registre d'OPTION (actif à l'état bas). Si une broche
est configurée en SORTIE ou lors d'un POWER-ON-RESET (POR), l'étage WPU
sera alors automatiquement inhibé. Les 4 broches (RB4 à RB7) peuvent générer
une INTERRUPTION (uniquement si elles sont configurées en ENTREE). En regardant
la structure interne, on constate que les 2 verrous et la porte logique OU
EXCLUSIF forment un ensemble qui compare la dernière valeur lue et la valeur
présente sur la broche. S’il y a une différence (un changement d'état), la
sortie de la porte sera au niveau haut.
Pour effacer
l'interruption, on devra alors, dans la routine d'interruption, lire (écrire)
le port ou mettre à zéro le drapeau RBIF du registre INTCON. Cette interruption
peut être utilisée pour "réveiller" le PIC lorsqu'il est en mode
SLEEP.
La broche
RB0 peut elle aussi générer une INTERRUPTION (drapeau INTF du registre INTCON).
Comme pour le PORTA, une
lecture du port lit la valeur actuelle sur les broches. Tout au contraire, une
écriture passe par 3 étapes distinctes : lecture du port, modification de la
valeur lue, réécriture dans les verrous de donnée.
Cela peut poser problème
lorsqu'une broche est utilisée en ENTREE puis en SORTIE. On ne peut en effet
connaître son état dans la mesure où est inconnue la valeur qu'elle avait en
ENTREE.
REGISTRE ASSOCIES.
ADR |
NOM |
BIT 7 |
BIT 6 |
BIT 5 |
BIT 4 |
BIT 3 |
BIT 2 |
BIT 1 |
BIT 0 |
06H |
PORTB |
RB7 |
RB6 |
RB5 |
RB4 |
RB3 |
RB2 |
RB1 |
RB0/INT |
86H |
TRISB |
TRISB7 |
TRISB6 |
TRISB5 |
TRISB4 |
TRISB3 |
TRISB2 |
TRISB1 |
TRISB0 |
81H |
OPTION |
RBPU |
|
|
|
|
|
|
|
LE TIMER
Le
TIMER/COMPTEUR est une interface programmable, qui permet de réaliser une
large gamme d’applications : compteur d’impulsion, fréquencemètre,
générateur de fonction, etc… Bref, il convient pour tous les montages
nécessitant une base de temps de précision.
La
différence entre un TEMPORISATEUR (TIMER) et un COMPTEUR (COUNTER) réside dans
le choix de l’horloge qui l’incrémente. Si l’on opte pour une horloge externe,
on disposera alors d’un COMPTEUR. Dans ce cas, l’horloge sera synchronisée avec
l’horloge interne du microcontroler.
Si le choix
se porte sur l’horloge interne, l’interface se comportera comme un TIMER.
Le principe
est assez simple : il s’agit en effet d’incrémenter le registre TRMO de 1à
chaque impulsion d'horloge interne ou externe. Il est possible d’intercaler un
autre compteur (PRESCALER) afin de réaliser une division supplémentaire de la
fréquence de l’horloge.
La structure
interne nous présente les principaux organes qui composent un TIMER. A part le
registre TMR0, chacun d'eux est configuré avec un ou plusieurs BITS du registre
d'OPTION.
LE REGISTRE
TMR0
C'est un
registre 8 bits accessible en lecture ou en écriture. Il est incrémenté à
chaque cycle d'horloge de PSOUT.
Dans le cas
d'un dépassement (lorsque la valeur passe de FF à 00), le drapeau TOIF passe a
"1" et génère une interruption (s'il a été validé dans le registre
INTCON).
Il faut impérativement
remettre à "0" le bit TOIF après avoir traité l'interruption.
LE
DIVISEUR PROGRAMMABLE OU PRESCALER
C'est en
fait un compteur de 8 bits qui divise la fréquence PSIN par le ratio défini
avec les bits TS0, TS1, TS2 (voir le tableau récapitulatif pour les ratios).
Le prescaler est partagé
avec le WDT (WatchDog Timer). Par conséquent, il n'est pas possible d'utiliser
le diviseur simultanément avec le WDT et le TIMER/COMPTEUR. Si le PRESCALER est
indispensable aux deux, l'alternative est alors la seule solution.
C'est le bit
PSA qui détermine l'appartenance du prescaler. Avec un niveau bas
("0") sur PSA, le diviseur est associé au TIMER/COMPTEUR. Si PSA est
à "1", il appartient alors au WDT.
Toute écriture dans le
block du TIMER/COMPTEUR efface le contenu du prescaler.
SELECTION
DE L'HORLOGE
Le choix de
l'horloge interne ou externe définit le mode TIMER ou COMPTEUR. La mise à zéro
du bit TOCS sélectionne le TIMER et inhibe l'horloge externe.
Si TOCS est
à "1", le mode COMPTEUR est pris en compte. Dans ce cas de figure, un
autre bit, TOSE, définit le front sur lequel aura lieu l'acquisition ( TOSE=0
pour un front montant, TOSE=1 pour un front descendant).
Dans le cas du COMPTEUR,
l'horloge externe est synchronisée avec l'horloge interne. Il en résulte deux
conséquences à ne pas négliger:
Premièrement,
il y a un retard entre l'acquisition de l'horloge externe et l'incrémentation (
typiquement deux cycles d'horloge interne) du registre TMRO.
Deuxièmement,
pour que l'impulsion soit prise en compte, il faut absolument que la période de
l'horloge externe soit au minimum égale à 4 cycles d'horloge interne (sans
prescaler),ou à 4 cycles d'horloge interne/ N avec l'utilisation du prescaler (
N étant le ratio).
REGISTRE
ASSOCIES.
On indique
ici que les bits utilisés.
ADR |
NOM |
BIT 7 |
BIT 6 |
BIT 5 |
BIT 4 |
BIT 3 |
BIT 2 |
BIT 1 |
BIT 0 |
01H |
TMR0 |
|
|
|
|
|
|
|
|
0BH |
INTCON |
GIE |
|
TOIE |
|
|
TOIF |
|
|
81H |
OPTION |
|
|
TOCS |
TOSE |
PSA |
PS2 |
PS1 |
PS0 |
85H |
TRISA |
|
|
|
TRISA4 |
|
|
|
|
LE CHIEN DE GARDE
Le chien de
garde, "WATCHDOG TIMER" (WDT), permet d'assurer, de manière simple,
le bon déroulement d'un programme. Si le programme
" plante ", le WDT génère un RESET ou un autre événement
permettant, soit à l'utilisateur, soit au logiciel, de réagir en conséquence.
Le WDT du
PIC16F84 est composé d'un oscillateur interne à réseau RC indépendant et d'un
compteur 8bits. La période de l’oscillateur varie en fonction de la température
et de la tension d'alimentation (de 10ms à 60ms dans les cas extrêmes).
DEROULEMENT
A chaque
cycle d’horloge de l’oscillateur, le compteur s’incrémente de 1. A la fin du
comptage, c’est à dire lorsque le compteur passe de FF à 00, le WDT met le bit
TO (Time Out) du registre STATUS à 0. Si l’on souhaite augmenter le temps du chien
de garde, on peut utiliser le prescaler. C’est un autre compteur binaire
programmable qui est mis en série avec le compteur du WDT et permet ainsi
d’augmenter le temps (jusqu'à 2.3 secondes). Il est important de noter que le
prescaler est partagé avec le TIMER. Il n’est donc pas possible de les utiliser
simultanément.
Le WDT est
configurable uniquement lors de la programmation du microcontroler, c’est à
dire dans le "mot de configuration".
APPLICATION
Le
fonctionnement est assez simple : il suffit d'abord de le valider dans le
"mot de configuration" puis de sélectionner la période du WDT (avec
ou sans prescaler), et enfin d'effacer le registre WDT périodiquement (avec
l'instruction CLRWDT). Si le programme " plante ", il n'y a
plus de remise à 0 et le bit TO s'active. Dans le mode SLEEP, le programme
continue à l'instruction suivante. En revanche, en mode normal, cela génère un
RESET.
Les instructions CLRWDT
et SLEEP effacent les registres WDT et le prescaler.
LE
PRESCALER
C’est un
compteur binaire qui permet de diviser la fréquence de l’horloge. Suivant le
ratio défini par l’utilisateur, la division s’étend de 1 à 128.
REGISTRE
ASSOCIES.
On indique
ici que les bits utilisés.
ADR |
NOM |
BIT 7 |
BIT 6 |
BIT 5 |
BIT 4 |
BIT 3 |
BIT 2 |
BIT 1 |
BIT 0 |
2007H |
CONFIG |
|
|
|
|
|
WDTE |
|
|
81H |
OPTION |
|
|
|
|
PSA |
PS2 |
PS1 |
PS0 |
L’EEPROM
C'est une
mémoire qui permet de stocker jusqu'à 64 octets de données de façon non
volatile (les données restent en mémoire même en cas de coupure de
l'alimentation).
Les données
de cette EEPROM ne sont pas directement accessibles. Il faut alors utiliser
l'adressage indirect à travers 4 registres (EECON1, EECON2, EEDATA, EEADR) du registre
SFR (Registre de Fonction Spécial) :
- EEDATA
C'est un
registre de 8 bits utilisé pour lire ou écrire une donnée dans l'EEPROM. La
donnée de la mémoire EEPROM est envoyée dans ce registre et y est maintenue
jusqu'au prochain cycle de lecture ou d'écriture.
- EEADR
C'est un
registre de 8 bits qui définit l'adresse de l'octet à lire ou à écrire.
Logiquement, il peut adresser jusqu'à 256 octets, mais le PIC16F84 n'en possède
que 64. Aussi la valeur de EEADR sera-t-elle comprise entre 00h et 3Fh.
- EECON1
C'est un
registre de 8 bits dont seuls les 5 premiers, de poids faible, sont utilisés
(bit 0 à bit 4).
RD,
"READ", (bit 0) et WR, "WRITE", (bit 1) gèrent
respectivement la lecture et l'écriture de l'EEPROM. La sélection se fait par
la mise à "1" du bit. En fait, seule la mise à "1" est
possible. RD et WR sont automatiquement mis à "0" après la fin de
chaque cycle.
Le bit
WREN, "WRITE ENABLE", (bit 2) est un bit supplémentaire pour la
procédure d'écriture. Après la fin du cycle, il faut le mettre à 0.
Le bit
WRERR, "WRITE ERROR", (bit3) est un drapeau qui passe à l'état haut
lorsqu'il y a eu un problème d'écriture ( par exemple, à la suite d’un reset ou
d’un time-out du WDT). Dans ce cas, les données dans EEDATA et EEADR sont
conservées et il est donc possible de recommencer le cycle d'écriture sans
recharger les valeurs.
Enfin, le
bit EEIF, "EEprom Interupt Flag", (bit4) est aussi un drapeau qui, à
l'état haut, indique que l'opération d'écriture s'est déroulé normalement. Il
doit être mis à 0 à la fin de la procédure.
-EECON2
C'est un
registre de 8 bits particulier qui est réservé uniquement au cycle d'écriture.
REGISTRE
ASSOCIES.
On indique
ici que les bits utilisés.
ADR |
NOM |
BIT 7 |
BIT 6 |
BIT 5 |
BIT 4 |
BIT 3 |
BIT 2 |
BIT 1 |
BIT 0 |
08H |
EEDATA |
|
|
|
|
|
|
|
|
0BH |
INTCON |
GIE |
|
TOIE |
|
|
TOIF |
|
|
|
|
|
|
|
|
|
|
|
|
81H |
OPTION |
|
|
TOCS |
TOSE |
PSA |
PS2 |
PS1 |
PS0 |
LES INTERRUPTIONS
Le monochip
traite des informations provenant de son environnement extérieur. Une première
forme de saisie est la scrutation : le microcontroler va scruter son
environnement par l’intermédiaire des PORTS A et B. Ce principe est correct
tant que les informations sont présentes sur les ports. Ce procédé ne convient
plus dès lors qu’un événement externe non prévisible se produit : on
appelle une interruption cette deuxième manière de traiter des informations.
Une
interruption provoque l’arrêt du programme en cours pour permettre le passage
au sous-programme d’interruption. Après la fin de cette routine, le
microcontroler reprend le programme à l’endroit où il s’était arrêté. Comme une
interruption est un événement asynchrone, il faut alors sauvegarder le contexte
dans lequel se trouvait le microcontroler avant l’interruption, afin qu’il
puisse reprendre correctement la continuité du programme.
Le PIC16F84
possède 5 sources d'interruption : 3 externes (RB0, RB4 à RB7 du PORTB et
évidemment le RESET) et 2 internes (fin de cycle d'écriture de l'EEPROM et
dépassement du registre TMR0).
On ne
traitera pas ici du RESET, interruption particulière à laquelle un chapitre
spécifique est consacré.
Chaque
source d'interruption est constituée d'un drapeau et d'un bit de validation. Le
premier mémorise l'événement, tandis que le deuxième, comme son nom l'indique,
valide ou non la prise en compte de l'événement.
Un bit
appelé GIE (Global Inerrupt Enable) du registre INTCON autorise ou inhibe
toutes les interruptions.
DEROULEMENT
D'UNE INTERRUPTION
Lorsqu'un
événement apparaît, le drapeau associé le mémorise en passant à l'état haut. Si
le bit de validation approprié est à "1", il y a alors une interruption
(on suppose que le bit GIE est à "1"). L'adresse contenue dans le PC
(Program Counter) est d'abord chargée dans le STACK, puis remplacée par la
valeur 0004H (adresse de la routine d'interruption). Le bit GIE passe à
"0" pour inhiber toutes les interruptions qui seraient simultanément
présentes. A la fin de la routine (instruction RETFIE), le bit GIE passe à
l'état haut (autorisant ainsi un autre événement) et le contenu du PC est
chargé avec la valeur du STACK.
deux remarques importantes
sont à faire :
Le drapeau
reste à l’état haut même après le traitement de l’interruption. Par conséquent,
il faut toujours le remettre à "0" dans la routine.
Seul le PC est
sauvegardé. Si cela est nécessaire, les registres W et STATUS doivent alors
être sauvegardés en RAM puis restaurés à la fin de la routine pour que le
microcontroler puisse reprendre normalement le cours du programme.
LES
DIFFERENTES SOURCES D'INTERRUPTION
RBO DU
PORTB
Cette
interruption appelée INT est gérée par les bits INTF et INTE qui sont
respectivement le drapeau et le bit de validation.
Un bit
supplémentaire appelé INTEDG du registre d'option détermine le front, montant
(INTEDG=1) ou descendant (INTEDG=0), sur lequel sera déclenchée l'interruption.
RB4 A
RB7 DU PORTB
Lorsque ces
4 broches (ou l'une d'elle) sont configurées en ENTREE, elles entraînent une
interruption quand elles changent d'état. Les bits associés sont RBIF (drapeau)
et RBIE (bit de validation).
TMR0
Quand le
registre TMR0 passe de FFH à 00H (dépassement), le drapeau TOIF s'active.
L’interruption est validée par le bit TOIE.
EEPROM
Après chaque
cycle correct d'écriture, le drapeau EEIF (dans le registre EECON1) passe à
"1". Le bit de validation EEIE se trouve dans le registre INTCON.
LA CONFIGURATION DE
L’OSCILLATTEUR.
L'oscillateur
définit la vitesse d'exécution des instructions. Pour des raisons de
synchronisation, la fréquence interne de travail est celle de l’oscillateur
externe divisé par 4. Par exemple, avec un quartz de 4 MHz, le cycle
d'instruction sera d'une microseconde.
Le PIC16F84
peut fonctionner dans 4 configurations d’oscillateurs différents :
- LP (Low Power) : Avec une fréquence max de 200 KHz, il permet de réduire la
consommation du microcontroler.
- XT: C'est le mode d'utilisation le plus utilisé. Sa fréquence de travail peut
aller jusqu'à 4 MHZ max.
- HS (High Speed): C'est un mode de configuration pour l'utilisation de
fréquence très haute ( jusqu'à 10 MHZ).
-RC: Dans ce mode, c'est un réseau Résistance/Condensateur qui réalise l’oscillateur.
Il est tout à fait
possible d'utiliser un oscillateur externe. Dans ce cas, la liaison se fait sur
l'entrée CKIN.
Le mode de fonctionnement de l'oscillateur se configure lors de la
programmation du monochip dans le "mot de configuration".
EXEMPLE
D'APPLICATION EN MODE LP,XT ET HS.
Généralement,
les valeurs de C1 et C2 sont comprises entre 20 et 30pF.
EXEMPLE
D'APPLICATION EN MODE RC.
La fréquence
de l'oscillateur dépend essentiellement des conditions d'utilisation (tension
d'alimentation, température de fonctionnement, etc...) du microcontroler.
La fréquence d'horloge interne est disponible sur CKOUT (ceci est
uniquement valable pour le mode RC).
Une valeur
de la résistance comprise entre 3K et 100K est recommandée. En effet, une
valeur trop petite amortirait le signal (arrêt de l’oscillateur). A l'inverse,
une valeur trop grande rendrait l’oscillateur trop sensible aux bruits
(instabilité de la fréquence).
Cext n'a pas
de restriction. Cependant, une valeur comprise entre 20pF et 300 pF est
admise.
Il est
intéressant de noter qu’il est possible d'utiliser le mode RC sans Condensateur
externe. En effet, l'entrée CKIN a une capacité interne de 4 pF typique.
LE RESET
Le RESET est
une interruption particulière qui initialise le microcontroler. Le PC (Program Counter)
est dans ce cas chargé avec l'adresse 0000H (début du programme).
Un RESET est
généré d'une manière soit matérielle, soit logicielle.
Comme le
montre le schéma, il existe cinq sources qui générent un RESET a savoir:
Le MCLR
(Master CLeaR) assure un RESET général du microcontroler quel que soit le mode
de fonctionnement du PIC16F84 (normal ou SLEEP). Actif à l'état bas et
prioritaire, il est le seul qui peut être provoqué de l'extérieur (broche 4).
le WDT est
un cas particulier. En mode normal, il génère un RESET ; en mode SLEEP, il
réveille le microcontroler (le programme continue à l'instruction suivante). 2
bits particuliers TO et PD du registre de STATUS indiquent la source du
déclenchement et permettent donc de réagir en fonction.
Le POR
(Power On Reset) qui n'est actif uniquement lors de la mise sous tension du
microcontroler. Il évite ainsi le rajout de composant externe (réseau RC) et
assure une bonne initialisation.
L' OST (
Oscillator Start-up Timer) s'assure que l'oscillateur du microcontroler est
stable.
Le PWRT
(PoWeR up Timer) est composé d'un oscillateur interne RC et d'un compteur. Il
maintient un RESET pendant 72 ms environ ( la durée dépend essentiellement de
la tension et de la température de fonctionnement).
CHRONOLOGIE
D'UN RESET.
Plusieurs
modules sont associés ensemble et permettent donc de réaliser une RAZ de bonne
qualité avec peu de composants externes.
Voici un
chronogramme d'un RESET classique:
DC copyright 2000
CONSIDERATIONS
Certaines applications
(télécommande, clavier, ect...) fonctionnent avec une alimentation à pile pour
être transportable. Dans ce cas, outre la programmation, le choix d'un
microcontroler se fera sur sa consommation.
A noter que
celle-ci dépend essentiellement de l'alimentation et de la fréquence de
travail. Par exemple, avec une tension de 5V et une fréquence de 10 MHz, le
microcontroler absorbe un courant moyen de 10mA.
Pour faire
face à ce problème d'énergie, le PIC16F84 possède un mode de fonctionnement
particulier : le mode SLEEP. Dans ce mode, le courant peut chuter jusqu'à 26
microAmpere.
LE MODE SLEEP
En exécutant
l'instruction SLEEP, le microcontroler passe à un état statique. En fait,
l'oscillateur externe est arrêté. Le PC contient l'adresse de l'instruction
suivante. Le WDT est mis à "0" (s'il est validé). Le bit PD passe à
l'état bas et TO à l'état haut. Enfin, les PORTS conservent l’état dans lequel
ils étaient avant l'instruction SLEEP.
Pour diminuer davantage la
consommation, les E/S des ports doivent être reliées à l'alimentation (VDD ou
VSS) et/ou aucun circuit extérieur ne doit drainer le courant provenant
de ces derniers.
LE "REVEIL" DU
MICROCONTROLER
Le
"réveil" consiste tout simplement à démarrer l'oscillateur. Une fois
le régime établi, le programme continue.
Lorsqu'il
est dans le mode SLEEP, seules 5 sources peuvent relancer le PIC16C84 (MCLR,
WDT, Interruption de fin de cycle d'écriture de l'EEPROM, l'Interruption RB0 et
l'Interruption de changement d'état RB4 à RB7).
Le MCLR
réalise un RESET général, ce qui permet au microcontroler de démarre à
l'adresse 0000H (début du programme).
Lorsque le
registre WDT est activé, il "réveille" le PIC16C84 quand le Time Out
(TO) est à "1" (dépassement du registre WDT). Le microcontroler
poursuit alors le programme.
Si les
interruptions sont validées, le programme exécute alors l'instruction qui suit
l'instruction SLEEP. Ensuite, suivant l'état du GIE, le microcontroler continue
le programme (GIE=0), ou traite la routine d'interruption (GIE=1).
REMARQUE: Si
une interruption intervient avant l'instruction SLEEP, celle-ci est alors
exécutée comme une opération NOP (No Operation) et le WDT n'est pas effacé.
LE
LANGAGE ASSEMBLEUR
Le langage
assembleur est une interface entre l’homme et le microcontroler pour la
compréhension d’un programme.
En effet, il
est difficile pour l’homme d’écrire ou de comprendre une représentation binaire
d’une suite d’instructions. Quant au microcontroler, il ne reconnaît qu’une
suite de 0 et de 1 (langage binaire).
Pour une
représentation plus explicite d’un langage binaire, on utilise le langage
assembleur où les instructions sont représentées par leur mnémonique
(abréviation anglaise d’une instruction) et les données binaires sont écrites
en hexadécimal (base 15), décimal (base 10), octal (base 8) ou encore binaire
(base 2).
Outre les
mnémoniques, le langage assembleur contient également des directives : ce
sont des instructions qui donnent à l’assembleur des consignes lors de la
compilation du programme, comme l’origine du programme, la réservation de
données, etc…
L’assembleur
convertit alors ces instructions en code binaire assimilable par le monochip.
Enfin, on
peut noter au passage qu‘il existe des assembleurs s‘exécutant sur différentes
plate-formes (DOS, WINDOWS) avec une multitude de langages de programmation
(programmation en BASIC, en C, en langage mnémonique, ect…).
LE FICHIER SOURCE, LIST,
OBJET ET HEXADECIMAL
Un fichier
source contient le programme écrit dans un langage compréhensible pour l’homme.
Edité sous le format ASCII, il décrit sous une forme le plus souvent mnémonique
les instructions que doit exécuter le microcontroler. Un simple traitement de texte
suffit donc pour élaborer le programme (avec notepad par exemple).
Le fichier
source est divisé en 3 colonnes principales :
Dans la
colonne de gauche sont inscrites les étiquettes (ou label) qui permettent de
nommer une variable ou de définir un emplacement dans la mémoire programme
(utilisé notamment pour les sous-programmes et les boucles).
La colonne
du milieu décrit l’instruction (ou mnémonique) que devra exécuter le
microcontroler.
Enfin, la
colonne de droite permet au développer d’écrire des commentaires susceptibles
de rendre le programme plus lisible.
Généralement
l’extension du fichier est *.ASM.
L’assembleur
traduit le fichier source en différents fichiers au choix du concepteur :
Fichier
LIST : l’assembleur transcrit le fichier source en un fichier comportant
le code machine à gauche et le fichier source à droite. Ce type de fichier est
utilisé notamment pour la simulation logiciel.
L’extension
d’un fichier LIST est *.LST.
Fichier
objet : l’assembleur convertit un fichier source en un fichier OBJET.
Chaque fichier OBJET est une portion de programme et peut être lié aux autres.
L’assembleur compile alors les fichiers OBJET pour former le programme.
L’extension
est *.OBJ.
Fichier
HEXDECIMAL : Le fichier hexadécimal est le seul fichier adapté au
microcontroler. Il contient le code machine et permet de programmer le monochip
avec l’outil de programmation adéquat.
L’extension
par défaut est *.HEX.
LE JEU D’INSTRUCTION DU
PIC16F84
Un
microcontroler est caractérisé non seulement par sa structure matérielle mais
aussi par son jeu d’instructions qui permet de traiter les données.
Le PIC16F84
a un jeu d’instructions relativement limité mais possède une architecture
interne (RISC) qui permet une programmation efficace et rapide (toutes les
instructions, exceptées les sauts, s'exécute en un cycle d'horloge).
De plus, le
monochip utilise 3 modes d’adressage différents (manière d’accéder à une
donnée) : direct, indirect et relatif pour les instructions de
branchement.
Les bits du
status affectés sont indiqués sur un fond rouge.
instructions liées aux
variables |
ADDLW |
ANDLW |
IORLW |
MOVLW |
RETLW |
SUBLW |
XORLW |
|
instructions liées aux
données |
ADDWF |
ANDWF |
CLRF |
COMF |
DECF |
DECFSZ |
INCF |
INCFSZ |
|
IORWF |
MOVF |
MOVWF |
NOP |
RLF |
RRF |
SUBWF |
XORWF |
instructions liées aux
bits |
BCF |
BSF |
BTFSC |
BTFSS |
|
|
|
|
autres instructions |
SWAPF |
CALL |
GOTO |
RETFIE |
RETURN |
CLRWDT |
SLEEP |
|
LES
INSTRUCTIONS OPERANT AVEC LES VARIABLES
MNEMONIQUE
ADDLW
SYNTAX
ADDLW
K ; K compris entre 0 et 255
DESCRIPTION
Additionne
le contenu du registre W avec la valeur K. le résultat se trouve dans le
registre W.
EXEMPLE
ADDLW
0X30 ; ajoute au registre W la valeur hexadécimale 30
LES BITS
DU STATUS AFFECTES
C |
Z |
DC |
MNEMONIQUE
ANDLW
SYNTAX
ANDLW
K ; K compris entre 0 et 255
DESCRIPTION
Réalise un
ET logique entre la valeur du registre W et la valeur littéral K. le résultat
se trouve dans le registre W.
EXEMPLE
ANDLW
0X30 ; ET logique entre la valeur du registre W et 0X30.
LES BITS
DU STATUS AFFECTES
C |
Z |
DC |
MNEMONIQUE
IORLW
SYNTAX
IORLW
K ; K compris entre 0 et 255
DESCRIPTION
Réalise un
OU logique entre la valeur du registre W et la valeur littéral. Le résultat se
trouve dans le registre W.
EXEMPLE
IORLW
0X30 ; OU logique entre le registre W et 0X30.
LES BITS
DU STATUS AFFECTES
C |
Z |
DC |
MNEMONIQUE
MOVLW
SYNTAX
MOVLW
K ; K compris entre 0 et 255.
DESCRIPTION
Charge le
registre W avec la valeur littéral K.
EXEMPLE
MOVLW
0X30 ; la valeur du registre W est maintenant égale à
30
MNEMONIQUE
RETLW
SYNTAX
RETLW
K ; K compris entre 0 et 255.
DESCRIPTION
Instruction
utilisée lors d’un retour d’un sous-programme. Le registre W est chargé avec la
valeur littérale K et le PC avec la valeur de l’adresse de retour (STACK).
EXEMPLE
CALL
LAS-BAS ; appelle le sous programme LAS-BAS.
.
.
; autres instructions.
.
.
LAS-BAS
RETLW 0X30 ; le registre W est chargé avec la valeur 30 et retour au
; programme principal.
MNEMONIQUE
SUBLW
SYNTAX
SUBLW
K ; K compris entre 0 et 255.
DESCRIPTION
Soustrait la
valeur littérale K au registre W. le résultat se trouve dans le registre W.
EXEMPLE
SUBLW
0X30 ; soustrait la valeur 30 au registre W.
LES BITS
DU STATUS AFFECTES
C |
Z |
DC |
MNEMONIQUE
XORLW
SYNTAX
XORLW
K ; K compris entre 0 et 255.
DESCRIPTION
Effectue un
OU EXCLUSIF entre le registre W et la valeur littéral K. le résultat se trouve
dans le registre W.
EXEMPLE
XORLW
0X30 ; OU EXCLUSIF entre le registre W et la valeur 30.
LES BITS
DU STATUS AFFECTES
C |
Z |
D |
LES
INSTRUCTIONS OPERANT SUR LES DONNEES
MNEMONIQUE
ADDWF
SYNTAX
ADDWF
F,DIR ; F compris entre 0 et 127. DIR=0 ou 1.
DESCRIPTION
Additionne
le contenu du registre W avec la valeur contenue dans le registre fichier F. si
DIR=0, alors le résultat sera dans le registre W. si DIR=1, le résultat est
stocké dans le registre F.
EXEMPLE
MOVLW
0X30 ; stocke la valeur 30 dans W
MOVWF
VAL ; stocke la valeur dans VAL
ADDWF
VAL ,0 ; additionne le registre W et F. le résultat (0X60) est stocké dans
W.
LES BITS
DU STATUS AFFECTES
C |
Z |
DC |
MNEMONIQUE
ANDWF
SYNTAX
ANDWF
F,DIR ; F compris entre 0 et 127. DIR=0 ou 1.
DESCRIPTION
Réalise un
ET logique entre le contenu du registre W et la valeur contenue dans le
registre fichier F. si DIR=0, alors le résultat sera dans le registre W. si
DIR=1, le résultat est stocké dans le registre F.
EXEMPLE
MOVLW
0X30 ; stocke la valeur 30 dans W
MOVWF
VAL ; stocke la valeur dans VAL
ANDWF
VAL ,0 ; effectue un Et entre le registre W et F. le résultat est stocké
dans W.
LES BITS
DU STATUS AFFECTES
C |
Z |
DC |
MNEMONIQUE
CLRF
SYNTAX
CLRF
F ; F compris entre 0 et 127.
DESCRIPTION
Le contenu
du registre F est effacé.
EXEMPLE
CLRF
VAL ; efface le contenu de VAL
LES BITS
DU STATUS AFFECTES
C |
Z |
DC |
MNEMONIQUE
COMF
SYNTAX
COMF
F,DIR ; F compris entre 0 et 127. DIR=0 ou 1.
DESCRIPTION
Effectue le
complément a 2 du registre fichier F. si DIR=0, le résultat sera alors dans le
registre W. si DIR=1, le résultat est stocké dans le registre F.
EXEMPLE
COMF
VAL ,0 ; complément à 2 de VAL. le résultat est
stocké dans W.
LES BITS
DU STATUS AFFECTES
C |
Z |
DC |
MNEMONIQUE
DECF
SYNTAX
DECF
F,DIR ; F compris entre 0 et 127. DIR=0 ou 1.
DESCRIPTION
la valeur
contenue dans le registre fichier F est décrémenté de 1. si DIR=0, le résultat
sera alors dans le registre W. si DIR=1, le résultat est stocké dans le
registre F.
EXEMPLE
DECF
VAL ,0 ; décrémente le registre VAL. le résultat
est stocké dans W.
LES BITS
DU STATUS AFFECTES
C |
Z |
DC |
MNEMONIQUE
DECFSZ
SYNTAX
DECFSZ
F,DIR ; F compris entre 0 et 127. DIR=0 ou 1.
DESCRIPTION
la valeur
contenue dans le registre fichier F est décrémentée de 1. si DIR=0, alors le
résultat sera dans le registre W. si DIR=1, le résultat est stocké dans le
registre F. si le résultat est nul, alors l’instruction suivante est sautée.
EXEMPLE
MOVLW
0X1 ; stocke la valeur 30 dans W
MOVWF
VAL ; stocke la valeur dans VAL
DECFSZ
VAL ,0 ; décrémente F. le résultat est stocké dans W. comme le résultat
est nul alors
ICI NOP
NOICI NOP ;
le programme saute à l’adresse NOICI.
MNEMONIQUE
INCF
SYNTAX
INCF
F,DIR ; F compris entre 0 et 127. DIR=0 ou 1.
DESCRIPTION
la valeur
contenue dans le registre fichier F est incrémentée de 1. si DIR=0, le résultat
sera alors dans le registre W. si DIR=1, le résultat est stocké dans le
registre F.
EXEMPLE
INCF
VAL ,0 ; incrémente le registre F. le résultat est stocké dans W.
LES BITS
DU STATUS AFFECTES
C |
Z |
DC |
MNEMONIQUE
INCFSZ
SYNTAX
INCFSZ
F,DIR ; F compris entre 0 et 127. DIR=0 ou 1.
DESCRIPTION
la valeur
contenue dans le registre fichier F est incrémentée de 1. si DIR=0, alors le
résultat sera dans le registre W. si DIR=1, le résultat est stocké dans le
registre F. si le résultat est nul, l’instruction suivante est alors sautée.
EXEMPLE
MOVLW
0XFF ; stocke la valeur 30 dans W
MOVWF
VAL ; stocke la valeur dans VAL
INCFSZ
VAL ,0 ; décrémente F. le résultat est stocké dans W.
comme le résultat est nul alors
ICI
NOP
NOICI
NOP ; le programme saute à
l’adresse NOICI.
MNEMONIQUE
IORWF
SYNTAX
IORWF
F,DIR ; F compris entre 0 et 127. DIR=0 ou 1.
DESCRIPTION
REALISE UN
OU logique entre le contenu du registre W et la valeur contenue dans le
registre fichier F. si DIR=0, le résultat sera alors dans le registre W. si
DIR=1, le résultat est stocké dans le registre F.
EXEMPLE
MOVLW
0X30 ; stocke la valeur 30 dans W
MOVWF
VAL ; stocke la valeur dans VAL
IORWF
VAL ,0 ; OU logique entre le registre W et F. le
résultat est stocké dans W.
LES BITS
DU STATUS AFFECTES
C |
Z |
DC |
MNEMONIQUE
MOVF
SYNTAX
MOVF
F,DIR ; F compris entre 0 et 127. DIR=0 ou 1.
DESCRIPTION
le contenu
du registre F est déplacé dans le registre de destination. si DIR=0, il sera
alors dans le registre W. si DIR=1, le résultat est stocké dans le registre F.
EXEMPLE
MOVLW
0X30 ; stocke la valeur 30 dans W
MOVWF
VAL ; stocke la valeur dans VAL
MOVF
VAL ,0 ; déplace le registre F vers W. le résultat
est stocké dans W.
LES BITS
DU STATUS AFFECTES
C |
Z |
DC |
MNEMONIQUE
MOVWF
SYNTAX
MOVWF
F ; F compris entre 0 et 127.
DESCRIPTION
Déplace le
contenu du registre W dans le registre fichier F.
EXEMPLE
MOVLW
0X30 ; stocke la valeur 30 dans W
MOVWF
VAL ; stocke la valeur dans VAL
MNEMONIQUE
NOP
SYNTAX
NOP
DESCRIPTION
Effectue
aucune opération ( NO Operation). Utilisé dans des boucles de temporisation.
EXEMPLE
NOP
MNEMONIQUE
RLF
SYNTAX
RLF
F,DIR ; F compris entre 0 et 127. DIR=0 ou 1.
DESCRIPTION
Le contenu
dans le registre fichier F est décalé de 1 bit vers la gauche. Le bit qui
s’intercale est le reflet du drapeau de retenue. si DIR=0, le résultat sera
alors dans le registre W. si DIR=1, le résultat est stocké dans le registre F.
EXEMPLE
MOVLW 00 ;
stocke la valeur 00 dans W
MOVWF VAL ;
stocke la valeur dans VAL
RLF VAL,0 ;
effectue une rotation du registre F. le résultat est stocké dans W. si le
drapeau de retenue est à 1, alors on aura dans W la valeur 01.
LES BITS
DU STATUS AFFECTES
C |
Z |
DC |
MNEMONIQUE
RRF
SYNTAX
RRF
F,DIR ;F compris entre 0 et 127. DIR=0 ou 1.
DESCRIPTION
Le contenu
dans le registre fichier F est décalé de 1 bit vers la droite. Le bit qui
s’intercale est le reflet du drapeau de retenue. si DIR=0, le résultat sera
alors dans le registre W. si DIR=1, le résultat est stocké dans le registre F.
EXEMPLE
MOVLW
00 ; stocke la valeur 00 dans W
MOVWF
VAL ; stocke la valeur dans VAL
RLF
VAL,0 ; effectue une rotation du registre F. le
résultat est stocké dans W. si le drapeau de retenue est à 1, on aura alors
dans W la valeur 01.
LES BITS
DU STATUS AFFECTES
C |
Z |
DC |
MNEMONIQUE
SUBWF
SYNTAX
SUBWF
F,DIR ;F compris entre 0 et 127. DIR=0 ou 1.
DESCRIPTION
si DIR=0, le
résultat sera alors dans le registre W. si DIR=1, le résultat est stocké dans le
registre F.
EXEMPLE
MOVLW
00 ; stocke la valeur 00 dans W
MOVWF
VAL ; stocke la valeur dans VAL
SUBWF
VAL,0 ; effectue une soustraction entre W et F. le
résultat est stocké dans W.
LES BITS
DU STATUS AFFECTES
C |
Z |
DC |
MNEMONIQUE
XORWF
SYNTAX
XORWF
F,DIR ;F compris entre 0 et 127. DIR=0 ou 1.
DESCRIPTION
Effectue un
OU exclusif entre le registre W et le registre F. Si DIR=0, le résultat
sera alors dans le registre W. si DIR=1, le résultat est stocké dans le
registre F.
EXEMPLE
MOVLW
00 ; stocke la valeur 00 dans W
MOVWF
VAL ; stocke la valeur dans VAL
XORWF
VAL,0 ; Réalise un OU exclusif. Le résultat est stocké
dans W.
LES BITS
DU STATUS AFFECTES
C |
Z |
DC |
LES INSTRUCTIONS OPERANT
SUR LES BITS
MNEMONIQUE
BCF
SYNTAX
BCF
F,DIR ;F compris entre 0 et 127. DIR compris entre 0 et
7.
DESCRIPTION
Met à zéro
le bit DIR du registre F.
EXEMPLE
BCF
VAL,3 ; Le bit 3 du registre F est à zéro.
MNEMONIQUE
BSF
SYNTAX
BSF
F,DIR ;F compris entre 0 et 127. DIR compris entre 0 et
7.
DESCRIPTION
Met à
"1" le bit DIR du registre F.
EXEMPLE
BSF
VAL,3 ; Le bit 3 du registre F est à
"1".
MNEMONIQUE
BTFSC
SYNTAX
BTFSC
F,DIR ;F compris entre 0 et 127. DIR compris entre 0 et
7.
DESCRIPTION
Si le bit
DIR du registre F est à zéro, alors la prochaine instruction est
"sautée".
EXEMPLE
BTFSC
VAL,3 ; Test le bit 3 du registre F.
ICI
NOP ; Si le bit est à "0"
alors cette instruction ne sera pas executée et passera directement à LA.
LA
NOP ;
MNEMONIQUE
BTFSS
SYNTAX
BTFSS
F,DIR ;F compris entre 0 et 127. DIR compris entre 0 et
7.
DESCRIPTION
Si le bit
DIR du registre F est à "1", alors la prochaine instruction est
"sautée".
EXEMPLE
BTFSS
VAL,3 ; Test le bit 3 du registre F.
ICI
NOP ; Si le bit est à "1"
alors cette instruction ne sera pas executée et passera directement à LA.
LA
NOP ;
LES AUTRES INSTRUCTIONS
MNEMONIQUE
SWAPF
SYNTAX
SWAPF
F,DIR ;F compris entre 0 et 127. DIR=0 ou 1.
DESCRIPTION
Effectue une
inversion des deux quartets du registre F. Si DIR=0 alors le résultat sera dans
le registre W. Si DIR=1, le résultat est stocké dans F
EXEMPLE
MOVLW
0X0F
MOVWF
VAL ; VAL=0F
SWAPF
VAL,1 ;VAL=F0
MNEMONIQUE
CALL
SYNTAX
CALL
K ; K est un label.
DESCRIPTION
Appelle le
sous- programme k. Le PC est chargé avec l'adresse du label. L'adresse de
retour (PC+1) est stockée dans le STACK.
MNEMONIQUE
GOTO
SYNTAX
GOTO
K ; K est un label.
DESCRIPTION
Le programme
saute à l'adresse K.
MNEMONIQUE
RETFIE
SYNTAX
RETFIE
DESCRIPTION
Fin d'une
routine d'interruption. le PC est charge avec l'adresse contenue dans le STACK
MNEMONIQUE
RETURN
SYNTAX
RETURN
DESCRIPTION
Fin d'un
sous- programme. Le PC est chagé avec l'adresse contenue dans le STACK.
MNEMONIQUE
CLRWDT
SYNTAX
CLRWDT
DESCRIPTION
Efface le
WDT et le prescaler. Les bits TO et PD sont mis à "1".
MNEMONIQUE
SLEEP
SYNTAX
SLEEP
DESCRIPTION
Le
microcontroler est en mode SLEPP. l'oscillateur est arrêté. le bit TO est à
"1". Le bit PD est à "0". Le WDT et le prescaler sont
effacés.
L'
UTILISATION
L'adressage
indirecte permet d'acceder à plusieurs données sans spécifier leur adresse
effective. L'interet est de permettre l'acces à des variables consecutives avec
un minimum d'instructions.
LE PRINCIPE
On utilise
les deux registres INDF et FSR du PIC. L'un contient l'adresse (FSR) et l'autre
la valeur de la variable (INDF). Lire ou écrire dans INDF revient à lire ou
écrire dans la variable.
EXEMPLE
Dans cet
exemple, il faut initialiser 20 variables avec la valeur CD (hex).
; Déclaration des variables
ORG H'0C'
VAR RES 20 ;Les 20 variables
COMPT RES 1 ;une variable de comptage
;programme principal
ORG 0
GOTO DEBUT
; vecteur interruption
ORG 4
REFIE
;Le programme
DEBUT MOVLW 0X0C ;W=0C début de la RAM.
MOVWF FSR ;FSR=0C Adresse de la RAM dans le FSR.
MOVLW .20
MOVWF COMPT ;La variable COMPT contient 20.
MOVLW 0XCD ;La variable a écrire dans la RAM.
LOOP MOVWF INDF ;On écrit 0C à l'adresse de FSR.
INCF FSR ;Maintenant, FSR pointe l'adresse suivante.
DECFSZ COMPT,F ; et on le fait 20 fois.
GOTO LOOP
END
un exemple
qui montre comment mémoriser des octets provenant d'une transmission série.
; Déclaration des variables
ORG H'0C'
VARRX RES 8 ;Les 8 variables
COMPT RES 1 ;une variable de comptage
;programme principal
ORG 0
GOTO DEBUT
; vecteur interruption
ORG 4
REFIE
;Le programme
DEBUT MOVLW 0X0C
MOVWF FSR ;FSR=0C Adresse de la RAM dans le FSR.
MOVLW 0X08
MOVWF COMPT
LOOP CALL RX ;Ce sous-programme renvoie dans W l'octet recue
MOVWF INDF ;On l'écrit à l'adresse de FSR.
INCF FSR ;Maintenant, FSR pointe l'adresse suivante.
DECFSZ COMPT,F ; et on le fait 8 fois.
GOTO LOOP
END
L'
UTILISATION
Le module
TIMER/COMPTEUR permet soit de réaliser une base de temps de précision, soit de
compter les implusions provenant de l'entrée RA0.
On peut
associer au module le prescaler (diviseur).
LE PRINCIPE
La
programmation de ce module TIMER/COMPTEUR est assez simple. Par contre sa
gestion peut etre délicate :
- soit on
lit le registre TMR0 : dans ce cas une lecture périodique du registre est
obligatoire.
- soit on
passe par le jeu des interruptions: On attend que le registre TMR0 génere une
interruption pour effectuer le traitement.
EXEMPLE
Dans cet
exemple, une led cablée sur RB0 clignotte à une fréquence de 1s ( 500ms éteint
et 500 ms allumée)
;programme principal
ORG 0
GOTO DEBUT
; vecteur interruption
ORG 4
REFIE
;Le programme
DEBUT MOVLW 0X05
MOVWF EEADR ;Adresse de la donnée dans l'EEPROM.
BSF STATUS,RP0 ;On passe en page1.
BSF EECON1,RD ;Validation de la lecture.
BCF STATUS,RP0 ;On passe en page0.
MOVF EEDATA,0 ;La donnée se trouve dans W
END
Un petit
exemple qui montre comment incrémenter une variable de 1 a chaque fois que le
compteur recoit 100 implusions.
;programme principal
ORG 0
GOTO DEBUT
; vecteur interruption
ORG 4
REFIE
;Le programme
DEBUT MOVLW 0X02
MOVWF EEADR ;Adresse de la donnée dans l'EEPROM.
MOVLW 0XDC
MOVWF EEDATA ;Valeur de la donnée a écrire.
BSF STATUS,RP0 ;On passe en page1.
BCF INTCON,GIE ;On inhibe les interruptions.
BSF EECON1,WREN ;Validation de l'écriture.
MOVLW 0X55 ;Cette séquence est obligatoire
MOVWF EECON2
MOVLW 0XAA
MOVWF EECON2
BSF EECON1,WR
LOOP BTFSS EECON1,EEIF ;On attend la fin de cycle d'écriture
GOTO LOOP
BCF EECON1,EEIF ;On efface le drapeau
BSF INTCON,GIE ;On valide les interruptions
;(dans le cas ou elles sont utilisées dans le programme)
BCF STATUS,RP0 ;On passe en page0.
END
DC copyright 1999
L'
UTILISATION
Une
temporisation permet de synchroniser le microcontrôleur avec des événements
généralement extérieurs.
LE PRINCIPE
Le principe
est d' exécute un nombre de fois une boucle de durée X. Ensuite, on
"ajuste" le temps avec des instructions ( NOP par exemple).
EXEMPLE
On utilise
un sous-programme appelé TEMPO d'une durée de 10 µS. Lorsqu'on appelle cette
routine tient, on tient compte de l'instruction CALL ( qui se réalise en deux
cycles d'instructions).
; Le pic est cadencé avec un quartz de 4MHz
; ce qui correspond à un cycle d'instruction de 1 µS.
TEMPO NOP ;T=3µS
NOP ;T=4µS
NOP
NOP
NOP
NOP ;T=8µS
RETURN ;T=10µS
;programme principal
CALL TEMPO ;Le pic attend 10µS
Même
principe mais on utilise l'instruction GOTO ( pour gagner quelques
instructions)
; Le pic est cadencé avec un quartz de 4MHz
; ce qui correspond à un cycle d'instruction de 1 µS.
TEMPO GOTO LOOP1 ;T=4µS
LOOP1 GOTO LOOP2 ;T=6µS
LOOP2 GOTO LOOP3
LOOP3 RETURN ; T=10µS
;programme principal
CALL TEMPO ;Le pic attend 10µS
On utilise
un sous-programme appelé TEMPO d'une durée de 100 µS. Lorsqu'on appelle cette
routine tient, on tient compte de l'instruction CALL ( qui se réalise en deux
cycles d'instructions).
; Le pic est cadencé avec un quartz de 4MHz
; ce qui correspond à un cycle d'instruction de 1 µS.
TEMPO MOVLW 0X18 ;W=24 (en décimal). durée=1µS
LOOP ADDLW 0XFF ;W=W-1. durée=1µS
BTFSS STATUS,Z ;on teste si le resultat est nul. durée=1µS Si Z=0 sinon
;durée=2µS
GOTO LOOP ; retourne en LOOP W>0. durée=1µS
RETURN ;T=100µS. durée=2µS
;T=7+22*4+5
;programme principal
CALL TEMPO ;Le pic attend 100µS
On utilise
un sous-programme appelé TEMPO d'une durée de 1mS. Lorsqu'on appelle cette
routine, on tient compte de l'instruction CALL ( qui se réalise en deux cycles
d'instructions).
; Le pic est cadencé avec un quartz de 4MHz
; ce qui correspond à un cycle d'instruction de 1 µS.
TEMPO MOVLW 0XF9 ;W=249 (en décimal). durée=1µS
LOOP ADDLW 0XFF ;W=W-1. durée=1µS
BTFSS STATUS,Z ;on teste si le résultat est nul. durée=1µS Si Z=0 sinon
;durée=2µS
GOTO LOOP ; retourne en LOOP W>0. durée=1µS
RETURN ;T=1mS. durée=2µS
;T=7+247*4+5
;programme principal
CALL TEMPO ;Le pic attend 1mS
Jusqu'a
présent, les temporisations etaient assez courte et pouvaient être exécuter
avec une seule boucle. Pour des durée plus grande, deux solutions se
présentent:
Il est
évident ,pour des raisons de commodités, que la deuxième méthode est la plus
réaliste.
; Le pic est cadencé avec un quartz de 4MHz
; ce qui correspond à un cycle d'instruction de 1 µS.
TEMPO MOVLW 0X0A ;W=10 (en décimal).
MOVWF TEMP_VAR ;W dans la variable TEMP_VAR.
LOOP1 MOVLW 0XF9 ;W=249
LOOP ADDLW 0XFF ;W=W-1.
BTFSS STATUS,Z ;teste si Z=0
GOTO LOOP
DECFSZ TEMP_VAR,F ;décrémente TEM_VAR. Si TEM_VAR=0 alors saute la prochaine instruction
GOTO LOOP1 ;sinon retourne en LOOP1.
NOP ;on ajuste la durée
NOP
NOP
NOP
NOP
RETURN
;programme principal
CALL TEMPO ;Le pic attend 10mS
Elle est
réalisée sur le principe des boucles imbriquées.Lorsqu'on appelle cette
routine, on tient compte de l'instruction CALL ( qui se réalise en deux cycles
d'instructions).
; Le pic est cadencé avec un quartz de 4MHz
; ce qui correspond à un cycle d'instruction de 1 µS.
TEMPO MOVLW 0X0A ;W=10 (en décimal).
MOVWF TEMP_VAR1 ;W dans la variable TEMP_VAR1.
LOOP2 MOVLW 0X0A ;W=10
MOVWF TEMP_VAR
LOOP1 MOVLW 0XF9
LOOP ADDLW 0XFF ;W=W-1.
BTFSS STATUS,Z ;teste si Z=0
GOTO LOOP
DECFSZ TEMP_VAR,F ;décrémente TEM_VAR. Si TEM_VAR=0 alors saute la prochaine instruction
GOTO LOOP1 ;sinon retourne en LOOP1.
NOP ;on ajuste la durée
NOP
NOP
NOP
NOP
DECFSZ TEMP_VAR1,F
GOTO LOOP2
NOP
NOP
NOP
NOP
NOP
RETURN
;programme principal
CALL TEMPO ;Le pic attend 100mS
UNE TEMPORISATION DE 1S
Elle est
réalisée sur le principe des boucles imbriquées.Lorsqu'on appelle cette
routine, on tient compte de l'instruction CALL ( qui se réalise en deux cycles
d'instructions).
; Le pic est cadencé avec un quartz de 4MHz
; ce qui correspond à un cycle d'instruction de 1 µS.
TEMPO MOVLW 0X0A ;W=10 (en décimal).
MOVWF TEMP_VAR2 ;W dans la variable TEMP_VAR1.
LOOP3 MOVLW 0X0A ;W=10
MOVWF TEMP_VAR1
LOOP2 MOVLW 0X0A
MOVWF TEMP_VAR
LOOP1 MOVLW 0XF9
LOOP ADDLW 0XFF ;W=W-1.
BTFSS STATUS,Z ;teste si Z=0
GOTO LOOP
DECFSZ TEMP_VAR,F ;décrémente TEM_VAR. Si TEM_VAR=0 alors saute la prochaine instruction
GOTO LOOP1 ;sinon retourne en LOOP1.
NOP ;on ajuste la durée
NOP
NOP
NOP
NOP
DECFSZ TEMP_VAR1,F
GOTO LOOP2
NOP
NOP
NOP
NOP
NOP
DECFSZ TEMP_VAR2,F
GOTO LOOP3
NOP
NOP
NOP
NOP
NOP
RETURN
;programme principal
CALL TEMPO ;Le pic attend 1S