Vous êtes sur la page 1sur 14

Chapitre 3 Programmation et jeu d’instructions du microcontrôleur 16F877

3.1. INTRODUCTION
Une fois le projet établi, l'étape suivante consiste à créer le programme. Le programme source, est une
suite d'ordres dit "Mnémoniques" qui font partie du jeu d'instructions du PIC utilisé. Pour créer le
programme source il faut uniquement un éditeur de texte.
Une fois que le programme source est figé, l'étape suivante consistera à compiler le programme, c'est à
dire à transformer le programme source en un programme dit "binaire" (code machine). L'extension du
fichier sera alors .hex (hexadécimal). Une fois compilé, le fichier binaire sera transféré vers la mémoire
programme du PIC.

3.2. L’ASSEMBLAGE
La transformation du texte en programme, que l’on appelle assemblage, s’effectue en deux temps
appelés passes. Au cours de la première passe le logiciel appelé assembleur, reconnaît chaque symbole
d’instruction (mnémonique), et déduit le code machine correspondant. Après cette première passe,
l’assembleur a défini une table des symboles.
Pendant la deuxième passe, cette table des symboles est utilisée pour achever la traduction.
L’assembleur génère le code machine comme une suite d’octets qui pourront être mis en mémoire,
constituant ainsi le programme exécutable (fichier.hex).une fois l’assemblage est terminé l’utilisateur
dispose de plusieurs fichiers dans l’ordinateur :
 Le fichier source qu’il a édité et qu’il pourra modifier par la suite
 Le fichier listing qui contient toutes les informations nécessaires à la relecture et à la
compréhension du programme
 Le fichier (.hex) qui contient les codes machines exécutés par le microcontrôleur est stocké
sous forme texte sur le disque de l’ordinateur, il contient toutes les informations nécessaires à
son implantation dans la mémoire programme du PIC
 D’autres fichiers de travail générés par l’assembleur notamment un fichier détaillant les
erreurs et avertissements qui subissent dans la source.

3.3. REGLES DE REDACTION EN LANGAGE ASSEMBLEUR

3.3.1. Les directives d’assemblage


Les directives ne sont utiles qu’au logiciel d’assemblage, elles ne font pas partie du programme.
a) La directive ORG : Le programme principal est logé à un endroit défini dans la mémoire programme
du PIC. Une syntaxe nommée ORG permet de choisir l'adresse de début dans laquelle sera logée la
première instruction du programme. On peut placer plusieurs ORG dans un programme.

L.HACINI MCIL3_Les Microcontrôleurs Page 1


Chapitre 3 Programmation et jeu d’instructions du microcontrôleur 16F877

Exemple1 :
;------------------------------------- Programme principal ------------------------------
ORG 0000h
; Le programme commencera à l'adresse 0000 de la mémoire programme du PIC.

Exemple2 :
;------------------------------------ Initialisation du PIC ---------------------------------
ORG 0000h
GOTO start
;--------------------------------- Programme d' interruption -----------------------------
ORG 0004h
…………………
…………………
;------------------------------------ Programme principal ---------------------------------
start
………………….
………………….

b) La directive LIST : Elle détermine le type de microcontrôleur utilisé.

Exemple :
List P=16F877
c) La directive END : Elle précise où doit s’arrêter l’assemblage, les instructions situées après sont
ignorées.
d) La directive CONFIG : Elle permet de définir les paramètres de fonctionnement du PIC. Pour cela il
suffit de positionner la valeur de chacun des bits du registre de configuration. Pour programmer ce
registre on utilise la directive CONFIG qui n’intervient qu’avec le programmateur. Cette directive n’est
utile que pour modifier la configuration par défaut du microcontrôleur.

Exemple:
_CONFIG_CP_OFF&WDTE_OFF&PWRTE_ON&HS_OSC
Chaque définition est séparée par le symbole &, chaque bit est suivi de ON ou OFF. Le bit CP est à 0,
le bit WDTE (watchdog timer enable) est à 0, le bit PWRTE (power timer enable) est à 1 et le terme
HS définit le type d’horloge utilisé.
e) La directive include : elle permet d’introduire dans le programme les assignations contenues dans le
fichier du microcontrôleur, c'est-à-dire toutes les constantes utiles du microcontrôleur.

Exemple :
include p16F877.inc

L.HACINI MCIL3_Les Microcontrôleurs Page 2


Chapitre 3 Programmation et jeu d’instructions du microcontrôleur 16F877

3.3.2. Les assignations


Il est souhaitable, pour la compréhension du programme et éventuellement pour qu'une autre personne
désirant suivre ou modifier le programme, de définir des équivalences, qui permettent d'associer une
valeur à un nom. Au moment de l’assemblage, chaque fois que l’assembleur va trouver une étiquette
avec assignation, il la remplacera automatiquement par sa valeur.

Exemple :
table EQU 0x50
A chaque fois dans notre programme que le compilateur rencontrera l'équivalence définie, il la
remplacera par sa valeur numéraire. Il est plus facile de comprendre dans un programme le mot table
plutôt que la valeur 5.

3.3.3. Les définitions


Une définition « define » fonctionne comme une assignation. Les assignations sont utilisées pour les
valeurs, et les définitions pour remplacer un texte plus complexe ou le résultat d’un calcul.

Exemple :
define led PORTA,3 ; led désigne le bit 3 du port A

3.3.4. Les commentaires


Pour la compréhension d'un programme il est utile voire primordial de rajouter des commentaires qui
faciliteront la mise à niveau ainsi qu'un dépannage éventuel. La plupart des compilateurs ignorent, donc
considèrent comme commentaires, tout ce qui suit un point-virgule ( ; ).
En début de programme quelques lignes nous permettent de reprendre le fonctionnement sommaire du
programme.

3.3.5. Les étiquette


Les étiquettes dans un programme permettent de remplacer avantageusement une adresse en format
numérique. Elles doivent suivre les règles suivantes :
 le premier caractère doit être une lettre ou un tiret bas
 elle est alphanumérique
 elle ne peut être définie qu’une seule fois
 elle est écrite en première colonne du source
 elle ne peut faire plus de 32 caractères

L.HACINI MCIL3_Les Microcontrôleurs Page 3


Chapitre 3 Programmation et jeu d’instructions du microcontrôleur 16F877

Exemple
GOTO tempo
Dès que le programme rencontre l'instruction GOTO, il va se "brancher" à l'adresse mémoire que
représente l'étiquette tempo pour exécuter les instructions qui se trouvent derrière cette étiquette.

3.3.6. Les macros


Une macro permet de nommer une séquence d’instructions souvent utilisée et qui peut être insérée dans
un programme par simple appel de son nom. Elle simplifie l’écriture et apparaît comme une
instruction.
Elle se compose d’un nom (étiquette) écrit en première colonne, puis de la directive macro. A la ligne
suivante on place le programme qui constitue la macro. La macro se termine par la directive endm (end
of macro).

Exemple
AAA macro
Bsf PORTB,2 ; mise à 1 du bit 2 du port B
endm

3.3.7. La zone des variables


La directive CBLOCK permet de définir l’adresse du début d’une zone de variables. Ensuite, il suffit
d’écrire le nom de la variable suivi du signe « : » et de la taille utilisée (nombre de registre à usage
général). La fin de la zone est définie par la directive endc.

Exemple
CBLOCK 0x0C ; début de la zone de variables
cmpt : 1 ; zone de 1 octet
table : 8 ; zone de 8 octets
endc ; fin de la zone

3.4. JEU D’INSTRUCTIONS


Le microcontrôleur PIC 16F877 dispose d’un jeu réduit de 35 instructions. Ce jeu d’instruction réduit
implique qu’une opération peut être traduite par plusieurs instructions assembleurs.
La majorité des instructions s’exécutent en un seul cycle d’horloge sauf pour les instructions de
branchement ou certaines autres instructions. Dans ce qui suit on donne en détail toutes les instructions
en précisant le nombre de cycles d’horloge nécessaires et les flags affectés.

ADDLW :( ADD Literal and W )


Additionner le registre W et une valeur immédiate, la somme est stockée en W
Syntaxe : addlw k ;(W)+k  (W)
L.HACINI MCIL3_Les Microcontrôleurs Page 4
Chapitre 3 Programmation et jeu d’instructions du microcontrôleur 16F877

Nombre de cycle d'horloge : 1


Indicateurs positionnés :
C : si le résultat de l’opération est supérieur à 0xFF (255), C passe à 1
DC : si le résultat de l’opération entraîne un retenue entre le bit 3 et 4, DC passe à 1
Z : si le résultat de l’opération est nul, Z passe à 1
Exemple :
Addlw 0x0F ; W + 0x0F, le résultat est stocké dans W

ADDWF: ( ADD W and F )


Additionner le registre W et ( f ) , la somme est stockée en fonction de d
Syntaxe : addwf f,d ;(W)+(f)  (d)
f est l'emplacement mémoire d'un registre
Nombre de cycle d'horloge : 1
Bits du registre STATUS affectés : C, DC, Z
d est un paramètre
 si d= 0 le résultat va dans le registre W
 si d= 1 le résultat va dans le registre f
Exemple :
movlw 5 ; charger 5 dans W
movwf zone ; zone vaut 5
movlw 25 ; charger 25 dans W
addwf zone,1 ; résultat=30 sauvé dans zone car d=1

ANDLW : ( AND Literal with W )


Opération " ET " entre le contenu du registre W et l’opérande k
Syntaxe : andlw k ;(W)&k  (W)
Nombre de cycle d'horloge : 1
Bit du registre STATUS affecté : z
Exemple :
movlw B’11001101’ ; charger W
andlw B’11110000’ ; effectuer un ‘ET logique’ résultat B’11000000’ dans W

ANDWF: ( AND W with F )


Opération ‘ET logique’ entre le contenu du registre W et le contenu de f le résultat est stocké en
fonction de d
Syntaxe : andwf f,d ; ( W ) & ( f )  ( d )
Nombre de cycle d'horloge : 1
Bit du registre STATUS affecté : z
Exemple :
R_etat equ 0x03 ; on affecte 03 à la variable R_etat utilisée ci - après
movlw B’00000111’ ; on met le contenu 00000111 dans le registre W
andwf R_etat, 1 ; on élimine les 5 bits de poids fort du registre d’adresse R_etat, le résultat
est dans le même registre.

BCF : ( Bit Clear F )


Permet de mettre à 0 un bit d’un registre
Syntaxe : bcf f,b ; 0  ( f{b} ) le bit défini par b (sur 3 bits) est mis à 0 dans le registre
(f), b est compris entre 0 et 7

L.HACINI MCIL3_Les Microcontrôleurs Page 5


Chapitre 3 Programmation et jeu d’instructions du microcontrôleur 16F877

f est l'emplacement mémoire d'un registre


Nombre de cycle d'horloge : 1
Bits du registre STATUS affectés : Aucun
Exemple :
Avant (x)=B’11111111’
BCF x, 2 ; on met à 0 le bit 2 de (x)
Après (x)=11111011

BSF : ( Bit Set F )


Permet de forcer à 1 un bit d’un registre
Syntaxe : bsf f,b ; 1  ( f{b} ) le bit défini par b (sur 3 bits) est mis à 1 dans le registre
(f), b est compris entre 0 et 7
Nombre de cycle d'horloge : 1
Bits du registre STATUS affectés : Aucun
Exemple :
BSF PORTB, 3 on met à 1 le bit 3 du port B

BTFSC: ( Bit Test F Skip if Clear )


Teste le bit sélectionné du registre et saute l’instruction suivante si le bit vaut 0. Dans ce cas
l’instruction prend deux cycles ; sinon, elle n’utilise qu’un cycle machine.
Syntaxe : btfsc f,b ;teste de bit repéré par b de la case mémoire (f) et saute l’instruction
suivante si le bit b=0
Nombre de cycle d'horloge : 1 ou 2
Bits du registre STATUS affectés : Aucun

BTFSS: ( Bit Test F Skip if Set )


Teste le bit du registre et saute l’instruction suivante s’il vaut 1
Syntaxe : btfss f,b ;teste de bit repéré par b de la case mémoire (f) et saute l’instruction
suivante si le bit b=1
Nombre de cycle d'horloge : 1 ou 2
Bits du registre STATUS affectés : Aucun

CALL : (CALL sous-programme) Appel du sous-programme


Syntaxe : call étiquette ; appel du sous-programme à l’adresse étiquette
Adresse du retour ( PC ) + 1  Haut de la pile
étiquette  ( PC )
Nombre de cycle d'horloge : 2
Bits du registre STATUS affectés : aucun

CLRF : (CLeaR F)
Cette instruction efface le registre f spécifié
Syntaxe : clrf f ; 00  ( f )
Nombre de cycle d'horloge : 1
Bit du registre STATUS affecté : Z=1

CLRW : (CLeaR W)
Efface le contenu du registre W
Syntaxe : clrw ; 00  W

L.HACINI MCIL3_Les Microcontrôleurs Page 6


Chapitre 3 Programmation et jeu d’instructions du microcontrôleur 16F877

Nombre de cycle d'horloge : 1


Bit du registre STATUS affecté : Z = 1

CLRWDT : (CLeaR WatchDog Timer)


Remet à 0 le compteur du chien de garde, opération qui permet de provoquer un reset automatique du
microcontrôleur en cas d’arrêt du programme.
Syntaxe : clrwdt ; remet le compteur du watchdog à 0
Nombre de cycle d'horloge : 1
Bits du registre STATUS affectés :
TO = 0
PD = 1

COMF: (COMplement F)
Effectue le complément à 1 du registre spécifié
Syntaxe: comf f,d ; NOT(f)  (d)
Nombre de cycle d'horloge : 1
Bit du registre STATUS affecté : Z
Exemple :
Dans cet exemple on charge une valeur dans un registre ici 55h puis on complémente cette valeur qui
devient alors AAh.
Reg_temp equ 0x0A ; 0A correspond à l'adresse d'un registre temporaire
movlw B’01010101’ ; on charge 55h dans le registre W
movwf Reg_temp ; on met W dans le registre temporaire
comf Reg_temp, 1 ; on complémente le contenu du registre temporaire

DECF : (DECrement F)
Décrémente le registre spécifié et le met en mémoire selon la valeur de d
Syntaxe : decf f,d ; (f) - 1  (d)
Nombre de cycle d'horloge : 1
Bits du registre STATUS affecté: Z
Exemple :
Dans cet exemple on charge une valeur dans un registre ici 01h puis on décrémente cette valeur qui
devient alors 00h ( flag Z = 1 dans cet exemple ) .
Reg_temp equ 0Ah ; 0A correspond à l'adresse d'un registre temporaire
movlw 01h ; on charge 01h dans le registre W
movwf Reg_temp ; on met W dans le registre temporaire
decf Reg_temp, 1 ; on décrémente le contenu du registre temporaire

DECFSZ : (DECrement F Skip if Zero)


Décrémente un registre f et saute l'instruction suivante si le résultat de le décrémentation donne une
valeur nulle.
Syntaxe : decfsz f,d ; (f) - 1  ( d ) et sauter l' instruction suivante si f=0
Nombre de cycle d'horloge : 1 ou 2
Bits du registre STATUS affectés : Aucun

L.HACINI MCIL3_Les Microcontrôleurs Page 7


Chapitre 3 Programmation et jeu d’instructions du microcontrôleur 16F877

GOTO : aller à
Cette instruction effectue ce que l’on appelle un saut inconditionnel. Elle contient les 11 bits de
l’emplacement de destination. Les 2 bits manquants pour reconstituer l’adresse complète sont dans le
registre PCLATH.
Fonctionnement de goto :
 l’adresse de saut sur 11 bits est chargée dans le PC
 les deux bits manquants sont chargés depuis PCLATH (b3 et b4)
 le résultat donne l’adresse sur 13 bits
 la suite du programme s’effectue à la nouvelle adresse du PC
Syntaxe : goto étiquette
Nombre de cycle d'horloge : 2
Bits du registre STATUS affectés : aucun

INCF: (INCrement F)
Incrémente le registre f et range le résultat dans l’emplacement mémoire selon d
Syntaxe : incf f,d ; (f) + 1  (d)
Nombre de cycle d'horloge : 1
Bit du registre STATUS affecté : Z
Exemple :
incf x,f ; le contenu de x est augmenté de 1
; le résultat est stocké dans x
incf x,w ; le contenu de x est augmenté de 1 et stocké dans W, x n’est pas modifié

INCFSZ : (INCrement F Skip if Zéro)


Incrémente le registre (f) et saute l'instruction suivante si (f) = 0
Syntaxe : incfsz f,d ;(f) + 1  (d) et saute si le résultat = 0
Nombre de cycle d'horloge : 1 ou 2
Bits du registre STATUS affectés : Aucun

IORLW : (Inclusif OR Literal with W)


Opération logique "OU" entre le registre W et un opérande k, le résultat est mis dans W
Syntaxe : iorlw k ;( W ) OR k  ( W )
Nombre de cycle d'horloge : 1
Bit du registre STATUS affecté : Z
Exemple :
movlw 0x9A ; charger 0x9A dans W
iorlw 0x35 ; (W)=0xBF

IORWF: (Inclusif OR W with F)


Opération logique "OU" entre le registre W et le contenu du registre (adressage direct), le résultat est
orienté en fonction de la valeur de d.
Syntaxe : iorwf f,d ;( W ) OR ( f )  ( d )
Nombre de cycle d'horloge : 1
Bit du registre STATUS affecté :Z

L.HACINI MCIL3_Les Microcontrôleurs Page 8


Chapitre 3 Programmation et jeu d’instructions du microcontrôleur 16F877

MOVF: (MOVe F)
Charge le contenu du registre spécifié dans la destination selon la valeur de d.
Syntaxe : movf f,d ; (f)  (d)
Nombre de cycle d'horloge : 1
Bit du registre STATUS affecté : Z
Exemple :
Movf x,w ; met le contenu de x dans w

MOVLW : (MOVe Literal to W)


Charge une valeur immédiate dans le registre W
Syntaxe : movlw k ; k  (W), k est une valeur immédiate
Nombre de cycle d'horloge : 1
Bits du registre STATUS affectés : Aucun
Exemple :
Dans cet exemple on charge une valeur dans le registre W
movlw 0x25 ; on charge 25h dans le registre W

MOVWF: (MOVe W to F)
Charge le registre W dans le registre f
Syntaxe : movwf f ; (W)  (f)
Nombre de cycle d'horloge : 1
Bits du registre STATUS affectés : Aucun
Exemple :
movlw 0x50 ; charge 0x50 dans w
movwf PORTB ; PORTB contient 0x50

NOP: (No OPeration)


Instruction qui ne fait rien et ne modifie rien mais occupe du temps.
Syntaxe : nop
Nombre de cycle d'horloge : 1
Bits du registre STATUS affectés : Aucun

RETFIE: (RETurn From IntErrupt)


Cette instruction provoque un retour d'interruption
Syntaxe : retfie ; retour d’interruption
Haut de pile  (PC)
Nombre de cycle d'horloge : 2
Bits du registre STATUS affectés : aucun

RETLW: (RETurn with Literal in W)


Retour de sous-programme avec valeur dans W. c’est une instruction équivalente à l’instruction return,
mais permet de sortir d’un sous-programme avec une valeur spécifiée dans W.
Syntaxe : retlw k ; k  (W) puis retour
Haut de pile  (PC)
Nombre de cycle d'horloge : 2
Bits du registre STATUS affectés : aucun

L.HACINI MCIL3_Les Microcontrôleurs Page 9


Chapitre 3 Programmation et jeu d’instructions du microcontrôleur 16F877

Exemple :
retlw 0xFF ; retour de sous-programme avec W contenant 0xFF

RETURN: (RETURN from subroutine)


Retour de sous-programme. Cette instruction est indispensable à la fin d’un sous-programme, elle
permet de charger le compteur de programme avec l’adresse de retour qui a été sauvegardée dans la
pile.
Syntaxe : Return ; retour d'un sous-programme
Haut de pile  (PC)
Nombre de cycle d'horloge : 2
Bits du registre STATUS affectés : aucun

RLF: (Rotate Left F through carry)


Rotation vers la gauche en utilisant la retenue. Le bit de retenue C du registre d’état est décalé dans le
registre f et le résultat est placé en fonction de la valeur de d.
Syntaxe : rlf f,d ; (f) rotation gauche avec C  (d)
Carry  ( d0 )
( f0 )  ( d1 )
( f1 )  ( d2 )
( f2 )  ( d3 )
( f3 )  ( d4 )
( f4 )  ( d5 )
( f5 )  ( d6 )
( f6 )  ( d7 )
( f7 )  ( Carry )
Nombre de cycle d'horloge : 1
Bit du registre STATUS affecté : C

RRF: (Rotate Right F through carry)


Rotation à droite de ( f ) en utilisant le bit C
Syntaxe : rrf f,d ; (f) rotation droite avec C  (d)
( f0 )  Carry
( f1 )  ( d0 )
( f2 )  ( d1 )
( f3 )  ( d2 )
( f4 )  ( d3 )
( f5 )  ( d4 )
( f6 )  ( d5 )
( f7 )  ( d6 )
Carry  ( d7 )
Nombre de cycle d'horloge : 1
Bit du registre STATUS affecté : C

SLEEP: Mise en sommeil du microcontrôleur (Power Down mode)


Place le microcontrôleur en sommeil, la consommation de courant est minimale.
Syntaxe : sleep ; arrêt de l’horloge
Nombre de cycle d'horloge : 1

L.HACINI MCIL3_Les Microcontrôleurs Page 10


Chapitre 3 Programmation et jeu d’instructions du microcontrôleur 16F877

Bits du registre STATUS affectés : PD=0 et TO=1

SUBLW : (SUBstract W from Literal)


Soustraction entre une valeur littérale (opérande) et le registre W (méthode du complément à deux), le
résultat est placé dans W.
Syntaxe : sublw k ; k - (W)  (W), exécute la soustraction k - contenu de W, résultat dans W
Nombre de cycle d'horloge : 1
Bits du registre STATUS affectés: C, DC, Z

SUBWF: (SUBstract W from F)


Soustraction du contenu de W à un registre f
Syntaxe : subwf f,d ; (f) - (W)  (d)
Nombre de cycle d'horloge : 1
Bits du registre STATUS affectés : Z, DC, C

SWAPF: (SWAP nibbles in F)


Cette opération inverse le quartet de poids faible avec celui de poids fort dans le registre spécifié.
Syntaxe : swapf,d ; ( f bit 0 à bit 3)  ( d bit 4 à bit 7 )
; ( f bit 4 à bit 7)  ( d bit 0 à bit 3 )
Nombre de cycle d'horloge : 1
Bits du registre STATUS affectés : Aucun

XORLW : (eXclusif OR literal with W)


Opération logique XOR (ou exclusif) entre le contenu de W et l’opérande k
Syntaxe : xorlw k ; (W) XOR k  (W)
Nombre de cycle d'horloge : 1
Bit du registre STATUS affecté : Z
Exemple :
movlw 0x55 ; on charge 55h dans le registre W
xorlw 0x3C ; ou exclusif entre le contenu de W et 3Ah, le contenu du registre W = 69h

XORWF: (eXclusif OR W with F)


Opération logique XOR (ou exclusif) entre le contenu de W et f le résultat en d
Syntaxe : xorwf f,d ; (W) XOR (f)  (d)
Nombre de cycle d'horloge : 1
Bit du registre STATUS affecté : Z

3.5. CALCUL DU TEMPS D’EXECUTION D’UNE INSTRUCTION


Grâce aux caractéristiques du constructeur sur le jeu d'instructions des PIC on peut connaître le nombre
de cycles nécessaires pour l'exécution d'une instruction. Sachant que l'horloge interne divise par quatre
la fréquence issue du quartz, cela donne pour un quartz de 20 Mhz un temps machine de 0.2 µS par
cycle (F =5 MHz donc T =1/F = 0.2 µS).
A chaque fois que l'on désire fabriquer une temporisation, il faut calculer le nombre de temps machine
nécessaire pour exécuter la temporisation afin de déterminer la valeur exacte de la tempo.

L.HACINI MCIL3_Les Microcontrôleurs Page 11


Chapitre 3 Programmation et jeu d’instructions du microcontrôleur 16F877

3.6. LE REGISTRE STATUS


C’est un registre qui contient les flags qui informent sur le résultat de la dernière opération. Ce registre
contient 8 bits

STATUS IRP RP1 RP0 TO PD Z DC C


03h, 83h, 103h ou183h R/W-0 R/W-0 R/W-0 R-1 R-1 R/W-x R/W-x R/W-x

 C (Carry) : Il passe à 1 quand une retenue apparaît sur le bit le plus significatif
 DC (Digit Carry) : Ce bit est utilisé principalement lorsque l’on travaille avec des nombres
BCD : il indique un report ou retenue du bit 3 vers le bit 4.
 Z (Zero) : ce bit est positionné à 1 si le résultat de la dernière opération logique ou arithmétique
vaut 0.
 PD (Power Down) : ce bit est actif au niveau zéro. Il est mis à 1 à la mise sous tension. PD est
mis à 0 par l’instruction SLEEP (état de basse consommation). Indique quel événement a
entraîné le dernier arrêt du PIC (instruction sleep ou dépassement du temps du watchdog).
 TO (Time-Out bit) : ce bit est actif au niveau zéro. Il est mis à 1 à la mise sous tension. Ce bit
est mis à 0 par le débordement du chien de garde, il peut indiquer si le redémarrage suit un arrêt
provoqué par débordement du compteur du chien de garde ou d’une mise en sommeil.
 RP0, RP1 (Register bank select) : ces deux bits permettent d’indiquer dans quel bloc de RAM
on veut travailler. Si RP0 et RP1 sont à 0 on utilise le bloc 0. Si RP0 et RP1 sont à 1 on utilise
le bloc 4.
 IRP (Indirect RP) : permet de choisir quel bloc de RAM on veut utiliser en cas d’adressage
indirect.

3.7. LES DIFFERENTS MODES D’ADRESSAGE

3.7.1. Adressage immédiat


Le code opératoire est suivi par l’opérande et ne fait appel à aucune adresse. L’opérande est la valeur à
utiliser par l’instruction.

Exemple :
MOVLW 0x34 ; charge la valeur hexadécimale 34 dans l’accumulateur

3.7.2. Adressage direct

L.HACINI MCIL3_Les Microcontrôleurs Page 12


Chapitre 3 Programmation et jeu d’instructions du microcontrôleur 16F877

Le code opératoire est suivi d’un octet non signé qui est l’adresse effective de l’opérande à traiter.
L’opérande est l’adresse de la valeur à utiliser par l’instruction. L’adresse écrite sur 7 bits est
complétée, en adressage direct, par les bits RP0 et RP1 du registre STATUS.
Exemple :
MOVF 0x5,W ; charge l’accumulateur W avec la donnée située dans la case mémoire 5.
Si RP0 et RP1 sont à 0, l’adresse 5 est celle du port A dans le bloc mémoire 0 et si RP0 est à 1 et RP1
est à 0, l’adresse 5 devient 85, c’est l’adresse du registre TRISA dans le bloc 1.

3.7.3. Adressage indirect


L’adresse de l’opérande est écrite avec un pointeur d’adresse. L’adressage indirect utilise deux registres
du microcontrôleur : INDF et FSR.
INDF(INDirect File) est à l’adresse 0h. Ce registre est utilisé pour accéder à la donnée pointée par le
registre pointeur d’adresse FSR.
Pour accéder à la donnée contenue dans la case mémoire X, il suffit d’écrire dans le registre FSR
l’adresse X. en lisant le registre INDF, on trouve la valeur contenue dans la case mémoire X.
Le contenu du registre FSR pointe sur une adresse écrite sur 8 bits. Or, la zone RAM contient 4 blocs
(PIC 16F877). L’adresse complète est donc sur 9 bits réalisée par l’ajout du bit IRP du registre
STATUS.

Exemple :
Le registre à l’adresse 7 contient 0x0A.
Pour lire le contenu de cette case il suffit d’écrire 7 dans le FSR, puis de lire le contenu de INDF. En
incrémentant le contenu de FSR, on accédera au contenu de la case mémoire 8.

3.7.4. Adressage relatif


Ce mode d’adressage s’applique aux opérations de branchement ou de saut CALL et GOTO. Il permet
de faire exécuter des instructions placées dans une autre portion de l’espace mémoire de programme
que celle où se déroule le programme en cours. Cela en modifiant le contenu du compteur de
programme. L’adresse de la prochaine instruction à exécuter sera calculée en additionnant le contenu
du compteur de programme avec la valeur du déplacement additionnée de un. Le déplacement est un
octet en binaire signé généralement calculé en fonction d’une étiquette.

Exemple :
etiq decfsz T1,f
goto etiq

L.HACINI MCIL3_Les Microcontrôleurs Page 13


Chapitre 3 Programmation et jeu d’instructions du microcontrôleur 16F877

Pendant l’assemblage l’étiquette etiq sera remplacée par la valeur du déplacement qui additionnée au
contenu du compteur de programme permettra à l’unité centrale d’effectuer l’instruction decfsz T1,f.
3.8. FORMAT DES INSTRUCTIONS
Une instruction est codée en un seul mot de 14 bits composé :
 D’un code opération ou code machine, disposé sur les bits de poids forts du mot, précisant le
type d’instruction.
 D’une ou plusieurs opérandes codées sur les bits restants précisant l’opération de l’instruction.
On distingue trois grands types d’instruction :
3.8.1. Opérations orientées mots des registres
Dans ce cas des instructions orientées mot, selon l’état du bit du rang 7 de l’instruction, le résultat de
l’instruction sera logé dans l’accumulateur W si d=0 ou dans le registre considéré de la zone mémoire
si d=1.

Exemple :
ADDWF 0x40,1
Cette instruction accomplit l’addition : W+(0x40)  (0x40)
Son codage sur 14 bits est :
ADDWF d 0x40
000111 1 1000000
3.8.2. Opérations de manipulations de bits
L’adresse du bit est écrite sur 3 bits et l’adresse du registre sur les 7 bits de poids faible

Exemple :
BCF 0x40, 3 ; met à 0 un bit dans le registre (0x40)
Son codage sur 14 bits est :
BCF 3 0x40
0100 011 1000000
3.8.3. Opérations de branchement
L’adresse de destination sur 11 bits ne permet qu’un saut à l’intérieur d’une page de mémoire (2Ko).
Pour accéder à une adresse plus lointaine il faut mettre en œuvre les bits b3 et b4 du registre PCLATH.
Exemple :
goto etiq ; etiq est l’étiquette correspondant à la destination
Son codage sur 14 bits est :
101 xxxxxxxxxxx
Code machine adresse de destination

L.HACINI MCIL3_Les Microcontrôleurs Page 14