Académique Documents
Professionnel Documents
Culture Documents
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.
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
………………….
………………….
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
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.
Exemple :
define led PORTA,3 ; led désigne le bit 3 du port A
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.
Exemple
AAA macro
Bsf PORTB,2 ; mise à 1 du bit 2 du port B
endm
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
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
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
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é
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
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
Exemple :
retlw 0xFF ; retour de sous-programme avec W contenant 0xFF
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.
Exemple :
MOVLW 0x34 ; charge la valeur hexadécimale 34 dans l’accumulateur
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.
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.
Exemple :
etiq decfsz T1,f
goto etiq
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