Vous êtes sur la page 1sur 17

Chapitre III Programmation en Assembleur PIC

III.1 Généralités

Un programme en Assembleur PIC est une suite d’instructions et de directives.


Chaque ligne comporte une instruction qui réalise une fonction bien déterminée et
manipule ainsi des données et des adresses.
Un microcontrôleur PIC est un composant RISC : 35 instructions dans le cas de la
famille Mid-Range (16F8xxx).

III.2 Le jeu d’instructions

Le jeu d’instructions se définit comme étant l’ensemble des instructions compréhensibles


par la machines.

III.2.1 Organisation des instructions

Au niveau des instructions, nous utilisons des mnémoniques et des lettres :

f est un registre (adresse d’un registre GPR ou l’un des registres SFR).
b représente un numéro de bit en sachant que 0 correspond toujours au bit de
poids faible (le plus à droite dans le registre).
k est une littéral (valeur immédiate de 0 à 255).
W registre de travail.
d est un bit de destination, Si d est à 0, le résultat de l’opération est placé dans le
registre de travail W, la valeur dans le registre f est alors inchangée, alors que si
d est à 1, le résultat de l’opération est placé dans le registre f.

Exemple :

Soit les 03 instructions suivantes :

ADDWF f, d ; W+f → W si d=0 ou W+f → f si d=1

BCF f, b ; 0 → b (f) (On met à 0 le bit b du registre f)

ADDLW k ; W+k → W On ajoute au registre de travail la valeur k et on

place le résultat dans le registre de travail W

SMAANI Billel 23 FT/UMBB


Chapitre III Programmation en Assembleur PIC

On note qu’une instruction est un code mnémonique qui s’écrit du gauche vers la droite en
manipulant des opérandes (registre SFR ou GPR, une valeur littéral, etc.)

III.2.2 Les types des instructions

Il existe 4 types d’instructions :

Les instructions « orientées octet ».


Les instructions « orientées bits ».
Les instructions générales (littérales).
Les instructions de sauts et d’appels de sous-routines.

III.2.2.1 Les instructions « orientées octet »

Ce sont des instructions qui manipulent des données sous forme d’octets. Elles sont
codées au niveau de la mémoire programme (FLASH) de la manière représentée sur la figure
III.1.

Figure. III.1 Codage des instructions « orientées octets » dans la mémoire programme

On remarque que :

6 bits pour codés la mnémonique de l’instruction (OPeration CODE), cela car


comme il y a 35 instructions, il faut 6 bits pour pouvoir les coder toutes
1 bit de destination (d) : 0 indique que le résultat de l’opération sera placé dans le
registre de travail W (Work), 1 indique que ce résultat sera placé dans l’opérande
précisée dans les 7 bits suivants
7 bits pour encoder l’opérande (File) : Si d vaut 1, cette opérande renseigne à la
fois la donnée à manipuler et également l’endroit où le résultat sera stocké.

SMAANI Billel 24 FT/UMBB


Chapitre III Programmation en Assembleur PIC

Exemple :

Soit les 03 instructions suivantes :

CLRW ; Effacer le contenu du W

ADDWF FSR, 0 ; W+FSR et le résultat dans W

MOVWF PORTA ; Transférer le contenu du W vers PORTA

L’ensemble des instructions « orienté octet » sont représentées sur le Tableau III.1.

Tableau. III.1 Les instructions « orienté octet »

III.2.2.2 Les instructions « orientées bits »

Ce sont des instructions qui manipulent des données sous forme de bits. Elles sont
destinées à modifier des bits précis d’un registre spécifié.

Elles sont codées de la manière représentée sur la figure III.2.

Figure. III.2 Codage des instructions « orientées bits » dans la mémoire programme

SMAANI Billel 25 FT/UMBB


Chapitre III Programmation en Assembleur PIC

Dans ce cas :

4 bits pour la mnémonique de l’instruction (dans l’espace resté libre par les
instructions précédentes).
3 bits pour indiquer le numéro du bit à manipuler (bit 0 à 7 possible.
7 bits pour indiquer l’opérande.

Exemple :

Soit les 02 instructions suivantes :

BSF STATUS, 2 ; positionne le bit 2 du STATUS à 1

BCF STATUS, 5 ; positionne le bit 5 du STATUS à 0

Les quatre instructions « orienté bits » sont représentées sur le Tableau III.2.

Tableau. III.2 Les quatre instructions « orienté bits»

III.2.2.3 Les instructions générales

Ce sont les instructions qui manipulent des données aussi appelée littérale (0 k 255)

Elles sont codées de la manière représentée sur la figure III.3.

Figure. III.3 Codage des instructions générales dans la mémoire programme

Dans ce cas :

6 bits pour coder l’instruction (OPeration CODE)

SMAANI Billel 26 FT/UMBB


Chapitre III Programmation en Assembleur PIC

8 bits pour coder la valeur concernée (valeur dite « littérale ou immédiate » parce
que se trouvant immédiatement dans l’instruction). La valeur peut de fait varier de
0 à 255.

Exemple :

Soit l’instruction suivante :

MOVLW 0x5A ; Transférer la valeur 5AH vers W

ADDLW 0x09 ; 09H+W

ANDLW 0x03 ; (03H) AND (W)

L’ensemble des instructions générales sont représentées sur le Tableau III.3.

Tableau. III.3 Les instructions générales

III.2.2.4 Les instructions de sauts et d’appels de sous-routines

Ce sont deux instructions (CALL et GOTO) provoquent une rupture dans la séquence de
déroulement du programme. Elles sont codées de la manière suivante :

Figure. III.4 Codage des instructions de saut et d’appel dans la mémoire programme

Dans ce cas :

3 bits pour coder l’instruction (OPeration CODE)

SMAANI Billel 27 FT/UMBB


Chapitre III Programmation en Assembleur PIC

11 bits pour coder l’adresse de la destination.

1. L’instruction GOTO

Elle permet d’effectuer un saut dans le programme pour aller à l’adresse pointé par le
Label (étiquette) précisé dans GOTO.

Exemple :

Etq1

DECFSZ FSR ; décrémenter FSR jusqu’à 0

GOTO Etq1 ; allez vers ETq1, sortir de la boucle si FSR est égal à 0

xxx ; suite du programme

2. L’instruction CALL

Elle permet d’appeler un sous programme (avec Label ou étiquette).

On sauvegarde l’adresse de retour dans la PILE, puis on appelle le sous programme


définit avec l’étiquette (label).

Exemple :

xxx ; instruction quelconque

CALL tempo ; appel du sous-programme

xxx ; instruction quelconque

CALL tempo ; appel du sous-programme

xxx ; instruction quelconque, le programme continue ici

tempo ; étiquette de début de la sous-routine

movwf compteur ; initialiser compteur de boucles

return

SMAANI Billel 28 FT/UMBB


Chapitre III Programmation en Assembleur PIC

Tableau. III.4 Jeu d’instructions complet

Où,

1. k est une litéralle (valeur immédiate de 0 à 255).


2. f adresse mémoire de registre (ou l’un des registre SFR : STATUS, TRISA, etc).
3. d est un bit de destination. Si d est à 0, le résultat dans W, sinon dans f.
4. b est le muméro de bit choisi.
5. Instructions en 1 cycle (sauf les instructions de saut ou d’appel).

SMAANI Billel 29 FT/UMBB


Chapitre III Programmation en Assembleur PIC

III.3 Les modes d’adressage

Les modes d’adressages sont les différents moyens permettant au microcontrôleur


d’accéder aux opérandes en vue de tester ou de modifier le contenu d’un registre (SFR, GPR)
ou d’une littéral.

De manière générale, Il existe 3 modes d’adressage:

Mode d’adressage littéral (immédiat),


Mode d’adressage direct,
Mode d’adressage indirect,

III.3.1 L’adressage littéral (immédiat)

Dans ce cas, la donnée est contenue dans l'instruction (signaler par L).

Exemple :

MOVLW 0x24 ; Transfert la valeur 0x24 dans W (instruction est MOVLW k)

III.3.2 L’adressage direct

La donnée est contenue dans un registre, ce dernier peut être définit par un nom (registre
SFR) ou repérer à travers une adresse mémoire (registre GPR).

Exemple :

MOVWF 0x0C ; Transférer la valeur contenue dans W à l'adresse registre H’0C’.

On note que,

L’instruction : MOVWF f ; placer le contenu de W vers l’adresse registre f

MOVF f, d ; déplacer f , selon d

III.3.3 L’adressage indirect

L'adresse de la donnée est contenue dans un pointeur, qui est le registre FSR. Et l’accès à
ce dernier est réaliser avec le registre INDF.

SMAANI Billel 30 FT/UMBB


Chapitre III Programmation en Assembleur PIC

Le FSR est un registre de sélection de registre. Donc, il contient l’adresse d’un autre
registre (adressage indirect).

En utilisant l'adressage direct, on peut écrire dans le FSR l'adresse du registre à atteindre.
(FSR contenant 8 bits).

L'accès au registre d'adresse contenue dans FSR se fait en utilisant le registre INDF. Il se
trouve à l'adresse 0 dans les deux banques. Il ne s'agit pas d'un registre physique. On peut le
voir comme un autre nom de FSR, utilisé pour accéder à la donnée elle-même, FSR servant à
choisir l'adresse.

Exemple :

MOVLW 0x1A ; Charger 1Ah dans W

MOVWF FSR ; Transférer le contenu de W (contenant 1Ah) vers FSR

MOVF INDF, 0 ; Transférer la valeur contenue à l'adresse 1Ah vers W

On note que l’adressage indirect fait appel à deux registres: FSR et INDF.

Le registre FSR : il contient l’adresse d’un autre registre.


Le registre INDF (INDirect File) : il est utilisé pour l’accès particulier à FSR.

III.4 Structure d’un programme en Assembleur PIC

Un programme en Assembleur PIC est constitué d’instructions et de directives écrites


ligne par ligne.

Dans ce cas, un programme en Assembleur peut être partagé en trois colonnes :

Colonne 1 : étiquettes (ou Label)


Colonne 2 : instructions
Colonne 3 : Commentaires

Ceci comme montre l’exemple ci-dessous.

SMAANI Billel 31 FT/UMBB


Chapitre III Programmation en Assembleur PIC

Example:

MOVLW 0x1A ; Charger 1Ah dans W

MOVWF FSR ; Transférer le contenu de W vers FSR

MOVF INDF, 0

Etq_1

BTFSS PORTA, 02 ; Tester le bit 2 du PORTA si égal à 1 (sortir si Oui)

GOTO Etq_1

Colonne 1 Colonne 2 Colonne 3

III.4.1 Les étiquettes

Dans le cas d’un saut dans le programme pour aller à un autre endroit du code, on doit
utiliser une étiquette (LAbel) sous forme d’un nom, ceci afin de préciser l’adresse de l’endroit
souhaité. Comme présent l’exemple ci-dessous.

Exemple :

bcl_1

DECFSZ 0x0C ; décrémenter FSR, sauter de la boucle si 0

GOTO bcl_1 ; allez vers bcl_1

On note que les deux instructions GOTO et CALL nécessitent des étiquettes.

III.4.2 Les instructions

Les instructions formant la partie la plus significative du programme en Assembleur. Le


jeu d’instructions du PIC considéré est déjà détaillé dans le présent chapitre.

III.4.3 Les directives

Les directives permettent d’orienter l’Assembleur à la manière de travaille ou de


fonctionnement. On note également que les directives ne sont pas traduites en code
d’opération (OPCODE), comme le cas des instructions.

SMAANI Billel 32 FT/UMBB


Chapitre III Programmation en Assembleur PIC

Il existe plusieurs directives telles que : LIST, INCLUDE, CONFIG, ORG, etc.

III.4.3.1 La directive LIST

Cette directive est souvent insérée à la tète du programme Assembleur, elle permet de
définir le type du microcontrôleur considéré.

Ceci de la manière suivante : list p=16F84a

III.4.3.2 La directive INCLUDE

Cette directive permet d’introduire un fichier nécessaire au fonctionnement du PIC et qui


doit être bien définit, comme l’exemple du fichier d’extension ’’.inc’’.

Ceci de la manière suivante : #include p16F84a.inc

III.4.3.3 La directive CONFIG

Elle permet de définir l’état des bits de configuration du PIC, ces bits sont relatifs au
fonctionnement du microcontrôleur (comme : le type de l’oscillateur, le code de protection,
etc.).

Ceci de la manière suivante :

__config _LP_OSC & _PWRTE_OFF & _WDT_OFF & _CP_OFF

III.4.3.4 La directive ORG

Elle permet d’arranger l’ensemble des instructions du programme dans la mémoire à


partir de l’adresse définie par cette directive.

Ceci de la manière suivante : org 0x10 ; dans ce cas à partir de l’adresse H’10’

III.4.3.5 La directive END

Cette directive définie l’emplacement où on doit arrêter l’assemblage du programme.


Dans ce cas, on écrit simplement END.

SMAANI Billel 33 FT/UMBB


Chapitre III Programmation en Assembleur PIC

III.4.3.6 La directive EQU

C’est une directive d’assignation. Suivez l’exemple ci-dessous.

Exemple :

FSR EQU H'04' ; FSR est égal à l’adresse 05 en Hexa.

III.4.3.7 La directive DEFINE

C’est une directive d’assignation qui permet de réaliser une substitution. Afin de bien
comprendre, suivez l’exemple ci-dessous.

Exemple :

#DEFINE un_bit PORTA,1

BSF un_bit

Après l’exécution de ces deux instructions, le bit numéro 1 du port A est égal 0.

III.4.4 Les commentaires

Il s’agit de petites phrases descriptives précédées par des ’’ ;’’.

III.4.5 La création de MACRO et de zones de variables

Afin de remplacer une partie d’un programme qui se répète dans le programme principal,
on peut utiliser un ‘’macro’’, cela en utilisant deus directives : MACRO et ENDM.

En effet, le nom du ‘’macro’’ doit être définit avant la directive MACRO, Puis, on rajoute
des instruction, et vers la fin, il faut mettre ENDM. Comme montre l’exemple ci-dessous.

Exemple :

allum macro ; définition d’un macro avec le nom : allum

MOVLW B’11111’ ; les instructions

MOVWF PORTA

endm ; Fin du macro

SMAANI Billel 34 FT/UMBB


Chapitre III Programmation en Assembleur PIC

Par la suite du programme, chaque fois que nous trouvons ‘’allum’’ c’est l’équivalent de
l’exécution des deux instructions du petit programme ci-dessus.

D’une autre part, il existe des programmes qui nécessitent l’utilisation de variables. Pour
cela, il faut créer des emplacements mémoires afin de placés ces variables. De plus, il faut
utiliser les emplacements des registres GPR de la mémoire RAM (du 0CH vers 4FH).

La création de zone de variables est réalisée avec la directive CBLOCK. Après cette
directive, il faut rajouter l’adresse du début (0x0C). Puis il faut déclarer les variables et à la
fin, mettez ENDC (fin de la zone).

Suivez l’exemple ci-dessus.

Exemple :

CBLOCK 0x0C. ; Début de la zone de variables

un_bit :1 ; déclaration d’une zone de 1bit nommé un_bit

tableau : 8 ; déclaration d’une zone de 8bit nommé tableau

ENDC ; Fin de la zone de variables

III.5 Exemples de programmes en Assembleur PIC

III.5.1 Allumage des LEDs

Nous voulons écrire un programme en Assembleur PIC permettant au microcontrôleur


PIC16F84 d’allumer les LEDs reliées au port B (figure III.5).

Figure. III.5 Schéma du circuit considéré (Exemple 1)

SMAANI Billel 35 FT/UMBB


Chapitre III Programmation en Assembleur PIC

L’organigramme du programme permettant au microcontrôleur PIC16F84 d’allumer les


LEDs est représenté sur la figure III.6.

Figure. III.6 Organigramme du programme permettant au PIC16F84 d’allumer les LEDs

Le programme en Assembleur permettant au microcontrôleur PIC16F84 d’allumer les


LEDs reliées au port B est présenté sur la figure III.7. Ce dernier est basé sur l’organigramme
montré sur la figure III.6.

On note que toutes les instructions et les directives utilisées dans ce cas du programme sont
détaillées au niveau de ce chapitre.

SMAANI Billel 36 FT/UMBB


Chapitre III Programmation en Assembleur PIC

; Allumage de LEDs du PORTB avec PIC16F84


; dirctives
list p=16f84
#include p16f84.inc
__config _LP_OSC & _PWRTE_OFF & _WDT_OFF & _CP_OFF

org 0x0 ; Adresse de départ après reset


goto debut
org 0x10 ; adresse de début du programme
debut

bcf STATUS, RP0 ; accès à la banque 0 (ou Page 0)


clrf PORTB ; Effacer PORTB
bsf STATUS, RP0 ; accès à la banque 1 (ou Page 1)
movlw b'00000000'
movwf TRISB ; PORTB en sortie
bcf STATUS, RP0 ; accès à la banque 0

boucle

movlw B'11111111' ; mise à a 1 de tous les bits PORTB


movwf PORTB

goto boucle ; rebouclage


END ; Fin

Figure. III.7 Programme permettant au PIC16F84 d’allumer des LEDs

III.5.2 Génération d’un signal d’horloge

Dans ce cas d’exemple, nous voulons écrire un programme en Assembleur PIC


permettant au PIC16F84 de générer un signal d’horloge via la pine RB0 (figure III.8).

Figure. III.8 Schéma du circuit considéré (Exemple 2)

SMAANI Billel 37 FT/UMBB


Chapitre III Programmation en Assembleur PIC

L’organigramme du programme permettant au PIC16F84 de générer un signal d’horloge


via RB0 est représenté sur la figure III.9.

Figure. III.9 Organigramme du programme Assembleur permettant au PIC16F84

de générer un signal d’horloge via RB0

Le programme en Assembleur permettant au PIC16F84 de générer un signal d’horloge


via la pine RB0 est représenté sur la figure III.10.

SMAANI Billel 38 FT/UMBB


Chapitre III Programmation en Assembleur PIC

; dirctives
list p=16f84
#include p16f84.inc
__config _LP_OSC & _PWRTE_OFF & _WDT_OFF & _CP_OFF

org 0x0 ; Adresse de départ après reset


goto debut
org 0x10 ; adresse de début du programme
debut

; initialisation du PORTB en sortie


bcf STATUS, RP0 ; accès à la banque 0 (ou Page 0)
clrf PORTB ; Effacer PORTB
bsf STATUS, RP0 ; accès à la banque 1 (ou Page 1)
movlw b'00000000'
movwf TRISB ; PORTB en sortie
bcf STATUS, RP0 ; accès à la banque 0

boucle
bsf PORTB,0 ; mise à 1 de la sortie RB0
nop ; 3 temps morts pour compenser le saut
nop
nop
bcf PORTB,0 ; mise à 0 de la sortie RB0
nop ; 3 temps morts pour compenser le saut
nop
nop
goto boucle ; rebouclage

END ; directive signalant la fin du programme

Figure. III.10 Programme Assembleur permettant au PIC16F84 de générer un signal d’horloge

via RB0

SMAANI Billel 39 FT/UMBB