You are on page 1of 5

Structure dun programme en assembleur

Microchip propose pour le dveloppement de ses microcontrleurs, un environnement de


dveloppement intgr ou IDE, sous la forme dun logiciel du nom de MPLAB, tlchargeable
gratuitement sur le site de Microchip.
MPLAB permet, entre autres, de dvelopper des programmes en assembleur grce un diteur de
code source et au langage MPASM. Ce dernier permet un certain nombre de facilits, dont nous
allons voir les plus usuelles.
Pour plus dinformation on se rfrera laide MPASM dans Mplab (menu Help ou encore dans le
document MPASM/MPLINK PICmicro MCU Quick Chart .

1 Exemple dun programme simple


Programmer un microcontrleur consiste crire une suite de 0 et de1 en mmoire programme.
Cette suite sera dcrite dans un fichier .hex gnr par MPLAB partir de lassociation de
mnmoniques et de directive dassemblage.
On trouvera ci-aprs un programme simple permettant de faire basculer la sortie RB7 du port B dun
microcontrleur PIC16F877.
;********************************************************************************:
; Ce programme gnre une horloge en RB0
; de frquence 24 fois plus faible que celle du quartz.
*
; il utilise la carte PicDem2Plus quipe d'un PIC16F877A
*
;********************************************************************************

commentaires

LIST P=16F877A
; directive qui dfinit le processeur utilis
#include <P16F877A.INC>
; fichier de dfinition des constantes
fichiers den-tte
;******************************************************************************
;
BITS DE CONFIGURATION
;******************************************************************************
__CONFIG _HS_OSC & _WDT_OFF & _CP_OFF & _CPD_OFF & _LVP_OFF
; _XS_OSC l'oscillateur est configur en oscillateur quartz haute frquence
configuration
; _WDT_OFF le watchdog est dsactiv
matrielle
; _CP_OFF le code de protection de la mmoire programme est dsactiv
; _CPD_OFF le code de protection de la mmoire EEPROM est dsactiv
; _LVP_OFF la programmation basse tension est dsactive
; ces oprations sont ncessaires pour fonctionner en mode "debug"
;********************************************************************************
;
DEMARRAGE SUR RESET
*
;********************************************************************************
org
0x0
; Adresse de dpart aprs reset
adresses en ROM
goto
debut
org
0x10
; adresse de dbut du programme
debut
tiquette
;********************************************************************************
;
INITIALISATION
*
;********************************************************************************
; initialisation du PORTB en sortie (voir datasheet)
Denis Rabast
IUFM Aix Marseille

programmation des microcontrleurs PIC

1/5

structure dun programme en assembleur

bcf
bcf
clrf
bsf
movlw
movwf
bcf

STATUS, RP0
STATUS, RP1
PORTB
STATUS, RP0
b'00000000'
TRISB
STATUS, RP0

; passage en banque 0
; RAZ des bascules D
; passage en banque 1
; PORTB en sortie
; retour en banque 0

;********************************************************************************
;
PROGRAMME PRINCIPAL
*
;********************************************************************************
boucle
bsf
PORTB,0
; mise 1 de la sortie
nop
; 2 temps morts pour compenser le saut
nop
bcf
PORTB,0
; mise 0 de la sortie
fin de programme
goto
boucle
; rebouclage
END
; directive signalant la fin du programme
;*******************************************************************************

1.1

Commentaires et tiquettes

Les commentaires, aprs un ; sont essentiels pour la comprhension du programme et pour son
dbogage.
Les tiquettes renvoient des adresses en mmoire programme, sans avoir se proccuper du
changement de cette adresse lorsquon ajoute ou retire des instructions.

1.2

Les fichiers den-tte (header files)

Il faut dans un premier temps prciser au compilateur quel processeur nous allons utiliser ; cest le
rle de la directive LIST .
Le programme prcdent utilise un certain nombre de constantes (STATUS, PORTB, TRISB)
associes des registres du PIC, donc des adresses ;
Ces associations sont dcrites dans le fichier include (par exemple P16F877A.INC pour un
16F877A). Ce fichier est localis dans le dossier c:\Program Files\Microchip\MPASM suite et
peut tre lu avec un diteur de texte.
On trouvera ci-aprs un extrait de ce fichier o lon peut voir la dfinition des adresses des registres,
et la position des bits dans le registre (ici le registre STATUS).
;----- Register Files-----------------------------------------

;----- STATUS Bits ---------------------------------------

INDF
TMR0
PCL
STATUS
FSR
PORTA
PORTB
PORTC
PORTD

IRP
RP1
RP0
NOT_TO
NOT_PD
Z
DC
C

1.3
1.3.1

EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU

H'0000'
H'0001'
H'0002'
H'0003'
H'0004'
H'0005'
H'0006'
H'0007'
H'0008'

EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU

H'0007'
H'0006'
H'0005'
H'0004'
H'0003'
H'0002'
H'0001'
H'0000'

Les directives
La directive Config

Elle permet de paramtrer le registre de configuration (ce registre est dtaill au chapitre Special
Features of CPU de la documentation) par une instruction du type :
Denis Rabast
IUFM Aix-Marseille

programmation des microcontrleurs PIC

2/5

structure dun programme en assembleur

__Config _CP_OFF & _PWRTE_ON & _WDT_OFF & _HS_OSC


(Attention : il y a deux _ avant Config )
Ce registre est crit une fois pour toutes la programmation et nest plus accessible par la suite ; il
permet de paramtrer matriellement le PIC :
- configuration de loscillateur ;
- mise en service ou non du chien de garde ;
- mode de fonctionnement au dmarrage
1.3.2

La directive EQU dassignation

Elle permet dassigner des valeurs (comme dans le fichier .inc ), par exemple :
MASQUE EQU 0X45
Il sagit la fois dune facilit dcriture et un outils prcieux pour la comprhension (et donc le
dbogage ) dun programme.
1.3.3

Les dfinition par #define

Fonctionne comme lassignation mais pour un texte. Dans notre programme nous aurions pu crire
par exemple :
#DEFINE SORTIE PORTB,0
et remplacer ensuite bsf PORB,0 par :
bsf

SORTIE

1.3.4

Les macro-instructions

Elles permettent de remplacer une srie dinstruction par un texte ; attention ce nest quune facilit
dcriture qui ne diminue pas la taille du programme comme le ferait un sous programme. ; exemple :
Macro1 macro
Suite dinstructions..
edm
; fin de la macro
Lexcution est cependant plus rapide que lors de lappel dun sous programme.
Remarque : il est possible de dclarer des tiquettes qui seront propre la macro (et qui pourront
donc avoir le mme nom quune autre tiquette du programme sans risque de confusion) par
linstruction local
exemple :
local
boucle
1.3.5

La dclaration des variables

Permet de dfinir une zone de variables en RAM, lemplacement et la taille de ces variables ;
exemple :
CBLOCK
0x20
Variable1 : 1
Variable2 : 1
tableau : 8
ENDC
Denis Rabast
IUFM Aix-Marseille

; dbut de la zone variable


; Variable1 a une taille de 1 octet
; Variable2 a une taille de 1 octet
; tableau est une variable de 8 octets
programmation des microcontrleurs PIC

3/5

structure dun programme en assembleur

Il faut veiller ce que lendroit choisit ne soit pas dj occup par un registre. Par exemple, sur un
PIC16F877A, on peut dfinir une zone de 96 octets partir de ladresse 20h.
1.3.6

Les directive ORG et END

La directive ORG permet de prciser quel endroit en ROM son places les lignes de programme qui
suivent. Sur un PIC, aprs un RESET, le compteur programme pointe ladresse 0x00 ; de plus
ladresse 0X04 se trouve le vecteur dinterruption. Le programme commencera donc de la manire
suivante :
org

0x00
goto dbut

org
dbut
.
end

1.4
1.4.1

0x10

; adresse point aprs un reset ;


linstruction qui va suivre se trouvera cette adresse
;saut ltiquette marquant le dbut du programme
; cette adresse doit tre suprieure 0x04
; tiquette marquant le dbut du programme
; fin du programme

Les rgles dcriture


Lcriture des variables

MPLAB permet de dfinir un radix par dfaut ; cette option peut tre modifie par Project \ build
options \ project \ MPASM assembleur ; cependant, afin damliorer la portabilit des
programmes, il est conseill de toujours prciser le radix des paramtres.
0x1A ou
B10101111
D12 ou
AC ou C
1.4.2

H1A

ou

1Ah

: notation hexadcimale ;
: notation binaire ;
: notation dcimale.
: code ASCII

.12

La casse

Par dfaut MPLAB est sensible la casse. Cette option peut tre modifie par project \ build
options \ project \ MPASM assembleur .

2 Programmes classiques, astuces et limitations


2.1

Comparer deux nombres

Le principe consiste soustraire les deux nombres et observer les bits Z et C du registre dtat.
movf nb1, w
subwf nb2, w

; mettre nb1 dans w


; soustraire nb2-nb1

Si Z=1, les nombres sont identiques ;


si Z=0 et C=1 , le rsultat est positif, donc nb2 est suprieur nb1,
si Z=0 et C=0 , le rsultat est ngatif, donc nb1 est suprieur nb2,

2.2

Soustraire une valeur du registre de travail

Linstruction sublw 8 soustrait le contenu de w 8, soit (w)-8, si on souhaite faire 8-(w), il faut
ajouter le complment 2 de 8 au contenu de w, soit addlw 8 .

Denis Rabast
IUFM Aix-Marseille

programmation des microcontrleurs PIC

4/5

structure dun programme en assembleur

2.3

Pointer un tableau en mmoire programme

Linstruction retlw revient dun sous programme en plaant un argument dans le registre W . On
appelle dans un premier temps lendroit o se trouve le tableau, tout en plaant dans W le numro
de la ligne du tableau :
movf
call

n_ligne,W
SUITE_Fbnc

; W pointe la ligne du tableau


; recherche du contenu de la ligne

Une fois arriv ladresse SUITE_Fbnc , on ajoute au compteur programme le contenu de W ,


ce qui permet de sauter la ligne qui nous intresse, dont linstruction revoie largument au
programme principal en le plaant dans W .
SUITE_Fbnc
ADDWF
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW

2.4

PCL,F
d'01'
d'01'
d'02'
d'03'
d'05'
d'08'

; premire ligne
; seconde ligne
; troisime ligne
; quatrime ligne
; cinquime ligne
; sixime ligne

Effacer la RAM par adressage indirecte

A la mise sous tension se trouvent des valeurs quelconques dans la RAM : pour mettre toute ces
valeurs 0 on peut utiliser une variable qui devra pointer les emplacements effacer et qui devra tre
incrmente. Cette variable ne peut se situer en RAM sous peine dtre efface son tour, do
lutilisation de ladressage indirecte Lexemple de programme suivant concerne un 16F84 dont la RAM
utilisateur se situe en banque 0 entre les adresse 0x0C et 0x4F inclues.
daprs BIGONOFF (http://www.abcelectronique.com/bigonoff/ )

Denis Rabast
IUFM Aix-Marseille

programmation des microcontrleurs PIC

5/5

You might also like