Académique Documents
Professionnel Documents
Culture Documents
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):
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
2 Y.ROCHDI
3.
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
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
13 12 11 10 9 7 6 5 4 3 2 1 0
Instructions de
branchement
Call ou Goto
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.
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
Le rôle de chacun des registres sera expliqué par la suite chaque fois qu'on en aura besoin.
8 Y.ROCHDI
3.
9 Y.ROCHDI
3.
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.
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.
11 Y.ROCHDI
3.
register f
register f
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.
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.
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
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)
===================================================================
15 Y.ROCHDI
3.
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'
….
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.
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
===================================================================
14bits
10 1kkk kkkk kkkk binaire
0 ? ? ? hexa
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.
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.
===================================================================
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
===================================================================
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.
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
===================================================================
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
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.
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.
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.
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'
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:
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:
30 Y.ROCHDI
3.
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
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:
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é.
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:
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.
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.
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.
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é.
;********************************************************************** ****************************
; 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
;******************************************************************** ****************************
;**********************************************************************
ORG 0x000 ; adresse de début après un reset
goto main ; aller au programme principal
35 Y.ROCHDI
3.
tempo
clrf 0x3F ; décompteur
repet decf 0x3F,f
btfss STATUS, Z ; décopteur arrivé à 0 sauter et quitter la boucle
goto repet
return
36 Y.ROCHDI
6.
Annexe I Y.ROCHDI
6.
Annexe II Y.ROCHDI
6.