Nous allons maintenant voir en détail les differentes instructions du PIC16F84
Les mots ecrits en vert sont explicités à la fin de la page.
Comment proceder pour transmettre un programme au PIC
Tout d'abord, il faut que vous ecriviez le programme dans un editeur de texte, et que vous l'enregistriez au format .asm (assembleur)
Ensuite il faut le
compiler à l'aide du compilateur (assembleur) de microchip
(voir page precedente). Lorsque la compilation est terminée,
il ne doit pas y avoir d'erreur ni de warnings. Dans le cas
contraire, ouvrez le fichier .lst ou .err pour voir ou est l'erreur
(le compilateur génére 4 fichiers).
Voici un
exemple de programme pour lequel la compilation s'est bien
passée:
Pour finir, lancez le
logiciel de programmation (xisept, p16pro, ...), mettez le PIC dans
le programmateur, et allumez le. Vous n'avez alors plus qu'à
ouvrir votre fichier compilé, et à le transmettre au
PIC.
Eteignez alors le programmateur, et sortez le PIC.
Maintenant que vous en
savez un peu plus, on va détailler les 35 instructions du
PIC.
Notez qu'il est inutile d'apprendre
ces instructions par coeur, et que vous pouvez passer directement
aux exemples (page suivante), et vous referer à cette page
pour vos programmes
Les instructions:
Voici les 35 instructions du PIC. Pour plus de détails, reportez vous aux fiches techniques de Microchip
Instruction |
Description |
---|---|
ADDLW k |
Add literal to W |
Valeurs |
0 <= k <= 255 |
Operation |
W + k -> W |
Description |
Additione le contenu de W avec le contenu de la constante (literal) k, et met le résultat dans W (registre de travail) |
Nb de cycles |
1 |
Bits du registre Status affectés |
C, DC, Z |
exemple: toto equ
H'0A'
; définition de la constante
toto: toto = H'0A' |
Instruction |
Description |
---|---|
ADDWF f,d |
Add W and f |
Valeurs |
0 <= f <= 127 et d=0 ou d=1 |
Operation |
W + f -> W si d=0 |
Description |
Additione le contenu de W avec celui de la variable f. Met le résultat dans W si d=0; met le résultat dans f si d=1 |
Nb de cycles |
1 |
Bits du registre Status affectés |
C, DC, Z |
exemple: titi equ
H'0C' ; titi est une
variable. H'0C' est l'adresse a laquelle (RAM) est stockée
titi |
Instruction |
Description |
---|---|
ANDLW |
AND Literal with W |
Valeurs |
0 <= k <= 255 |
Operation |
W & k -> W |
Description |
Fait un "ET" logique bit à bit ente le contenu de W est la constante (literal) k |
Nb de cycles |
1 |
Bits du registre Status affectés |
Z |
exemple: toto equ
B'10010111'
; définition de la constante toto en binaire (8bits) (ca
ne change rien) |
Instruction |
Description |
---|---|
ANDWF f,d |
AND W with f |
Valeurs |
0 <= f <= 127 et d=0 ou d=1 |
Operation |
W & f -> W si d=0 |
Description |
Fait un "ET" logique bit à bit entre le contenu de W et le contenu de la variable f |
Nb de cycles |
1 |
Bits du registre Status affectés |
Z |
exemple: titi equ
H'0C' ; titi est une
variable. H'0C' est l'adresse a laquelle (RAM) est stockée
titi |
Instruction |
Description |
---|---|
BCF f,b |
Bit Clear File |
Valeurs |
0 <= f <= 127 et 0 <= b <= 7 |
Operation |
0 -> f(b) |
Description |
Met à zero le bit n°b de la variable f. |
Nb de cycles |
1 |
Bits du registre Status affectés |
Aucun |
exemple:
; programme, configuration (port B en sortie), ... |
Instruction |
Description |
---|---|
BSF f,b |
Bit Set File |
Valeurs |
0 <= f <= 127 et 0 <= b <= 7 |
Operation |
1 -> f(b) |
Description |
Met à un le bit n°b de la variable f. |
Nb de cycles |
1 |
Bits du registre Status affectés |
Aucun |
exemple:
; programme, configuration (port B en sortie), ... |
Instruction |
Description |
---|---|
BTFSC f,b |
Bit Test File, Skip If Clear |
Valeurs |
0 <= f <= 127 et 0 <= b <= 7 |
Operation |
N'execute pas la ligne suivante si f(b) = 0 |
Description |
Test si le bit n°b du registre f est à ZERO. Cette instruction peut par exemple servir à savoir si on appuye sur un interrupteur ou non. |
Nb de cycles |
1 en temps normal, et 2 si f(b) = 0 |
Bits du registre Status affectés |
Aucun |
exemple:
; programme, configuration (port B en entrée), ... Exemple d'utilisation: tant qu'on appuye pas sur l'interrupteur, le programme ne s'execute plus. |
Instruction |
Description |
---|---|
BTFSS f,b |
Bit Test File, Skip If Set |
Valeurs |
0 <= f <= 127 et 0 <= b <= 7 |
Operation |
N'execute pas la ligne suivante si f(b) = 1 |
Description |
Test si le bit n°b du registre f est à UN. Cette instruction peut par exemple servir à savoir si on appuye sur un interrupteur ou non. |
Nb de cycles |
1 en temps normal, et 2 si f(b) = 0 |
Bits du registre Status affectés |
Aucun |
exemple:
; programme, configuration (port B en entrée), ... Exemple d'utilisation: tant qu'on appuye pas sur l'interrupteur, le programme ne s'execute plus. Contrairement à l'exemple precedent, l'interrupteur sera branché entre le +Vcc et l'entrée 8 du port B (avec evidemment une resistance à la masse) |
Instruction |
Description |
---|---|
CALL k |
Call Subroutine |
Valeurs |
0 <= k <= 2047 |
Operation |
PC + 1 -> TOS |
Description |
Ca sert à appeler un sous programme. S'utilise avec l'intstruction RETURN ou RETLW Juste avant l'execution du CALL, la variable PC contient la
ligne en cours d'execution (c'est toujours le cas) Notez qu'on peut appeller des sous programme dans des sous programmes. Le nombre maximum d'appels imbriqués est 8. |
Nb de cycles |
2 |
Bits du registre Status affectés |
Aucun |
exemple:
; programme, configuration,
... sous_prog
; c'est un label |
Instruction |
Description |
---|---|
CLRF f |
Clear File |
Valeurs |
0 <= f <= 127 |
Operation |
B'00000000' -> f |
Description |
Met à ZERO tous les bits de la variable f. |
Nb de cycles |
1 |
Bits du registre Status affectés |
Z |
exemple:
; programme, configuration (port B en sortie), ... |
Instruction |
Description |
---|---|
CLRW |
Clear W |
Valeurs |
Rien |
Operation |
B'00000000' -> W |
Description |
Met à ZERO tous les bits de la variable W
(registre de travail) |
Nb de cycles |
1 |
Bits du registre Status affectés |
Z |
exemple:
; programme, configuration, ... |
Instruction |
Description |
---|---|
CLRWDT |
Clear Watchdog Timer |
Valeurs |
Rien |
Operation |
B'00000000' -> WDT (chien
de garde) |
Description |
Met à zero le chien de garde |
Nb de cycles |
1 |
Bits du registre Status affectés |
/TO, /PD |
exemple:
; programme, configuration, ... Tout ceci fera l'objet d'un exemple commenté (voir plus loin) |
Instruction |
Description |
---|---|
COMF f,d |
Complement f |
Valeurs |
0 <= f <= 127 et d=0 ou d=1 |
Operation |
/f -> W si d=0 (/f signifie f
barre (complement de f)) |
Description |
Chaque bit de la variable f est remplacé par son
complément. Par exemple: |
Nb de cycles |
1 |
Bits du registre Status affectés |
Z |
exemple: titi equ
H'0C' ; titi est une
variable. H'0C' est l'adresse a laquelle (RAM) est stockée
titi |
Instruction |
Description |
---|---|
DECF f,d |
Decrement f |
Valeurs |
0 <= f <= 127 et d=0 ou d=1 |
Operation |
f - 1 -> W si d=0 |
Description |
Décremente (soustrait 1 à) la variable f. |
Nb de cycles |
1 |
Bits du registre Status affectés |
Z |
exemple: titi equ
H'0C' ; titi est une
variable. H'0C' est l'adresse a laquelle (RAM) est stockée
titi |
Instruction |
Description |
---|---|
DECFSZ f,b |
Decrement f, Skip if 0 |
Valeurs |
0 <= f <= 127 et 0 <= b <= 7 |
Operation |
N'execute pas la ligne suivante si le resultat de f - 1 est B'00000000' f - 1 -> W si d=0 |
Description |
Décremente (soustrait 1 à) la variable f, et
regarde si le résultat de l'operation est NUL |
Nb de cycles |
1 en temps normal, et 2 si le résultat de l'operation est 0 |
Bits du registre Status affectés |
Aucun |
exemple:
; programme, configuration (port B en entrée), ... Exemple d'utilisation: un décompteur binaire 8 bits. |
Instruction |
Description |
---|---|
GOTO k |
Unconditional Branch |
Valeurs |
0 <= k <= 2047 |
Operation |
k -> PC |
Description |
Ca sert à changer la ligne d'execution du programme. Juste avant l'execution du GOTO, la varialbe PC contient la
ligne en cours d'execution (c'est toujours le cas) |
Nb de cycles |
2 |
Bits du registre Status affectés |
Aucun |
exemple:
; programme, configuration,
... ailleurs
; c'est un label |
Instruction |
Description |
---|---|
INCF f,d |
Increment f |
Valeurs |
0 <= f <= 127 et d=0 ou d=1 |
Operation |
f + 1 -> W si d=0 |
Description |
Incrémente (ajoute 1 à) la variable f. |
Nb de cycles |
1 |
Bits du registre Status affectés |
Z |
exemple: titi equ
H'0C' ; titi est une
variable. H'0C' est l'adresse a laquelle (RAM) est stockée
titi |
Instruction |
Description |
---|---|
INCFSZ f,d |
Increment f, Skip if 0 |
Valeurs |
0 <= f <= 127 et d=0 ou d=1 |
Operation |
N'execute pas la ligne suivante si le resultat de f + 1 est B'00000000' f + 1 -> W si d=0 |
Description |
Incrémente (ajoute 1 à) la variable f, et
regarde si le résultat de l'operation est NUL |
Nb de cycles |
1 en temps normal, et 2 si le résultat de l'operation est 0 |
Bits du registre Status affectés |
Aucun |
exemple:
; programme, configuration (port B en entrée), ... Exemple d'utilisation: un compteur binaire 8 bits. |
Instruction |
Description |
---|---|
IORLW |
Inclusive OR Literal with W |
Valeurs |
0 <= k <= 255 |
Operation |
W OU k -> W |
Description |
Fait un "OU" logique bit à bit ente le contenu de W est la constante (literal) k |
Nb de cycles |
1 |
Bits du registre Status affectés |
Z |
exemple: toto equ
B'10010110'
; définition de la constante toto en
binaire |
Instruction |
Description |
---|---|
IORWF f,d |
Inclusive OR W with f |
Valeurs |
0 <= f <= 127 et d=0 ou d=1 |
Operation |
W OU f -> W si d=0 |
Description |
Fait un "OU" logique bit à bit entre le contenu de W et le contenu de la variable f |
Nb de cycles |
1 |
Bits du registre Status affectés |
Z |
exemple: titi equ
H'0C' ; titi est une
variable. H'0C' est l'adresse a laquelle (RAM) est stockée
titi |
Instruction |
Description |
---|---|
MOVF f,d |
Move f |
Valeurs |
0 <= f <= 127 et d=0 ou d=1 |
Operation |
f -> W si d=0 |
Description |
Met le contenu d'une variable f dans le registre W si d = 0 Si d = 1, le contenu de la variable f est remis dans f. Ca sert à tester si f = 0. En effet, si f = 0, le bit Z du registre Status passe à 1. |
Nb de cycles |
1 |
Bits du registre Status affectés |
Z |
exemple: titi equ
H'0C' ; titi est une
variable. H'0C' est l'adresse a laquelle (RAM) est stockée
titi |
Instruction |
Description |
---|---|
MOVLW k |
Move literal to W |
Valeurs |
0 <= k <= 255 |
Operation |
k -> W |
Description |
Met le contenu d'une constante k dans le registre W |
Nb de cycles |
1 |
Bits du registre Status affectés |
Aucun |
exemple: toto equ
H'0A'
; définition de la constante
toto: toto = H'0A' |
Instruction |
Description |
---|---|
MOVWF f |
Move W to f |
Valeurs |
0 <= f <= 127 |
Operation |
W -> f |
Description |
Met le contenu d'une variable du registre (variable) W dans la variable f |
Nb de cycles |
1 |
Bits du registre Status affectés |
Aucun |
exemple: titi equ
H'0C' ; titi est une
variable. H'0C' est l'adresse a laquelle (RAM) est stockée
titi Vous remarquerez que pour changer le contenu d'une variable, on est obligé de passer par W, le registre de travail. |
Instruction |
Description |
---|---|
NOP |
No Operation |
Valeurs |
Aucune |
Operation |
Aucune |
Description |
Ne fait rien, si ce n'est occuper un cycle d'horloge (1 µS environ avec un quartz de 4MHz). Peut etre utile pour faire des tempo precises |
Nb de cycles |
1 |
Bits du registre Status affectés |
Aucun |
exemple:
; programme, configuration, ... |
Instruction |
Description |
---|---|
RETFIE |
Return From Interrupt |
Valeurs |
Aucune |
Operation |
TOS -> PC |
Description |
Ca sert à revenir au programme aprés l'execution du sous programme d'interruption. Je m'explique: On peut demander au PIC d'interrompre le
programme à des intervalles de temps tres precis et tres
réguliers. Le PIC execute alors un sous programme
d'interruption (écrit par l'utilisateur) qui doit débuter
à l'adresse H'04'. (On y accede avec org
H'04'). Juste avant l'interruption, le numero de la ligne de retour
(= adresse de retour) avait ete sauvegardé dans la pile
"TOS". |
Nb de cycles |
2 |
Bits du registre Status affectés |
Aucun |
exemple: org D'000'
;
C'est l'adresse du début du programme. |
Instruction |
Description |
---|---|
RETLW |
Return with Literal in W |
Valeurs |
0 <= k <= 255 |
Operation |
k -> W |
Description |
Ca sert à revenir au programme principal aprés
l'execution d'un sous programme. Le contenu d'une constante k est stoqué dans W. Ca peut par exemple servir pour savoir de quel endroit du sous programme on revient. Juste avant l'interruption, le numero de la ligne de retour
(= adresse de retour) avait ete sauvegardé dans la pile
"TOS". |
Nb de cycles |
2 |
Bits du registre Status affectés |
Aucun |
exemple:
; programme, configuration,
... sous_prog
; c'est un label |
Instruction |
Description |
---|---|
RETURN |
Return |
Valeurs |
Aucune |
Operation |
TOS -> PC |
Description |
Ca sert à revenir au programme principal aprés
l'execution d'un sous programme. Juste avant l'interruption, le numero de la ligne de retour
(= adresse de retour) avait ete sauvegardé dans la pile
"TOS". |
Nb de cycles |
2 |
Bits du registre Status affectés |
Aucun |
exemple:
; programme, configuration,
... sous_prog
; c'est un label |
Instruction |
Description |
---|---|
RLF f,d |
Rotate Left File through carry |
Valeurs |
0 <= f <= 127 et d=0 ou d=1 |
Operation |
Voir ci dessous |
Description |
Déplace tous les bits de la variable f d'un cran vers
la gauche. Le bit sortant (ex bit7) est stocké dans le
bit C du registre Status. |
Nb de cycles |
1 |
Bits du registre Status affectés |
C |
exemple: pour faire tourner les bits sur eux meme (sinon ils sortent) chenil equ
H'0C' ;titi est une variable. H'0C' est
l'adresse a laquelle (RAM) est stockée
titi Ce petit code permet de faire tourner le contenu de chenil sur lui meme. |
Instruction |
Description |
---|---|
RRF f,d |
Rotate Right File through carry |
Valeurs |
0 <= f <= 127 et d=0 ou d=1 |
Operation |
Voir ci dessous |
Description |
Déplace tous les bits de la variable f d'un cran vers
la droite. Le bit sortant (ex bit0) est stocké dans le
bit C du registre Status. |
Nb de cycles |
1 |
Bits du registre Status affectés |
C |
exemple: pour faire tourner les bits sur eux meme (sinon ils sortent) chenil equ
H'0C' ;titi est une variable. H'0C' est
l'adresse a laquelle (RAM) est stockée
titi Ce petit code permet de faire tourner le contenu de chenil sur lui meme. |
Instruction |
Description |
---|---|
SLEEP |
"Endort le PIC" |
Valeurs |
Rien |
Operation |
B'00000000' -> WDT (chien
de garde) |
Description |
Met le PIC en veille. Le chien de garde
continue cependant à fonctionner s'il a été
activé. Remarque: ne fonctionne qu'avec un circuit RC pour l'horloge (pas de quartz) |
Nb de cycles |
1 |
Bits du registre Status affectés |
/TO, /PD |
exemple:
; programme, configuration, ... Tout ceci fera l'objet d'un exemple commenté (voir plus loin). Cette instruction peut servir pour faire des temporisations. |
Instruction |
Description |
---|---|
SUBLW k |
Substract W from literal |
Valeurs |
0 <= k <= 255 |
Operation |
k - W -> W |
Description |
Soustrait le contenu de W à la constante k, et met le résultat dans W (registre de travail) |
Nb de cycles |
1 |
Bits du registre Status affectés |
C, DC, Z |
exemple: toto equ
H'05'
; définition de la constante
toto: toto = H'05' Cette commande est trés utilisée pour savoir si le contenu de W est égal à k. On les soustrait, et on regarde si le résultat est nul. |
Instruction |
Description |
---|---|
SUBWF f,d |
Substract W from File |
Valeurs |
0 <= f <= 127 et d=0 ou d=1 |
Operation |
f - W -> W si d=0 |
Description |
Soustrait le contenu de W à la variable f. |
Nb de cycles |
1 |
Bits du registre Status affectés |
C, DC, Z |
exemple: titi equ
H'0C' ; titi est une
variable. H'0C' est l'adresse a laquelle (RAM) est stockée
titi |
Instruction |
Description |
---|---|
SWAPF f,d |
Swap Nibbles in File |
Valeurs |
0 <= f <= 127 et d=0 ou d=1 |
Operation |
|
Description |
Echange les 4 bits de poids fort (bits de gauche) avec les 4
bits de poids faible (bits de droite) d'une
variable. |
Nb de cycles |
1 |
Bits du registre Status affectés |
Aucun |
exemple: titi equ
H'0C' ; titi est une
variable. H'0C' est l'adresse a laquelle (RAM) est stockée
titi |
Instruction |
Description |
---|---|
XORLW |
Exclusive OR Literal with W |
Valeurs |
0 <= k <= 255 |
Operation |
W XOR k -> W |
Description |
Fait un "OU EXCLUSIF" logique bit à bit ente le contenu de W est la constante (literal) k |
Nb de cycles |
1 |
Bits du registre Status affectés |
Z |
exemple: toto equ
B'10010110'
; définition de la constante toto en
binaire |
Instruction |
Description |
---|---|
XORWF f,d |
Exclusive OR W with f |
Valeurs |
0 <= f <= 127 et d=0 ou d=1 |
Operation |
W XOR f -> W si d=0 |
Description |
Fait un "OU EXCLUSIF" logique bit à bit entre le contenu de W et le contenu de la variable f |
Nb de cycles |
1 |
Bits du registre Status affectés |
Z |
exemple: titi equ
H'0C' ; titi est une
variable. H'0C' est l'adresse a laquelle (RAM) est stockée
titi |
Quelques définitions:
equ:
est une directive du compilateur (assembleur). Ca sert à
declarer une variable ET une constante. Chaque fois que le
compilateur rencontre la chaine (a gauche de equ), il la remplace
par la valeur indiquée a droite de equ. Ensuite c'est le PIC
qui se debrouille. Si la valeur attendue est une variable, le PIC
va voir dans la RAM a l'adresse indiquée. Si la valeur
attendue est une constante, le PIC aura directement la
valeur
exemple:
chaine
equ H'0C'
; Déclaration d'une variable ou/et d'une constante
movlw
chaine ; Là
le PIC attend une constante
; (literal -> W), donc il va mettre la valeur 0C dans
W
movf chaine,0
; Là le PIC attend une variable,
; il va donc aller voir à l'adresse 0C dans la
RAM
; et mettra le contenu de cette adresse dans W
Je
rapelle que pour l'utilisateur, les adresses utilisables dans la
RAM vont de H'0C' à H'4F'
Literal:
C'est une constante, désignée par la lettre k.
Par
exemple au debut du programme, on peut avoir défini toto =
H'01'. A chaque fois que la constante toto interviendra, elle sera
remplacée par la valeur H'01'
Registre Status:
C'est une variable (registre) trés utile, puisqu'elle permet
de savoir si un résultat est nul, negatif, positif,
....
Nous en reparlerons par la suite.
Bit: C'est une "case". Si on reprend l'exemple des tiroirs avec des compartiments, le bit represente un compartiment.
; : le point virgule sert à introduire un commentaire. Ce commentaire est juste la pour l'utilisateur, il n'est pas stocké dans le PIC
H' ', B' ', D' ', ... : disent que la valeur qui suit est en Hexadecimal, en Binaire, en décimal, .... Lors de la compilation, toutes les valeurs sont transcrite en hexadecimal.
f:
c'est un registre situé dans la memoire RAM, défini
par l'utilisateur, qui contient une variable.
Par exemple on
appelle titi le registre situé dans la memoire RAM à
l'adresse H'0C'. Par la suite, on pourra se servir de titi comme
d'une variable. f désigne donc une variable quelconque.
PORTB: c'est un registre (variable) de 8 bits qui contient les etats des sorties du pic. Par exemple si PORTB = B'00010011', les sorties 1, 2, et 5 sont au niveau logique "1", les autres sont à zero.
Label: ca sert à sauter des morceaux de code. (on utilise alors l'instruction GOTO; par exemple "GOTO boucle" fera s'executer le programme à partir du label boucle).
GOTO: instruction de saut: permet d'aller à un autre endroit du programme. (voir ci dessus)
Sous programme: C'est un morceau de programme qui est appellé par un programme principal. L'interet des sous programmes est de ne pas réécrire plein de fois la meme chose, et de rendre le programme plus clair.
Chien de garde (WDT): C'est une fonction du PIC qui permet de savoir si une instruction dure "trop" longtemps (peut etre désactivé). Cette fonction peut par exemple servir à faire des temporisations: On "endort" le PIC, le chien de garde detecte que ca dure trop longtemps, et il "reveille" le PIC.
Prédiviseur du chien de garde: ca sert à fixer le temps que met le chien de garde pour entrer en action. Si le prediviseur est à zero, le chien de garde entrera en action apres environ 18mS d'inactivité du PIC. Si le prédiviseur est à 128 (B'xxxxx111'), le chien de garde entrera en action apres environ 18m * 128 = 2.3 secondes.
Interruption:
On peut demander au PIC d'interrompre le programme à
des intervalles de temps tres precis et tres réguliers. Le
PIC execute alors un sous programme d'interruption (écrit
par l'utilisateur) qui doit débuter à l'adresse
H'04'. (On y accede avec org H'04').
Lorsque
l'execution de ce sous programme est finie, il faut revenir au
programme principal, ce qui se fait par l'intermediaire de la
commande RETFIE.
OU EXCLUSIF: voici la table de verité:
a |
b |
a XOR b |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
0 |
Toutes ces informations sont données à titre indicatif, et je ne peux en aucun cas etre tenu pour responsable en cas d'erreur.
Pour toute remarque, ... ecrivez moi a xizard@enib.fr
Ecrivez nous: xizard@enib.fr et rbourdon@enib.fr