Vous êtes sur la page 1sur 40

Université Cadi Ayyad Marrakech

Faculté des Sciences et Techniques- Guéliz

Licence Sciences et Techniques IEEA


Année Universitaire 2009/2010

Microcontrôleurs
Partie I
Architecture et Initiation à la programmation
en langage assembleur

Y.ROCHDI
FST Marrakech/LST IEEA 2009/2010

1. Introduction:

Un microcontrôleur est un circuit à base de microprocesseur qui contient (dans le même boîtier):

• Une mémoire pour les données.


• Une mémoire pour le programme.
• Des ports d'entrées/sorties
• D'autres périphériques comme: des
temporisateurs, des convertisseurs
A<=>N, des interfaces de
communications séries, Ethernet,
radiofréquences, …

C'est un composant bon marché et nécessite peu de


composants périphériques autour de lui. De ce fait,
les microcontrôleurs sont très utilisés. Environ 40%
Extrait de www.microchip.com
des applications des microcontrôleurs concernent les
applications bureautiques: comme les PC, des
imprimantes à laser, des télécopieurs et des téléphones intelligents; 30% des applications concernent
les équipements électroniques pour le commun des utilisateurs: comme les équipements audio/vidéo,
les consoles de jeux, les machines à laver, les fours micro-ondes … Le reste concerne le marché des
télécommunications, l'automobile, et le domaine militaire.

Il existe différents types de microcontrôleurs fabriqués par divers fabricants. Ce cours traite
seulement les microcontrôleurs PICMicro™ de chez Microchip. Et même pour ce même fabriquant
plusieurs familles de microcontrôleurs existent; en effet, à l'inverse des microprocesseurs qui sont des
composants qui sont utilisés
dans les PC pour faire
exécuter différentes
applications, les
microcontrôleurs sont des
composants bien dédiés à des
applications spécifiques.
Ainsi, par exemple, un
microcontrôleur dédié à une
application de contrôle de
machines électriques sera
certainement doté d'un circuit
de commande à modulation de
largeur d'impulsions MLI
(Pulse With modulation
PWM), alors qu'un autre dédié
à une application de
Extrait de www.microchip.com
commande à distance sera
doté d'un émetteur/récepteur
radio fréquence.
Le site www.micochip.com donne tous les détails et informations techniques concernant cette famille
de microcontrôleurs, leurs applications courantes, des guides de choix, des outils pratiques:
Environnement de développement intégrés MPLAB®, des kits pour la programmation …
Le tableau qui suit résume les principales caractéristiques des microcontrôleurs PICMicro ™ 8bits.

1 Y.ROCHDI
FST Marrakech/LST IEEA 2009/2010

8-bit PIC® Architectures


Baseline Architecture Midrange Architecture Enhanced Midrange PIC18 Architecture
Architecture

Nbre de pins 6 – 40 8 – 64 8 – 64 18 – 100


Interruptions Non Une seule capacité Une seule capacité Multiple capacités d'interruption
d'interruption d'interruption avec sauvegarde avec sauvegarde matérielle du
matérielle du contexte contexte
Performance 5 MIPS 5 MIPS 8 MIPS 10 – 16 MIPS
Instructions 33, 12-bit instructions 35, 14-bit instructions 49, 14-bit instructions 75 - 83, 16-bit instructions
Mémoire de Up to 3 KB Jusqu'à 14 KB Jusqu'à 56 KB Jusqu'à 128 KB
Programme
Mémoire de Jusqu'à 138 Bytes Jusqu'à 368 Bytes Jusqu'à 4 KB Jusqu'à 4 KB
données
Caractéristiques ? petit facteur de forme ? Rapport performance/prix ? C-code Optimisé ? Pile à 32 niveaux, 8x8 hardware
? coût faible optimal. ? Pile améliorée à 16 niveaux multiplieur
? Ideal pour un fonctionnement ? Périphériques intégrés ? Adressage indirect amélioré ? C-code optimisé
sous batterie, ou pour application incluant SPI, I2C™, UART, ? Latence des interruptions ? Périphériques avancés incluant bus
avec contraintes d'espace. LCD, ADC réduite CAN, USB, Ethernet, touch sensing,
? Simple à utiliser ? Organisation simplifiée de la and LCD drivers
mémoire
Familles Inclut PIC10, PIC12 et PIC16 Inclut PIC12 et PIC16 Inclut PIC12F1xxx & PIC18 J-series pour les
PIC16F1xxx applications où le coût est important
avec un grand niveau d'intégration

PIC18 K-series pour les


applications à faible consommation
et hautes performances

2 Y.ROCHDI
3.

2. Architecture des microcontrôleurs PIC:

2.1. Architecture de Harvard:


A l'inverse des systèmes à microprocesseurs qui suivent le modèle de Neuman, où les données et le
programme se trouvent dans la même mémoire, les microcontrôleurs PIC® utilisent une architecture,
dite de Harvard, avec deux mémoires pour accélérer les traitements: une pour le programme et
l'autre pour les données:

Adresse Adresse
instruction données
Mémoire Mémoire
programme CPU données
des
ROM PIC
RAM
ou Mid-Range
EPROM
ou
Bus Bus
Flash instructions données

2.2. Jeu d'instructions réduit (Reduced Instructions Set Computer RISC) et format des
instructions:

Le jeu d'instructions est réduit au strict minimum (ensemble d'instructions de base) pour réduire le
temps de décodage de l'instruction: les PIC® de la gamme Mid-Range possèdent 35 instructions.
De plus chaque instruction est codée sur un mot de 14bits intégrant l'opérande, ainsi toute
l'information nécessaire pour exécuter l'instruction est contenue de ce mot. La mémoire programme est
organisée sous forme d'une suite de mots de 14bits. Le bus d'instructions est de largeur 14bits qui est
différente de la largeur du bus de données (8bits). La principale conséquence est que chaque
instruction s'exécute en un cycle processeur (à l'exception des instructions qui modifie le PC comme
les branchements).
Les instructions sont classées en quatre sous ensembles:

Les instructions 13 12 8 7 6 5 4 3 2 1 0
orientées octet

Code opération Adresse opérande (7bits)


Destination du résultat
=0 vers registre travail (w)
=1 vers mémoire (f)

13 12 8 7 6 5 4 3 2 1 0

Les instructions
orientées valeur
littérale
Code opération Valeur immédiate (littérale sur 8bits)

3 Y.ROCHDI
3.

13 12 10 7 6 5 4 3 2 1 0
Les instructions
orientées bit

Code opération Adresse opérande (7bits)

Numéro de bit concerné

13 12 11 10 9 7 6 5 4 3 2 1 0
Instructions de
branchement
Call ou Goto

Code opération Adresse immédiate (11bits)

2.3. Caractéristiques générales et Diagrammes blocs internes des PICS 16F84A et 16F877A:

Ce cours se limitera à l'architecture MidRange, en se basant sur deux PIC® 16F84A et 16F877A.
Les caractéristiques principales de ces deux pic sont résumées en Annexe.

Les deux pic possèdent des entités fonctionnelles identiques: une unité arithmétique et logique (ALU),
un accumulateur ou registre de travail (W working register), une mémoire flash pour le programme
d'instructions à 14bits, un compteur de programme (PC), une mémoire RAM pour les données et les
registres, une EEPROM pour les données à caractère permanent, un certain ensemble de port
d'entrées sorties (I/O Ports) et des temporisateurs (Timer). Le nombre de ces derniers est plus
important pour le 877A, qui se distingue aussi du 84A par d'autres périphériques: un convertisseur
analogique/numérique, deux ports série synchrone et asynchrone, un comparateur…

4 Y.ROCHDI
3.

5 Y.ROCHDI
3.

2.4. Organisation de la mémoire RAM:

La mémoire RAM des PIC est un espace de stockage pour les données utilisées par le programme lors
de l'exécution (GPR General Propose Register), mais une bonne partie des cases mémoires sont
réservées et utilisées comme des registres spéciaux (SFR Special File Register) qui contrôlent le

6 Y.ROCHDI
3.

comportement du PIC et de ces différents composants. Les PICs ont donc la particularité d'adresser
les registres comme des cases mémoires, et souvent le terme 'file register' prime devant le terme
'case mémoire'. En plus la RAM est organisée en banques (bank), comme le représentent les figures
suivantes:

Il est très important de comprendre l'origine de cette organisation et de bien maîtriser le mécanisme
d'adressage pour accéder à un registre (FSR) ou une case mémoire de donnée (GPR). En effet les
instructions des PIC utilisent une adresse des opérandes sur 7 bits, ce ci implique donc que l'on ne
peut adresser qu'un espace de 00h-7Fh (soit la capacité d'une seule banque). Pour avoir un espace
mémoire qui dépasse 128 octets, Microchip ™ a utilisé la structure en plusieurs banques de 128
octets, en trouvant un moyen de choisir une banque parmi les autres; ce moyen n'est autre que des
bits supplémentaires prélevés sur le registre STATUS: ces bits se nomment IRP, RP0 et RP1; pour
le 16F84A seul RP0 est utilisé.

7 Y.ROCHDI
3.

• 16F84A

• 16F877A

Mécanisme d'accès à la mémoire en mode d'adressage direct:


Il est nécessaire de positionner les bits
RP0 et RP1 (sur le registre STATUS) pour
activer d'abord une banque avant
d'accéder à une case mémoire dans cette
banque par un offset (sur 7 bits) inclus dans
l'instruction. Exemple:
Pour accéder au registre TRISA (adresse
85h) il faut mettre à 1 le bit RP0 de
STATUS pour un 16F84, et les deux bits
RP1-RP0 à 0-1 pour un 16F877. Nous
reparlerons plus en détail par la suite de
l'adressage indirect.

Notez que certains registres (comme PCL,


INTCON, …) sont accessibles de plusieurs
banques, ce ci permet de les atteindre sans
devoir changer de banque. C'est le cas aussi
pour des cases mémoires pour les données
(comme la zone 0Ch-4Fh est mappée sur la zone 8Ch-8Fh pour le 16F84, et la zone 70h-7Fh est
mappée sur les zones F0h-FFh, 170h-17Fh et 1F0h-1FFh).
Notez aussi que la mémoire pour les variables mémoires est de seulement 68octets pour le 16F84A
alors qu'elle est de 368octets (96+80+80+80+16+16) pour le 16F877A.
NB: Il est évident que le registre STATUS doit être accessible de toutes les banques!

Le rôle de chacun des registres sera expliqué par la suite chaque fois qu'on en aura besoin.

8 Y.ROCHDI
3.

2.5. Organisation de la mémoire programme Flash:

Les PIC16FXX ont un compteur de programme PC de 13 de bits capable d'adresser jusqu'à 8K x


14bits. Pour le PIC16F84A, seul le premier 1Kx14bits (0000h-03FFh) est physiquement
implémenté, alors que pour le PIC16F877 les 8K sont implémentés.
L'adresse 0000h constitue le vecteur RESET; Après une remise à zéro, l'exécution du programme
commence donc en 0000h. Alors que la routine d'interruption doit commencer à l'adresse 0004h;
l'adresse 0000h contient en général une instruction de saut vers un autre endroit de la mémoire ou se
trouve le programme d'initialisation puis le programme principal (main).
Le compteur de programme (PC) spécifie l'adresse de l'instruction qu'il faut aller chercher pour
l'exécution. Le PC est un registre de 13bits. L'octet poids faible est nommé PCL (adresse 02h ou
82h) et il est accessible en lecture/écriture. L'octet poids fort est nommé PCH; il contient les bits
<12:8> du PC et n'est pas directement accessible en lecture/écriture. Toutes les mises à jour au
registre de PCH passent par le registre PCLATH (adresse 0Ah ou 8Ah).

NB: l'incrémentation automatique du PC suite à l'exécution du programme n'affecte pas le PCH; ce ci


peut pauser certains problèmes lors des longs branchements comme nous allons le voir dans les
exemples de programmation.
En plus de la mémoire de programme les PIC possèdent une pile (STACK) utilisée pour sauvegarder
le PC lors des appels aux sous-programmes (CALL) ou lors des interruptions. La pile n'est pas
directement adressable. En plus elle est de 8 niveaux seulement: ce ci implique alors une limite de 8
appels aux sous programmes ou interruptions consécutifs.

9 Y.ROCHDI
3.

2.6. La mémoire EEPROM:

Cette mémoire de données (non volatile) n'est pas directement accessible comme la mémoire RAM.
Elle est indirectement adressée par les registres de fonction Spéciaux EEADR, EEDATA. Le
premier spécifie l'adresse dans l'EEPROM, et le second doit contenir la donnée à écrire ou lue. Le
contrôle d'accès à cette mémoire est configuré à travers deux registres EECON1 et EECON2.
L'EEPROM est de 64x8bits pour le 16F84A et de 256x8bits pour le 16F877A.

Pour le 16F877A, les registres EEADR et EEDATA associés à deux registres EEADRH et
EEDATH permettent de lire et écrire dans la mémoire programme (Flash) des mots de 14bits sur
un espace d'adressage de 8K.
Les mécanismes de lecture/écriture dans la EEPROM seront détaillés par la suite à travers des
programmes exemples.

3. Programmation des PICs:

La programmation d'un PIC passe par plusieurs phases:

i. Définir les connectivité physiques qui répondent aux exigences du projet en cours: les ports
I/O utilisés et leurs configurations, les périphériques utilisés.
ii. Ecrire le programme dans un langage évolué (comme C ou Basic) ou dans un langage bas
niveau en mnémonique puis utiliser un compilateur/éditeur de lien ou un assembleur pour
générer le code machine en hexadécimal.
iii. Tester le programme à l'aide d'un simulateur (mise au point à l'extérieur du PIC).
iv. A l'aide d'un programmateur (carte physique+logiciel de transfert) charger le programme
dans la mémoire programme du PIC.
v. Tester et debugger le fonctionnement du PIC dans sa carte d'exploitation.

Il existe plusieurs outils de développements permettant de réaliser les étapes précédentes (éditeur de
texte/ compilateur/assembleur/éditeur de liens/ simulateur/debugger) développés par différents
éditeurs de logiciels. Microchip ™ met gratuitement à la disposition des utilisateurs une suite complète
d'outils de développement appelée MPLAB IDE (Integretead developpement Environement),
téléchargeable sur le site web: www.microchip.com/mplab .
Dans ce cours nous utiliserons la programmation en langage bas niveau en mnémoniques. Nous
commencerons par présenter le jeu d'instructions des PIC Mid-Range, ensuite nous présenterons un
tutorial pour le MPLAB IDE, et enfin à l'aide d'exemples de programmation nous ferons le tour des
différentes caractéristiques des PIC.

10 Y.ROCHDI
3.

3.1. Jeu d'instructions:


Nous présentons en détail le jeu d'instructions pour la gamme Mid-Range 14bits des MicroPIC. Mais
il ne faut pas oublier que c'est à travers des exemples de programmation qu'on maitrise l'utilisation de
ces instructions.
Notations:
f : 'File' désigne une adresse (d'un registre SFR ou case mémoire libre GPR): sur 7 bits
d : désigne la destination d'u résultat; si d=0 le résultat de l'opération est stocké dans le registre W, si
d=1, la destination est le 'File' f.
b: désigne un numéro de bit dans un registre f.
k: une constante littérale sur 4bits
kk: une constante littérale sur 8bits
kkk: une constante littérale sur 12bits
r: un port d'entrée sortie
(.) : contenu de …

Mnemonic Description Function


ADDWF f,d Add (W) and (f ) d ←(W) +(f)
ANDWF f,d AND (W) and (f) d ←(W) .AND. (f )
CLRF f Clear f f ←0
CLRW Clear W W ←0
COMF f,d Complement f d ←.NOT.( f )
DECF f,d Decrement f d ←(f) - 1
DECFSZ f,d Decrement f, skip if zero d ←(f )- 1 , skip if (d)==0
si résultat=0 sauter l'instruction
suivante
INCF f,d Increment f d ←(f )+ 1
INCFSZ f,d Increment f, skip if zero d ←(f) + 1, skip if 0

11 Y.ROCHDI
3.

IORWF f,d Inclusive OR W and f d ←(W) .OR. (f )


MOVF f,d Move f d ←(f)
MOVWF f Move W to f f ←(W)
NOP No operation
RLF f,d Rotate left f
C b7 b0

register f

RRF f,d Rotate right f


C b7 b0

register f

SUBWF f,d Subtract W from f d ←(f ) - (W)


SWAPF f,d Swap halves f d ←(f(0:3)) ? (f(4:7) )
permutation des quartets poids faible
et poids fort
XORWF f,d Exclusive OR W and f d ←(W ).XOR.(f )

Mnemonic Description Function


BCF f,b Clear bit b of f f(b) ←0
BSF f,b Set bit b of f 1 ? f(b)
BTFSC f,b test bit b of f, skip if clear skip if f(b) == 0 si le bit b
du registre f est à 0 sauter
l'instruction suivante
BTFSS f,b test bit b of f, skip if set skip if f(b) == 1
si le bit b du registre f est
à 1 sauter l'instruction
suivante
Mnemonic Description Function
ADDLW kk Add literal to W W ←kk + (W)
ANDLW kk AND literal and W W ←kk .AND. (W)
CALL kkk Call subroutine PC + 1 ? TOS, PC ←kkk
TOS :Top Of Stack, au sommet de la pile
CLRWDT Clear watchdog timer 0 ? WDT (and Prescaler if assigned):
Prescaler: prédiviseur
GOTO kkk Goto address (k is eleven bits) kkk ? PC(11 bits)
IORLW kk Incl. OR literal and W W ←kk .OR. (W)
MOVLW kk Move Literal to W W ←kk
OPTION Load OPTION register OPTION Register ←W
RETFIE Return from Interrupt TOS ? PC, 1 ? GIE
GIE: General Interrupt Enable bit
RETLW kk Return with literal in W W ←kk, TOS ? PC
RETURN Return from subroutine TOS ? PC
SLEEP Go into Standby Mode 0 ? WDT, stop oscillator
SUBLW kk Subtract W from literal W ←kk – (W)
TRIS r Tristate port r WREG ? I/O control reg r
XORLW kk Exclusive OR literal and W W ←kk .XOR. (W)

NB: Microchip® recommande de ne plus utiliser les instructions TRIS et OPTION, car elles ne
sont pas compatibles avec tout les PIC 14bits!

12 Y.ROCHDI
3.

Descriptif détaillé des instructions:

ADDLW KK
ADD Literal to W
- Additionne de manière immédiate une constante littérale au contenu du registre W, et place le
résultat dans W.
- Le constante littérale est un mot de 8 bits (de 00 à FF).
- Cette instruction affecte 3 bits du registre d’état STATUT : C : Carry, DC : Digit Carry, Z : Zero
- Encodage de l’instruction :

14bits
11 111x kkkk kkkk binaire
3 E ? ? hexa

- Exemple
ADDLW 06 ; code de l'instruction sera 3E06
En supposant que W contienne 01 avant l’instruction, après l’instruction il contient 07 (en hexa : 06 +
01 = 07).
===================================================================
ADDWF F,d
ADD W to File
- Additionne le contenu du registre W au contenu de la case mémoire RAM à l’adresse F indiquée
comme premier paramètre de l'instruction; le résultat peut être, selon le deuxième paramètre d de
l'instruction, placé soit dans le registre W, soit dans la case mémoire RAM adressée (le résultat écrase
donc l’ancienne valeur).
- Cette instruction affecte 3 bits du registre d’état : C : Carry, DC : Digit Carry, Z : Zero
- Encodage de l’instruction:

14bits
00 0111 dfff ffff binaire
0 7 ? ? hexa

- Exemples de programmation :
MOVF 0x0C,W
ADDWF 0x4F,0 ; code 074F
ADDWF 0x4F,w ; même chose
L’exemple met dans W ce qui se trouve à l’adresse 0C, puis additionne W au contenu de l'adresse 4F,
et range le résultat dans W.

ADDWF 0x4F,1 ; fait a même chose mais range le résultat dans l'adresse 4F, code 07CF
ADDWF 0x4F,f ; même chose
===================================================================

ANDLW KK
AND Literal and W
-Effectue une opération logique ET (AND) entre la valeur immédiate de la constante littérale KK et
du contenu du registre W, le résultat est stocké dans W.
- La constante littérale est un mot de 8 bits (de 00 à FF)
- Cette instruction affecte le bit Z du registre d’état
- Encodage de l’instruction :

14bits

13 Y.ROCHDI
3.

11 1001 kkkk kkkk binaire


3 9 ? ? hexa

Exemple:
Cette instruction sert lorsque – dans un octet – on a besoin de forcer à 0 certains bits en particulier.
Pour cela il on utilise un masque, c’est à dire un octet composé de 1 (aux emplacements où se trouvent les bits à
ignorer) et de 0 (aux emplacements où se trouvent les bits qu’on veut forcer à 0).

ANDLW B'00001111' ; force le quartet de poids fort de W à 0 et laisse le quartet de poids fort inchangé
; ici la constante est exprimée en binaire
===================================================================

ANDWF F,d
AND W and File
- Effectue une opération logique ET (AND) entre le contenu du registre W et le contenu de la case
mémoire RAM à l’adresse indiquée par F. Le résultat peut être placé soit dans le registre W (si d=0 ou
w), soit dans la case mémoire RAM (si d=1 ou f).
- Cette instruction affecte le bit Z du registre d’état
- Encodage de l’instruction:

14bits
00 0101 dfff ffff binaire
0 5 ? ? hexa

- Exemple :
ANDWF 0x4F,0 ; code 054F , ou ANDWF 0x4F,w
ANDWF 0x4F,1 ; code 05CF , ou ANDWF 0x4F,f
===================================================================

BCF F, b
Bit Clear File
- Met à zéro le bit b désigné du contenu de la case en mémoire RAM à l’adresse indiquée F
- Encodage de l’instruction:

14bits
01 00bb bfff ffff binaire
1 ? ? ? hexa

- bbb Position du bit dans l’octet : de 000 à 111 (de 0 à 7), le bit de poids faible est le bit 0

- Exemple:
BCF 0x03, 5 ; met à 0 le bit 6ième bit du registre 0x03 c'est-à-dire met à 0 le bit RP0 du registre
; status, ce qui permet de se placer dans la banque 0 de la mémoire pour le
;16F84. code 1283

===================================================================

BSF F, b
Bit Set File
- Met à un le bit b désigné du contenu de la case en mémoire RAM à l’adresse indiquée F
- Encodage de l’instruction:

14bits
01 01bb bfff ffff binaire
1 ? ? ? hexa

14 Y.ROCHDI
3.

- bbb Position du bit dans l’octet : de 000 à 111 (de 0 à 7), le bit de poids faible est le bit 0

- Exemple:
BSF 0x03, 5 ; met à 1 le bit 6ième bit du registre 0x03 c'est-à-dire met à 1 le bit RP0 du registre
; status, ce qui permet de se placer dans la banque 1 de la mémoire pour le
;16F84. code 1683

===================================================================

BTFSC F,b
Bit Test File, Skip if Clear
- test l’état logique du bit b désigné du contenu de la case en mémoire RAM à l’adresse indiquée F,
S’il est à zéro, ignore l’instruction suivante, Sinon elle est exécutée.
- Si le bit testé est à zéro, l’instruction est exécutée en un cycle, sinon elle est en deux cycles, puisque le
compteur de programme PC est modifié.
- Encodage de l’instruction:

14bits
01 10bb bfff ffff binaire
1 ? ? ? hexa

Exemple (pour 16F877)

BSF 0x1F, 2
; met le bit 2 (Go/done) du registre ADCON0 pour démarrer une
;conversion analogique numérique
attente BTFSC 0x1F, 2 ; si le bit 2 est remis à zéro sauter l'instruction suivante (goto)
GOTO attente ; sinon la conversion n'est pas encore terminée à reprendre le test
MOVF 0x1E, w ; conversion terminée lecture de la valeur convertie
Dans cet exemple le code pour BTFSC sera 191F (bbb=010)
===================================================================

BTFSS F,b
Bit Test File, Skip if Set
- test l’état logique du bit b désigné du contenu de la case en mémoire RAM à l’adresse indiquée F,
S’il est à Un, ignore l’instruction suivante, Sinon elle est exécutée.
- Si le bit testé est à un, l’instruction est exécutée en un cycle, sinon elle est e n deux cycles, puisque le compteur
de programme PC est modifié.
- Encodage de l’instruction:

14bits
01 11bb bfff ffff binaire
1 ? ? ? hexa

Exemple (pour 16F877) : le même exemple que précédemment mais avec BTFSS

BSF 0x1F, 2
; met le bit 2 (Go/done) du registre ADCON0 pour démarrer une
;conversion analogique numérique
attente BTFSS 0x1F, 2 ; si le bit 2 est encore à 1 sauter l'instruction suivante (goto suite)
GOTO suite ; sinon la conversion est terminée à aller à suite
GOTO attente ; conversion pas encore terminée à reprendre le test
suite MOVF 0x1E, w ; conversion terminée lecture de la valeur convertie dans w
Dans cet exemple le code pour BTFSC sera 1D1F (bbb=010)
===================================================================

CALL adresse (ou label)


CALL subroutine

15 Y.ROCHDI
3.

- Appel d'un sous-programme.


- Le µC sauvegarde l’adresse de retour dans la pile (stack), puis charge dans le PC (Program Counter) l’adresse
du sous programme appelé (directement donnée dans l'instruction ou calculée par l'assembleur à partir du label
du sus programme).
- Tout sous-programme appelé par l’instruction CALL doit obligatoirement se terminer soit par l’instruction
RETURN, soit par l’instruction RETLW, qui renvoient permettent de restaurer à partir de la pile (stack) le PC et
de retourner continuer le programme appelant.
Ne pas confondre l’instruction CALL avec l’instruction GOTO.
- La pile (stack) est une zone de mémoire ne pouvant contenir que 8 mots de 13 bits, ce ci limite à 8 niveaux les
possibilités d’imbrication. S’il y en avait un neuvième, la première adresse de retour serait perdue...!!
- Cette instruction s'exécute en 2 cycles d’horloge.
- Encodage de l'instruction:

14bits
10 0kkk kkkk kkkk binaire
2 ? ? ? hexa

L'adresse 'kkkkkkkkkkk' comprise entre 000 et 7FF (8K) pour le 16F877A et seulement 000 et 3FF (1K) pour le
16F84A.

- Exemple:
CALL tempo ; appel du sous-programme de temporisation 'tempo'
….

tempo … ; début du sous-programme de temporisation


….
RETURN ; fin du sous-programme tempo
===================================================================

CLRF F
CLeaR File
- Met à zéro (Clear) le contenu de la case en mémoire RAM à l’adresse indiquée F
- Cette instruction affecte le bit Z du registre d’état (Z=1)
- Encodage de l’instruction :

14bits
00 0001 1fff ffff binaire
0 1 ? ? hexa

- Exemple:
CLRF 0x0B ; met à zéro le contenu de l'adresse 0x0B
CLRF INTCON ; équivalent à CLRF 0x0B, désactive toutes les interruptions
CLRF PORTB ; équivalent à CLRF 0x06, met à 0 tout les bits du port d'entrée/sortie B
===================================================================

CLRW
CLeaR W
- Met à zéro (Clear) le registre W.
- Cette instruction affecte le bit Z du registre d’état (Z=1)
- Encodage de l’instruction :

14bits
00 0001 0xxx xxxx binaire
0 1 0 0 hexa

x: quelconque 0 ou 1, c'est l'assembleur qui la fixe à pour Mpasm le code est 0103

- Exemple:

16 Y.ROCHDI
3.

CLRW ; met à zéro le registre W.


MOVFW 0x3F ; copie W dans l'adresse 0x3F
boucle INCF 0x3F ; incrémente le contenu de l'adresse 0x3F
BTFSS STATUS, 2 ; sortir de la boucle si le bit d'état Z=1, soit le passage du contenu de 0x3F de
; FF à 00
GOTO boucle
===================================================================

CLRWDT
CLeaR Wach Dog Timer
- Remet à zéro le compteur du chien de garde s'il est activé, si le pré diviseur est utilisé il est aussi réinitialisé à 0.
Le WatchDog Timer est un moyen pratique pour surveiller le bon déroulement d'un programme; grâce à des
instructions clrwdt bien placées dans le programme, si le programme effectue une séquence d'exécution
différente de ce qui est prévue (exemple une boucle infinie) et où on ne rencontre pas d'instructions clrwdt, le
compteur du chien de garde déborde et le programme est réinitilalisé.
- Cette instruction affecte deux bits du registre d’état : le flag TO (Time Out) passe à 1, le flag PD (Power
Down) passe à 1
- Encodage de l’instruction :

14bits
00 0000 0110 0100 binaire
0 0 6 4 hexa

Exemple:
CLRW ; met à zéro le registre W.
MOVFW 0x3F ; copie W dans l'adresse 0x3F
boucle …. ; traitement répété
….
BTFSS 0x3F, 2 ; tant que le bit 2 de (0x3F) est à zéro on reboucle
GOTO boucle
CLRWDT ; si on s'attarde trop sur la boucle précédente, le programme est
…. ; réinitialisé
===================================================================

COMF F, d
COMplement File
- Effectue un complément bit à bit sur le contenu de la case en mémoire RAM à l’adresse F indiquée; le résultat
peut être placé soit dans le registre W (d=0 ou w) , soit dans la case mémoire RAM (d=1 ou f).
- Cette instruction affecte le bit Z du registre d’état
- Encodage de l’instruction:

14bits
00 1001 dfff ffff binaire
0 9 ? ? hexa

- Exemple:
CLRF PORTB ; met à zéro les lignes du PORTB (adresse 0x06)
boucle COMF PORTB, f ; complémente l'état des lignes du PORTB , code 0986
CALL tempo ; marquer une tempo
GOTO boucle ; reboucler
===================================================================

DECF F, d
DECrement File
- Décrémente le contenu de la case en mémoire RAM à l’adresse F. le résultat peut être placé soit dans le
registre W (d=0 ou w), soit dans la case mémoire RAM (d=1 ou f).
- Cette instruction affecte le bit Z du registre d’état

- Encodage de l’instruction:

17 Y.ROCHDI
3.

14bits
00 0011 dfff ffff binaire
0 3 ? ? hexa
- Exemple:
CLRF PORTB ; met à zéro les lignes du PORTB (adresse 0x06)
COMF PORTB, f ; met FF dans PORTB
boucle CALL tempo ; marquer une tempo
DECF PORTB, f
BTFSS STATUS, Z ; si on arrive à zéro (Z=1) on quitte la boucle
GOTO boucle ; reboucler
===================================================================

DECFSZ F, d
DECrement File, Skip if Zero
- Décrémente le contenu de la case mémoire RAM à l’adresse F indiquée, et effectue un test sur le bit Z du
registre STATUS: Si Z=1, ignore l’instruction suivante.
le résultat peut être placé soit dans le registre W (d=0 ou w), soit dans la case mémoire RAM (d=1 ou f).
- Selon qu’à la suite de la décrémentation l’octet ait atteint ou pas la valeur zéro, l’instruction prend 1 ou 2
cycles.
- Encodage de l’instruction:

14bits
00 1011 dfff ffff binaire
0 B ? ? hexa

- Exemple:
CLRF PORTB ; met à zéro les lignes du PORTB (adresse 0x06)
COMF PORTB, f ; met FF dans PORTB
boucle CALL tempo ; marquer une tempo
DECFSZ PORTB, f ; si on arrive à zéro (Z=1) on quitte la boucle
GOTO boucle ; reboucler
===================================================================

GOTO Adresse (ou Label)


- Branchement inconditionnel.
Saute inconditionnellement à l’adresse indiquée (ou label). Cette instruction interrompt l’exécution séquentielle
des instructions et poursuit l'exécution du programme à partir d'une autre adresse ailleurs. GOTO charge le PC
avec une autre adresse.
- Cette instruction s'exécute en 2 cycles d’horloge.
- Encodage de l’instruction :

14bits
10 1kkk kkkk kkkk binaire
0 ? ? ? hexa

- Exemple voir exemples des instructions précédentes.


===================================================================

INCF F, d
INCrement File
- Incrémente le contenu de la case en mémoire RAM à l’adresse F indiquée. Le résultat peut être placé soit dans
le registre W (d=0 ou w), soit dans la case mémoire RAM (d=1 ou f).
- Cette instruction affecte le bit Z du registre d’état

- Encodage de l’instruction:

14bits
00 1010 dfff ffff binaire

18 Y.ROCHDI
3.

0 3 ? ? hexa

- Exemple:
CLRW ; met à zéro le registre W.
MOVFW 0x3F ; copie W dans l'adresse 0x3F
boucle INCF 0x3F ; incrémente le contenu de l'adresse 0x3F
BTFSS STATUS, 2 ; sortir de la boucle si le bit d'état Z=1, soit le passage du contenu de 0x3F de
; FF à 00
GOTO boucle
===================================================================

INCFSZ
INCcrement File, Skip if Zero
- Incrémente le contenu de la case mémoire RAM à l’adresse F indiquée, et effectue un test sur le bit Z du
registre STATUS: Si Z=1, ignore l’instruction suivante. Le résultat peut être placé soit dans le registre W (d=0
ou w), soit dans la case mémoire RAM (d=1 ou f).
- Selon qu’à la suite de l'incrémentation l'octet ait atteint ou pas la valeur zéro, l'instruction ne prend 1 ou 2
cycles.
- Encodage de l’instruction:

14bits
00 1111 dfff ffff binaire
0 F ? ? hexa

- Exemple:
CLRF PORTB ; met à zéro les lignes du PORTB (adresse 0x06)
boucle CALL tempo ; marquer une tempo
INCFSZ PORTB, f ; si on arrive à zéro (Z=1) on quitte la boucle
GOTO boucle ; reboucler
===================================================================

IORLW KK
Inclusive OR Literal with W
- Effectue une opération logique OU inclusif (Inclusive OR) entre la valeur immédiate d'une constante littérale
KK et l’octet se trouvant dans le registre W. Le résultat de l’opération reste dans le registre W.
- La constante littérale KK est un mot de 8 bits (de 00 à FF)
- Cette instruction affecte le bit Z du registre d’état

- Encodage de l’instruction:

14bits
11 1000 kkkk kkkk binaire
3 8 ? ? hexa

- Exemple:
Cette instruction sert lorsque – dans un octet – on a besoin de forcer à 1 certains bits en particulier.
Pour cela il on utilise un masque, c’est à dire un octet composé de 0 (aux emplacements où se trouvent les bits à
ignorer) et de 1 (aux emplacements où se trouvent les bits qu’on veut forcer à 1).

IORLW B'00001111' ; force le quartet de poids faible de W à 1 et laisse le quartet de poids fort inchangé
; ici la constante est exprimée en binaire
===================================================================

IORWF
Inclusive OR With File
- Effectue une opération logique OU (OR) inclusif entre le contenu du registre W et le contenu de la case
mémoire RAM à l’adresse indiquée par F. Le résultat peut être placé soit dans le registre W (si d=0 ou w), soit
dans la case mémoire RAM (si d=1 ou f).

19 Y.ROCHDI
3.

- Cette instruction affecte le bit Z du registre d’état


- Encodage de l’instruction:

14bits
00 0100 dfff ffff binaire
0 4 ? ? hexa

- Exemple:
MOVLW 0x0F ; charge W avec le masque 0x0F
IORWF 0x4C,w ; W contient comme quartet de poids fort celui du contenu de l'adresse 0x4C et
; comme quartet de poids faible B'1111'
IORWF 0x4C,f ; force à 1 les bits du quartet poids faible du contenu de 0x4C
===================================================================

MOVF F, d
MOVe File
- Cette instruction peut copie le contenu de l'adresse mémoire indiquée F vers w (si d=0 ou w) ou vers F elle-
même; Ce dernier cas peut sembler obsolète mais il est utile pour tester si le contenu copié est NULL (Z=1),
puique cette instruction positionne Z.
- Cette instruction affecte le bit Z du registre d’état
- Encodage de l’instruction:

14bits
00 1000 dfff ffff binaire
0 8 ? ? hexa

- Exemple:
MOVF PORTA, w ; copie le contenu du portA vers le registre W
MOVF PORTB, f
BTFSS STATUTS, Z ; pour tester si le contenu du PORTB est nul
GOTO NONNUL ; si Z=0 aller à l'adresse NONNUL
GOTO NUL ; si Z=1 aller à l'adresse NUL
===================================================================

MOVLW KK
MOVe Literal to W
- Charge de manière immédiate la constante littérale dans le registre W
- La constante littérale est un mot de 8 bits (de 00 à FF)
- Encodage de l’instruction :

14bits
11 00xx kkkk kkkk binaire
3 ? ? ? hexa

- Exemple:
MOVLW 0x0F ; charge W avec le masque 0x0F

===================================================================
MOVWF F
MOVe W to File
- Copie le contenu du registre W vers la case mémoire RAM à l’adresse indiquée F.
- Encodage de l’instruction:

14bits
11 0000 1fff ffff binaire
3 ? ? ? hexa

- Exemple de programmation :

20 Y.ROCHDI
3.

MOVF PORTB, w ; copie le contenu du port B ve rs W


MOVWF PORTA ; copie le contenu de W vers le port A

===================================================================
NOP
No OPeration
- L’instruction sans aucun effet sinon faire perdre un cycle ! S’utilise essentiellement pour créer ajuster des
boucles de temporisations.
- Encodage de l’instruction:

14bits
00 0000 0xx0 0000 binaire
0 0 ? 0 hexa

===================================================================
RETFIE
RETurn From IntErrupt
- Retour au programme principal après exécution du sous-programme d’interruption. Charge le PC (Program
Counter : compteur d’instructions) avec la valeur qui se trouve au sommet de la pile (stack) ; ce qui provoque le
retour au programme principal.
- Lorsqu’une interruption est demandée, le microcontrôleur, sauve la valeur du PC dans la pile puis charge dans
le PC l’adresse 004 (vecteur d'interruption): c'est à partir de cette adresse que doit débuter le sous-programme
d'interruption.
- Après cette instruction, le bit du GIE (General Interrupt Enable) du registre INTCON (bit7) est positionné à 1,
pour autoriser à nouveau une autre demande d'interruption.
- Cette instruction prend 2 cycles d’horloge
- Encodage de l’instruction:

14bits
00 0000 0000 1001 binaire
0 0 0 9 hexa
- Exemple:
RETFIE

===================================================================
RETLW
RETurn from subroutine with Literal in W
- Comme l'instruction RETURN, elle provoque le retour au programme appelant à l’endroit suivant l'instruction
CALL d'appel, mais avec une particularité en plus : charge dans le registre W la valeur d'une constante littérale.
- L constante littérale est un mot de 8 bits (de 00 à FF)
- Cette instruction prend 2 cycles d’horloge
- Encodage de l’instruction:

14bits
11 01xx kkkk kkkk binaire
3 ? ? ? hexa
===================================================================
RETURN
RETURN from subroutine
- Retour d’un sous-programme.
Le PC (Program Counter) est chargé avec l’adresse se trouvant au sommet de la pile, ce ci provoque le saut à
l'endroit qui suit l'instruction d'appel du sous -programme CALL. Chaque sous programme doit donc se terminer
par un RETURN ou un RETLW.
- Cette instruction prend 2 cycles d’horloge
- Encodage de l’instruction:

14bits
00 0000 0000 1000 binaire

21 Y.ROCHDI
3.

0 0 0 0 hexa

===================================================================
RLF F,d
Rotate Left File

C b7 b0

register f
- Rotation à gauche.
- Effectue le déplacement d’une position vers la gauche des bits de l’octet situé en case mémoire RAM à
l’adresse F indiquée de suite en utilisant le bit de CARRY du registre d’état : le contenu du bit de CARRY
devient le nouveau bit 0 de l’octet ayant effectué la rotation à gauche, tandis que l’ancien bit 7 entre dans
CARRY ; Le résultat peut être placé soit dans le registre W (d=0 ou w), soit dans la case mémoire RAM (d=1 ou
f).

- Avant d’utiliser cette instruction il convient de préalablement de positionner correctement le bit de CARRY
selon ce qui est désiré, en utilisant l'une des deux instructions:
BCF STATUS,0 ; positionnement à 0 du C
ou BSF STATUS,0 ; positionnement à 1 du C
- Cette instruction affecte le bit C du registre d’état
- 1 cycle d’horloge
- Encodage de l’instruction:

14bits
00 1101 dfff ffff binaire
0 D ? ? hexa

Exemple: création d'un 1 tournant dans un octet


CLRF 0x40 ; efface le contenu de 0x40
BSF STATUS, 0 ; positionne C à 1
boucle RLF 0x40,1 ; première rotation à gauche de (0x40), (0x40)== 00000001
repet CALL tempo ; marquer une tempo
RLF 0x40,1 ; rotation à gauche
BTFSS STATUS, 0 ; test si C est à nouveau à 1 (dons après 9 rotations)
GOTO repet ; C est toujours à 0 continuer les rotations
GOTO boucle ; C est à 1 faire une autre rotation sans temporisation

===================================================================
RRF F
Rotate Right File

C b7 b0

register f
- Rotation à droite.

- Effectue le déplacement d’une position vers la droite des bits de l’octet situé en case mémoire RAM à l’adresse
F indiquée en utilisant le bit de CARRY du registre d’état : le contenu du bit de CARRY devient le nouveau bit 7
de l’octet ayant effectué la rotation à droite, tandis que l’ancien bit 0 entre dans CARRY ; Le résultat peut être
placé soit dans le registre W (d=0 ou w), soit dans la case mémoire RAM (d=1 ou f).

- Avant d’utiliser cette instruction il convient de préalablement de positionner correctement le bit de CARRY
selon ce qui est désiré, en utilisant l'une des deux instructions:
BCF STATUS,0 ; positionnement à 0 du C

22 Y.ROCHDI
3.

ou BSF STATUS,0 ; positionnement à 1 du C


- Cette instruction affecte le bit C du registre d’état
- Encodage de l’instruction:

14bits
00 1100 dfff ffff binaire
0 C ? ? hexa

===================================================================
SLEEP
- Mise en mode veille.
Cette instruction s’utilise non pas pour mettre le µC hors tension, mais pour arrêter l'exécution des instructions
(ralentir le signal d’horloge jusqu’à l’extrême limite : la fréquence zéro). Pendant cette mise en veilleuse,
l’horloge externe est inhibée. Le déroulement du programme est bloqué; à l'exception du temporisateur du
WatchDog (chien de garde) qui reste actif.
La consommation du boîtier (qui normalement est de 2 mA) est réduite à 30 µA, Ce ci est bénéfique pour les
systèmes alimentés par batterie: au lieu de laisser tourner le programme sur une boucle infinie à ne rien faire,
vaut mieux le faire passer en mode veille.
Le µC se réveille de son sommeil suite à un événement comme : une demande d’interruption, ou un débordement
du temporisateur du chien de garde.
- Cette instruction affecte deux bits du registre d’état : TO (Time Out) passe à 1, PD (Power Down) passe à 0
En plus, elle met à zéro le temporisateur du chien de garde, ainsi que le prédiviseur.
- 1 cycle d’horloge
- Encodage de l’instruction:
14bits
00 0000 0110 0011 binaire
0 0 6 3 hexa

===================================================================
SUBLW
SUBtract Literal with W
- Soustrait de la constante littérale immédiate le contenu du registre W, et place le résultat dans W.
- Cette instruction affecte 3 bits du registre d’état : C (Carry), DC (Digit Carry), Z (Zero)
- Encodage de l’instruction:

14bits
11 110x kkkk kkkk binaire
3 C ? ? hexa
Exemple:
MOVLW 0x02 ; initialiser W par 02h
SUBLW 0x20 ; retrancher (W) de 20h

===================================================================
SUBWF F, d
SUBtract W from File
- Soustrait le contenu du registre W du contenu de la case en mémoire RAM à l’adresse F ; Le résultat peut être
placé soit dans le registre W (d=0 ou w), soit dans la case mémoire RAM (d=1 ou f).
- Cette instruction affecte 3 bits du registre d’état : C (Carry), DC(Digit Carry), Z (Zero)
- Encodage de l’instruction:

14bits
00 0010 dfff ffff binaire
0 2 ? ? hexa

23 Y.ROCHDI
3.

===================================================================
SWAPF F, d
SWAP File
- Permute les deux quartets (de poids faible et de poids fort) du contenu de la case en en mémoire RAM à
l’adresse F indiquée; Le résultat peut être placé soit dans le registre W (d=0 ou w), soit dans la case mémoire
RAM (d=1 ou f).

- Encodage de l’instruction:

14bits
00 1110 dfff ffff binaire
0 E ? ? hexa

===================================================================
TRIS
TRIState port
Microchip recommande de ne pas l’utiliser, dans le but de laisser les programmes (écrits pour ce type de
microcontrôleurs) compatibles avec ceux écrits pour d’autres modèles de PIC.
- Charge le registre TRIS (A ou B) ave une valeur littérale immédiate, et met les lignes de port à haute
impédance (TRISTATE). Ce registre configure le sens de fonctionnement de chacune des lignes des ports A, B ;
assigne à chaque ligne soit le rôle d’entrée, soit le rôle de sortie, sans pour autant provoquer aucune entrée ni
aucune sortie.
- Il s’agit d’un registre de 8 bits, pouvant tous se programmer individuellement par 0 ou par 1 :
0 = la ligne de port (qui lui correspond) est configurée comme sortie
1 = la ligne de port (qui lui correspond) est configurée comme entrée
- S’agissant d’un registre à lecture/écriture simultanée, on ne peut pas y écrire directement, mais il faut
obligatoirement transiter par le registre W: ainsi, on commence par écrire l’octet de configuration dans W, juste
après on utilise l’instruction TRIS (A ou B), pour transférer le contenu de W vers le registre de direction TRISA
ou TRISB.
- Encodage de l’instruction :
14bits
00 0000 0110 0fff binaire
0 0 6 ? hexa

(fff)= 101 pour le portA et (fff)= 1 10 pour le portB


- Exemple:
MOVLW b'11001000' ; (en binaire)
MOVWF TRISB

===================================================================
XORLW
EXclusive OR Literal and W
- Effectue un OU exclusif (Exclusive OR) entre la valeur immédiate de la constante littérale et le contenu du
registre W. Le résultat est stocké dans W.
- La constante littérale KK est un mot de 8 bits (de 00 à FF)
- Cette instruction affecte le bit Z du registre d’état

- Encodage de l’instruction:

14bits
11 1010 kkkk kkkk binaire
3 A ? ? hexa

- Exemple:
- Un OR exclusif permet d’inverser un état logique d'un ou de plusieurs bits d'un octets en utilisant un masque:
un octet composé de 0 (aux emplacements où se trouvent les bits à ignorer) et de 1 (aux emplacements où se
trouvent les bits à inverser).

24 Y.ROCHDI
3.

- Il permet aussi de tester si deux octets sont égaux: Si les bits de même poids sont au même niveau, le résultat
est zéro. Si par contre ils sont à des niveaux différents, le résultat est 1.

===================================================================
XORWF F, d
Exclusive OR W and File
- Effectue un OU exclusif (Exclusive OR) entre le contenu du registre W et le contenu de la case en mémoire
RAM à l’adresse F indiquée; Le résultat peut être placé soit dans le registre W (d=0 ou w), soit dans la case
mémoire RAM (d=1 ou f).

- Encodage de l’instruction:

14bits
00 0110 dfff ffff binaire
0 6 ? ? hexa

Exemple:
MOVLW 0x1F
XORWF 0x0A, w
BTFSS STATUS, Z ; skip si Z=1
GOTO SP1 ; aller au SP1, (0x0A) est différent de 0x1F
GOTO SP2 ; aller au SP2, (0x0A) est égal à 0x1F

3.2. Environnement de développement intégré MPLAB

Dans ce paragraphe on donnera les principales étapes utiles pour créer un projet de programmation
d'un PIC sous MPLAB; plus précisément on abordera la création et la gestion d'un projet, l'édition de
fichiers dans le langage "assembleur", la mise au point d'un programme (debuggage) et la simulation.
Ce tutorial se base sur le MPLAB version 8.00.

A-Création d'un projet à l'aide de l'assistant "Project Wizard"


1. Démarrer MPLAB, puis aller sur le menu Projet et démarrer l'assistant de création de projet

2. L'assistant démarre avec la fenêtre suivante, Cliquer sur Suivant

25 Y.ROCHDI
3.

3. Choisir le microcontrôleur qui sera utilisé dans le projet: dans cet exemple prendre 16F84A,
puis passer à l'étape suivante

4. Choisir la suite des outils du langage à utiliser dans le projet: garder l'option Microchip
MPASM Toolsuite. Ce ci définit le langage de programmation, l'assembleur, l'éditeur de lien
et les librairies à utiliser. Passer à l'étape suivante.

26 Y.ROCHDI
3.

5. Spécifier le chemin et le nom pour le nouveau projet à créer, utiliser éventuellement le bouton
Browse pour choisir le chemin à l'aide de l'explorer de Windows.

6. Il est préférable de réserver un répertoire pour vos projets et de les classer si possibles par type
de microcontrôleur. Passer à l'étape suivante.

7. Un projet peut contenir un ou plusieurs fichiers. D'autres part, Microchip propose des fichiers
canevas (Template) qui facilitent la tâche de création d'un nouveau projet. Aller au répertoire
d'installation de mplab (par défaut : program Files\microchip) et développer l'arborescence de
ce répertoire puis celle du sous répertoire MPASM suite, comme indiqué sur la figure
suivante:

27 Y.ROCHDI
3.

8. Développer l'arborescence du sous répertoire Template, et dans le sous répertoire Code


chercher et sélectionner le fichier 16F84ATEMP.ASM, puis cliquer sur le bouton Add pour
l'ajouter au projet:

9. Cliquer trois fois sur la lettre A à côté du fichier ajouté jusqu'à ce qu'elle se transforme en un
C; ce ci indique que l'assistant fera une copie de ce fichier vers votre répertoire du projet en
cours, et permet donc de ne pas modifier le template d'origine.

28 Y.ROCHDI
3.

10. Faites de même pour ajouter une copie du fichier P16F84A.INC qui se trouve dans le
répertoire Program Files\microchip\MPASM suite; puis passer à l'étape suivante.

11. Cliquer sur terminer pour finaliser la création du projet

B- Intégration du code Utilisateur dans le projet crée:

Commencer par afficher le volet du projet : Menu View / Project. Le projet crée ne contient que deux
fichiers: 16F84ATEMP.ASM et P16F84A.INC. Nous allons analyser leur contenu.
Double-cliquer sur le fichier P16F84A.INC pour l'ouvrir, ce fichier contient plusieurs sections
séparées par des commentaires; Ci-dessous un extrait de ce fichier:

29 Y.ROCHDI
3.

; Register Definitions
;
;======================================================================
W EQU H'0000'
F EQU H'0001'

;----- Register Files------------------------------------------------------

INDF EQU H'0000'


TMR0 EQU H'0001'
PCL EQU H'0002'
STATUS EQU H'0003'
FSR EQU H'0004'
PORTA EQU H'0005'

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

IRP EQU H'0007'


RP1 EQU H'0006'
RP0 EQU H'0005'

Donc comme on peut le voir l'utilité de ce fichier est de donner des noms expressifs aux adresses
hexadécimales et aux numéros de bits, à l'aide de la directive d'assemblage EQU; ainsi écrire dans le
programme utilisateur STATUS, est équivalent à écrire l'adresse 0x03 et IRP est équivalent au bit
numéro 7.

Double-cliquer sur le fichier 16F84TEMP.ASM pour l'ouvrir; Ce fichier contient un certain cadre pour
y ajouter des commentaires utiles, comme le nom du fichier, l'auteur, la version… ces commentaires
deviennent nécessaires pour les grands projets, apprenez à les utiliser dès maintenant. Un bon projet
est un projet bien documenté!
Ensuite on trouve:

list p=16F84A ; directive définissant le processeur utilisé


#include <p16F84A.inc> ; directive ajoutant le fichier des définitions
__CONFIG _CP_OFF & _WDT_ON & _PWRTE_ON & _RC_OSC ; positionne les bits de configuration

Les bits de configurations permettent de définir le type d'oscillateur utilisé, l'activation ou non du
watchdog, la protection en lecture du programme …etc; On en donnera plus de détails par la suite.
A l'instar de ce qui est fait dans le fichier p16f84a.inc, l'utilisateur peut définir, par EQU, ses propres
variables mémoires afin d'utiliser des noms et non pas des adresses dans le programme:

;***** VARIABLE DEFINITIONS


w_temp EQU 0x0C ; variable utilise pour sauvegarder le registre W
status_temp EQU 0x0D ; variable utilise pour sauvegarder le registre STATUS
;**********************************************************************
Après un Reset, le programme s'exécute à partir de l'adresse 0x000, mais comme le vecteur
d'interruption se trouve à l'adresse 0x004, on trouve souvent à l'adresse 0x000 une instruction de
branchement inconditionnel qui permet de se brancher au programme principal (main) et donc de
sauter la routine d'interruption qui est à l'adresse 0x004.
ORG 0x000 ; adresse de début d'exécution après un reset
goto main ; sauter au programme principal

ORG 0x004 ; adresse de la routine d'interruption


movwf w_temp ; lors d'une interruption sauvegarder les deux registres STATUS et W dans les
movf STATUS,w ; variable temporaries w_temp et status_temp
movwf status_temp ;

; la routine d'interruption doit être place ici


movf status_temp,w ; avant de terminer la routine d'interruption, restaurer le registre

30 Y.ROCHDI
3.

movwf STATUS ; STATUS


swapf w_temp,f
swapf w_temp,w ; restaurer le registre W
retfie ; retour d'interruption
Le programme principal est place après la routine d'interruption
main
; l'utilisateur place ici son code

END ; directive de fin d'assemblage

Comme on vient de le constater, l'assistant de création de projet crée juste le canevas ou la structure
(template), et c'est à l'utilisateur de compléter par son propre code.
Nous allons compléter le fichier précédent par un code simple: on suppose qu'on branche une LED sur
la broche RA0 du PIC qu'on veut allumer par le programme. Les étapes à mettre en place seront donc:
• Configurer la broche RA0 du port A comme sortie ce ci se fait par l'écriture d'un 0 dans le bit
0 du registre TRISA.
• Mettre à un le bit RA0 du port A pour allumer la LED
• Boucler indéfiniment sans rien faire

Le code correspondant sera:


bsf STATUS, RP0 ; activer la banque 1 pour accéder à TRISA
movlw B'00000000' ; w = 0x00
movwf TRISA ; le port A en sortie
bcf STATUS, RP0 ; activer la banque 0 pour accéder à PORTA
movlw B'00000001'
movwf PORTA ; allumer la led branchée à la broche 0
attente
goto attente ; boucle infinie
Placer ce code après le label main.

C- Construction du projet (assemblage et génération du code machine):

Aller dans le menu Project et choisir la commande Build all; ce ci ouvre la fenêtre Output, et dans
l'onglet Build s'affiche le compte rendu suivant:

Clean: Deleting intermediary and output files.


Clean: Deleted file "E:\micochip_projets\16F84A\16F84ATEMP.err".
Clean: Deleted file "E:\micochip_projets\16F84A\16F84ATEMP.cod".
Clean: Deleted file "E:\micochip_projets\16F84A\16F84ATEMP.hex".
Clean: Deleted file "E:\micochip_projets\16F84A\16F84ATEMP.lst".
Clean: Done.
Executing: "C:\Program Files\Microchip\MPASM Suite\MPAsmWin.exe" /q /p16F84A "16F84ATEMP.ASM"
/l"16F84ATEMP.lst" /e"16F84ATEMP.err"
Message[302] E:\MICOCHIP_PROJETS\16F84A\16F84ATEMP.ASM 94 : Register in operand not in bank 0.
Ensure that bank bits are correct.
Loaded E:\micochip_projets\16F84A\16F84ATEMP.cod.
BUILD SUCCEEDED: Wed Apr 10 17:15:23 2009

Le dernier message de ce compte rendu annonce la réussite de l'opération, il n'y a pas donc d'erreurs
critiques. Noter la mise en garde concernant la ligne 94 qui correspond à l'instruction:
movwf TRISA; on rappelle ici que TRISA n'est pas sur la banque 0 et qu'il faut s'assurer que la banque
a été bien choisie.
En cas de présence d'erreurs dans le programme, elles seront signalées dans le compte rendu en
spécifiant les numéros de lignes correspondantes.
Notre petit programme peut être maintenant exécuté et testé.

D- Debuggage du programme (exécution, simulation et mise au point):


On commence par une exécution totale afin de tester notre programme dans sa totalité avant de rentrer
éventuellement dans les détails. Notre objectif était d'allumer la LED branchée sur RA0. On va donc

31 Y.ROCHDI
3.

consulter le port A. Aller au Menu View et cliquer sur Special Function Registers pour afficher les
registres du PIC.
Dans le menu Debugger\select tool \ cocher l'option MPLAB SIM pour activer le simulateur.
D'autres options s'ajoutent alors au menu Debugger (Run, animate …), et une barre de raccourcis
s'ajoute à la fenêtre:

A l'aide du raccourci Run lancer l'exécution du programme. Remarquer que le PORTA prend la valeur
0x01, la led donc devrait s'allumer. Toutefois un message apparaît et l'exécution s'arrête:

Ce message indique que le compteur du Watchdog a expiré. En effet dans la directive:


__CONFIG _CP_OFF & _WDT_ON & _PWRTE_ON & _RC_OSC ; positionne les bits de configuration
On remarque que le Watchdog est activé _WDT_ON; donc il surveille notre programme si au bout d'un
certain temps l'instruction CLRWDT n'est pas rencontré, le compteur expire et le programme est
remis à zéro. C'est ce qui se passe exactement dans notre programme, puisque après avoir allumé la
LED on rentre dans une boucle infinie ou on ne fait rien!
Pour éviter ce problème:
• soit on désactive le Watchdog en remplaçant _WDT_ON par _WDT_OFF .
• Soit on place l'instruction CLRWDT dans la boucle infinie:
attente
clrwdt ; remet le compteur du chien de garde à 0
goto attente ; boucle infinie

Essayer les deux techniques, il ne faut pas oublier de reconstruire le projet après chaque modification.

Notre programme semble maintenant donc marcher correctement. Un examen plus détaillé peut être
fait en utilisant le mode d'exécution animé ou le mode pas à pas (step by step). Pour montrer ces
possibilités nous allons modifier notre programme pour l'enrichir. On suppose maintenant qu'on veut
que la LED clignote. Les étapes à entreprendre seront donc:
• Configurer le port A en sortie
boucle
• Allumer la LED
• Attendre une certaine durée
• Eteindre la LED
• Attendre une certaine durée
• Aller à boucle

32 Y.ROCHDI
3.

Le code correspondant sera:


main
bsf STATUS, RP0 ; activer la banque 1 pour accéder à TRISA
movlw B'00000000' ; w = 0x00
movwf TRISA ; le port A en sortie
bcf STATUS, RP0 ; activer la banque 0 pour accéder à PORTA
boucle
movlw B'00000001'
movwf PORTA ; allumer la led branchée à la broche 0
call tempo ; appel au sous programme temp
movlw B'00000000'
movwf PORTA ; éteindre la led branchée à la broche 0
call tempo
goto boucle

tempo
clrf 0x3F ; case mémoire 0x3F en tant que décompteur
repet decf 0x3F,f ; première décrem (0x3F)=0xFF
btfsc STATUS, Z ; sauter si le résultat n'es pas encore nul
goto repet
return
END

Dans le premier projet remplacer le programme principal par le code ci-dessus. Reconstruire le projet
et l'exécuter par la commande Run. Dans la fenêtre Special Function Registers, on voit que le portA
ne change pas de valeur ! ce ci est juste un problème de rafraîchissement des affichages. A partir du
menu Debugger ouvrir la fenêtres Settings (réglages) et cocher la case Enable Realtime watch
Updates, le raffraichissement sera fait toutes les N*100msecs avec N est le nombre tapé en dessous de
la case à cocher. Valider ce changement et relancer l'exécution; maintenant on voit que la valerdu
portA change mais de manière asynchrone ! Ce ci est du au fait que la boucle de temporisation n'est
pas multiple de 100msecs.

Pour suivre en détail ce qui se passe dans notre programme, on va l'exécuter en mode animation
(option animate dans le menu debugger). Avant dans la fenêtre Debugger\settings\ décocher la case
Enable Realtime watch Updates et régler la durée du pas d'animation à 1ms (Animate step time).
Aller au menu View et ouvrir la fenêtre Files registers.

33 Y.ROCHDI
3.

Valider ce changement et lancer le programme en mode animation. Surveiller la case mémoire


d'adresse 0x3F, le registre PortA.

34 Y.ROCHDI
3.

4. Application pratiques:

A travers des applications pratiques, nous allons pratiquer la programmation des PICs en assembleur,
tout en mettant en œuvre les périphériques des PICs.

4.1. Ports entrée/sortie:

Cette première application va nous permettre de commander des LED, un afficheur 7 segments et
réagir aux impulsions sur des boutons poussoirs. Comme le représente la figure ci-dessous, elle est
basée sur un PIC 16F84A. L'objectif est de savoir configurer et utiliser les ports en entrée ou en sortie
en mode programmé.

1er programme: app1_ex1.asm

;********************************************************************** ****************************
; Objectif: écrire un programme qui permet de faire clignoter la LED D1
;
;********************************************************************** ****************************
; Filename: app1_ex1.asm
; Date: 16/04/09
; File Version: 1
;; Author: Y.ROCHDI
; Company:
;********************************************************************** ****************************
;
; Files required:p16F84A.inc
;***************************************************** ****************************
;
; Notes: Initiation configuration des ports, accès aux banques,
; appel au sous-programme, utilisation des définitions
;******************************************************************** ****************************

list p=16F84A ; définition du processeur


#include <p16F84A.inc> ; definitions des variables spécifiques du processeur
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC

;***** DEFINITIONS des VARIABLES


w_temp EQU 0x0C ; variables pour sauvegarder le register W
status_temp EQU 0x0D ; variables pour sauvegarder le register STATUS

;**********************************************************************
ORG 0x000 ; adresse de début après un reset
goto main ; aller au programme principal

35 Y.ROCHDI
3.

ORG 0x004 ; adresse de début de la routine d'interruption


movwf w_temp ; sauvegarde de W
movf STATUS,w ; transfert de STATUS vers W
movwf status_temp ; sauvegarde de W

; la routine d'interruption doit être placé ici

movf status_temp,w ; restauration du STATUS


movwf STATUS ;
swapf w_temp,f ;
swapf w_temp,w ; restauration de W
retfie ; retour d'interruption
main
clrf PORTA ; initialiser à zéro avant activation
clrf PORTB ; initialiser à zéro avant activation
bsf STATUS, RP0 ; activer la banque 1 pour accéder à TRISA et TRISB
movlw B'00001100' ; w = 0x0C
movwf TRISA ; RA0, RA1 en sortie, RA2,RA3 en entrée
clrf TRISB ; Port B en sortie
bcf STATUS, RP0 ; activer la banque 0 pour accéder à PORTA et PORTB
clrf PORTA ; éteindre les LED
boucle
bsf PORTA,0 ; allumer la led D1
call tempo
bcf PORTA,0 ; éteindre la led D1
call tempo
goto boucle

tempo
clrf 0x3F ; décompteur
repet decf 0x3F,f
btfss STATUS, Z ; décopteur arrivé à 0 sauter et quitter la boucle
goto repet
return

END ; fin du code à assembler

36 Y.ROCHDI
6.

Annexe I Y.ROCHDI
6.

Annexe II Y.ROCHDI
6.

Annexe III Y.ROCHDI

Vous aimerez peut-être aussi