Académique Documents
Professionnel Documents
Culture Documents
Dans cette partie, on décrit comment un programme source « fichier.asm » doit être
présenté. Tout d’abord complétez le cadre d’en-tête suivant votre désir comme indiqué dans
l’exemple ci-dessous. Prenez l’habitude de toujours ajouter des commentaires dans les
programmes, ceci est indispensable pour une maintenance efficace dans le temps. Tout ce qui
vient après le point virgule est un commentaire qui ne sera pas pris en compte par le
compilateur.
;***************************************************************************
; *
; NOM du PROGRAMME *
; Type de PIC utilisé *
; *
; *
;***************************************************************************
; *
; NOM: nom du programme *
; Date: 01/01/2020 *
; Version: 1.0 *
; Circuit: intitulé du montage *
; Auteur: Nom du programmeur *
; *
;***************************************************************************
; *
; Fichier requis: P16F877A.I16 ( c’est un fichier spécifiant les adresses des registres *
; internes utilisés par le PIC 16F877A) *
; *
;***************************************************************************
; *
; Notes: Ce programme permet de faire clignoter une LED connectée sur la ligne *
; sur 2 du port A (RA2) à une fréquence de 1Hz *
; *
;***************************************************************************
1
;***************************************************************************
; *
; Directives d’assemblage pour MPLAB *
; *
;***************************************************************************
;suite du programme
Les directives ne font pas partie du programme, elles ne sont pas traduites en opcode,
elles servent à indiquer à l’assembleur de quelle manière il doit travailler. Ce sont donc des
commandes destinées à l’assembleur en lui-même. Donc dans la zone directives, on inscrit les
directives destinées à MPASM pour indiquer par exemple quel type de processeur est utilisé
dans ce programme.
Par contre, les instructions seront traduites en "OPcodes" par le compilateur pour êtres ensuite
chargées dans le PIC moyennant d'un outil de flashage.
Cette directive signale à l’assembleur que les assignations sont dans le fichier qui suit
par exemple P16F877A.I16. Ce fichier contient tout simplement les adresses de tous les
registres SFRs utilisés dans un programme source.
Cette ligne signifie tout simplement que l’adresse du registre FSR est égale à 0x0004
dans la mémoire du PIC. Autrement dit, lorsque qu’on utilise FSR dans une instruction,
MPASM interprétera FSR comme étant 0x04. H’0004’ est une autre méthode autorisée pour
exprimer un nombre hexadécimal, tout comme 04h.
Le fichier P16F877A.I16 est donc principalement destiné à nous éviter d’avoir à mémoriser
toutes les adresses, un nom est bien plus simple à utiliser. Cette directive s’écrit de la manière
suivante,
#INCLUDE P16F877A.I16
ou bien
INCLUDE < P16F877A.I16>
2
_PWRTE_ON Timer reset sur power on en service
_PWRTE_OFF Timer reset hors-service
_WDT_ON Watch-dog (chien de garde) en service
_WDT_OFF Watch-dog hors service
_LP_OSC Oscillateur quartz basse consommation
_XT_OSC Oscillateur quartz moyenne vitesse
_HS_OSC Oscillateur quartz grande vitesse (fréquences élevées)
_RC_OSC Oscillateur à réseau RC
_DEBUG_ON RB6-RB7 utilisés pour le debuggage sur circuit
_DEBUG_OFF RB6-RB7 utilisés comme lignes d’entrée / sortie
_WRT_ENABLE_ON Le programme peut écrire dans les zones non protégées
_WRT_ENABLE_OFF Le programme ne peut pas écrire en mémoire flash
_CP_ON protection de la zone mémoire contre la lecture
_CP_OFF pas de protection
_BODEN_ON provoque le reset du PIC en cas de chute de tension
_BODEN_OFF reset hors service
_LVP_ON Utilisation de RB3/PGM pour la programmation
_LVP_OFF RB3 utilisée comme I/O standard
_CPD_ON mémoire eeprom protégée
_CPD_OFF mémoire eeprom non protégée
__CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF & _BODEN_ON
& _LVP_OFF & _CPD_OFF & _WRT_ENABLE_ON & _DEBUG_OFF
la directive « EQU » (égal à) permet d’assigner des valeurs (adresses) aux variables
personnelles. Ces assignations fonctionnent selon le même principe que dans le fichier
« .I16 ». Il est en effet plus simple de retenir dans votre programme la valeur « mavaleur »
que de manipuler la valeur 0x5B.
3
Exemple d’assignation :
Dans cet exemple la variable monbit a été définie comme étant la ligne RA1 du port A.
La macro se compose d’un nom écrit en première colonne, suivi par la directive
« macro » puis commence alors à la ligne suivante un ensemble d’instructions qui constitue
la macro. La fin de la macro est définie par la directive « endm » (end of macro).
lecture macro
comf PORTB,0
andlw 1
endm
Dans notre exemple, chaque fois que la macro lecture sera rencontrée, elle sera remplacée au
moment de l’assemblage par les 2 lignes :
comf PORTB , 0
andlw 1
La macro simplifie donc l’écriture, mais ne diminue pas la taille du fichier .hex obtenu,
puisque les 2 lignes seront écrites dans le PIC. Des macros plus complexes peuvent être
utilisés, avec passage de paramètres.
Toute zone définie par l’utilisateur commence avec la directive « CBLOCK », suivie
par l’adresse du début de la zone.
Pour placer nos variables, qui sont des emplacements mémoires auxquels on a donné
des noms, par exemple la RAM (GPRs) en banque 0 peut être librement utilisée et commence
à l'adresse 0x20 pour le 16F877. La zone de variable contiendra donc la directive :
4
CBLOCK 0x20 ; début de la zone variables
Ensuite, les emplacements mémoires peuvent être utilisés suivant la syntaxe suivante :
nom de la variable suivi du signe « : » suivi de la taille utilisée.
Exemple :
Remarque : prendre compte que les assignations des variables déclarées ne chevauchent pas
avec les déclarations faites dans cette partie.
Les étiquettes sont des noms choisis comme repères dans le programme ; elles doivent
être placées en en 1ere colonne. L’assembleur les remplacera par l’adresse du programme à
l’endroit où elles sont positionnées. Ceci nous évite de devoir calculer les emplacements
programme.
La directive ORG, suivie de l’adresse, précise à quelle adresse les instructions qui
suivent seront placées dans la mémoire du PIC. Il est important de savoir 2 choses :
- Après un reset ou une mise sous tension, la PIC démarre toujours à l’adresse 0x00. Le
début de votre programme doit donc se situer à cette adresse.
- L’adresse 0x04 est l’adresse utilisée par les interruptions ; donc le programme doit être
placé au delà de l’adresse 0x0004.
Exemple :
org 0x000 ; Adresse de départ après reset
goto init ; saut à l’adresse init
La première ligne est une directive qui indique que la ligne suivante sera placée à
l’adresse 0x00.
La seconde ligne est une instruction qui indique que le programme doit sauter à
l’adresse « init », cette dernière représente une étiquette.
Après le reset, le PIC exécute donc l’instruction goto init qui se trouve à l’adresse 0x00,
suivie par l’instruction qui se trouve à l’adresse init plus bas dans le programme (donc juste
en dessous de l’étiquette init).
5
1.2.9. La directive « END »
L’exemple qui va suivre résume toutes les étapes que peut comporter un programme source.
;**************************************************************************
; *
; Directives d’assemblage pour MPLAB *
; *
;**************************************************************************
processor 16F877A
include <P16F877A.I16>
__CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF & _BODEN_ON
& _LVP_OFF & _CPD_OFF & _WRT_ENABLE_ON & _DEBUG_OFF
LEDON macro
bsf LED ; led allumée
endm
LEDOFF macro
bcf LED ; led éteinte
endm
6
; ******************* DEMARRAGE SUR RESET ***************************
; *
org 0x000 ; Adresse de départ après un reset
goto init ; saut à l’étiquette init
; *
; ******************* INITIALISATIONS *****************************
; *
suite du programme
- Espace(s) ou tabulation(s),
- Mnémonique (en majuscules ou minuscules),
- Tabulation ou Espace(s)
- Opérande ou la valeur
- Virgule éventuelle de séparation
- Bit de destination W ou F ou éventuellement le numéro du bit de 0 à 7 si nécessaire
- Espace(s) ou tabulation(s)
- point-virgule.
- Commentaire.
Notez que le mnémonique ne peut pas se trouver en première colonne, et que tout ce qui
suit le point-virgule est ignoré du compilateur (commentaire).
La première colonne est réservée pour les étiquettes (repères)
Possibilité d’insérer un ou plusieurs espace(s) ou tabulation(s) de chaque côté de la
virgule.
7
Note 1: lorsqu’un registre I/O est modifié (ex: MOVF PORTB,1), la valeur utilisée est la valeur présente sur le port.
Par exemple si la donnée est ‘1’ sur une ligne programmée comme entrée et elle forcée à ‘0’ par un circuit
externe, alors la donnée sera réécrite avec un ‘0’.
2: si une instruction is exécuté par rapport au registre TMR0, le prescaler (prédiviseur) est effacé s’il a été assigné
au module TMR0.
3: si le compteur de programme (PC) est modifié ou un test conditionnel est vrai, l’instruction nécessite deux cycles.
Le deuxième cycle est exécuté comme étant une instruction NOP.
- La quatrième colonne spécifie ce qu’on appelle l’opcode, c’est à dire le mot binaire
correspondant à l’instruction.
- La cinquième colonne est primordiale, car elle donne les indicateurs d’état (drapeaux du
registre STATUS) affectés (modifiés) une fois l’instruction exécutée.
- La dernière colonne renvoie à des notes en bas de page (voir tableau 1.1).
* La note 1 est très importante, elle fait allusion à la méthode « lecture/modification/écriture »
propres aux ports d’entrées/sortie (I/O).
* La note 2 indique qu’une modification d’un timer (TMR0) remet à zéro son prédiviseur.
* La note 3 indique que si vous vous servez de l’instruction pour modifier le compteur de
programme (celui qui pointe sur la prochaine instruction à exécuter), il y aura un cycle
supplémentaire.
Les assignations des registres internes (SFRs) du PIC et des différents indicateurs des
registres de contrôle (STATUS, OPTION_REG, INTCON etc…) sont donnés par Microchip
dans le fichier 16F877.I16 ou 16F877.INC ( 16F877A.INC pour le PIC16F877A). Voici le
contenu de ce fichier :
LIST
; P16F877.INC Standard Header File, Version 1.00 Microchip Technology, Inc.
NOLIST
; This header file defines configurations, registers, and other useful bits of
; information for the PIC16F877 microcontroller. These names are taken to match
; the data sheets as closely as possible.
;==================================================================
;
; Revision History
;
;==================================================================
9
;1.12 01/12/00 Changed some bit names, a register name, configuration bits
; to match datasheet (DS30292B)
;1.00 08/07/98 Initial Release
;==================================================================
;
; Verify Processor
;
;==================================================================
IFNDEF __16F877
MESSG "Processor-header file mismatch. Verify selected processor."
ENDIF
;==================================================================
;
; Register Definitions
;
;==================================================================
W EQU H'0000'
F EQU H'0001'
10
CCP1CON EQU H'0017'
RCSTA EQU H'0018'
TXREG EQU H'0019'
RCREG EQU H'001A'
CCPR2L EQU H'001B'
CCPR2H EQU H'001C'
CCP2CON EQU H'001D'
ADRESH EQU H'001E'
ADCON0 EQU H'001F'
11
;----- INTCON Bits --------------------------------------------------------
12
T2CKPS0 EQU H'0000'
13
;----- ADCON0 Bits --------------------------------------------------------
ADCS1 EQU H'0007'
ADCS0 EQU H'0006'
CHS2 EQU H'0005'
CHS1 EQU H'0004'
CHS0 EQU H'0003'
GO EQU H'0002'
NOT_DONE EQU H'0002'
GO_DONE EQU H'0002'
ADON EQU H'0000'
14
CCP2IE EQU H'0000'
15
NOT_TX8 EQU H'0006' ; Backward compatibility only
TX8_9 EQU H'0006' ; Backward compatibility only
TXEN EQU H'0005'
SYNC EQU H'0004'
BRGH EQU H'0002'
TRMT EQU H'0001'
TX9D EQU H'0000'
TXD8 EQU H'0000' ; Backward compatibility only
-------- ADCON1 Bits --------------------------------------------------------
;==================================================================
;
; RAM Definition
;
;==================================================================
__MAXRAM H'1FF'
__BADRAM H'8F'-H'90', H'95'-H'97', H'9A'-H'9D'
__BADRAM H'105', H'107'-H'109'
__BADRAM H'185', H'187'-H'189', H'18E'-H'18F'
;==================================================================
;
; Configuration Bits
;
;==================================================================
16
_CP_ALL EQU H'0FCF'
_CP_HALF EQU H'1FDF'
_CP_UPPER_256 EQU H'2FEF'
_CP_OFF EQU H'3FFF'
_DEBUG_ON EQU H'37FF'
_DEBUG_OFF EQU H'3FFF'
_WRT_ENABLE_ON EQU H'3FFF'
_WRT_ENABLE_OFF EQU H'3DFF'
_CPD_ON EQU H'3EFF'
_CPD_OFF EQU H'3FFF'
_LVP_ON EQU H'3FFF'
_LVP_OFF EQU H'3F7F'
_BODEN_ON EQU H'3FFF'
_BODEN_OFF EQU H'3FBF'
_PWRTE_OFF EQU H'3FFF'
_PWRTE_ON EQU H'3FF7'
_WDT_ON EQU H'3FFF'
_WDT_OFF EQU H'3FFB'
_LP_OSC EQU H'3FFC'
_XT_OSC EQU H'3FFD'
_HS_OSC EQU H'3FFE'
_RC_OSC EQU H'3FFF'
LIST
BIBLIOGRAPHIE:
17