Vous êtes sur la page 1sur 15

Ecole Supérieure de Technologie

Diplôme Universitaire de Technologie

"Electronique embarquée pour l’automobile "

Module

Systèmes à microprocesseurs/ Microcontrôleurs

Manuel de travaux Pratiques

Année universitaire : 2018/2019

Elaboré par : Youssef ROCHDI

youssef.rochdi@uit.ac.ma
TP1 : Initiation à l’utilisation de MPLABX et à la programmation
des pic en assembleur
1. Outils de travail

1.1. Environnement de développement intégré MPLABX


Microchip met à la disposition des développeurs un environnement de développement intégré
libre, qui leur permet de :
· Rédiger du code source en langage C ou en assembleur, construire le programme exécutable
(binaire) à programmer sur le MCU PIC.
· Simuler le fonctionnement et Mettre au point le programme en corrigeant les erreurs de
fonctionnement (debuggage).
· Programmer le MCU à l’aide d’un programmateur.

1.2. Installation de MplabX


· Télécharger l’installateur à partir de : www.microchip.com/mplab/mplab-x-ide ;
rubrique Download. Installer de préférences la version 64bits
· Lancer l’installateur et suivre les étapes suivantes :

Accepter l’accord de licence ;

Y.ROCHDI Page 1
Ne pas utiliser de proxy

Y.ROCHDI Page 2
Continuer l’installation avec les options par défaut ; ne pas installer les compilateurs
xc16, xc32 pour le moment.

1.3. Création d’un premier projet

Dans ce paragraphe on donnera les principales étapes utiles pour créer un projet de programmation
d'un PIC sous MPLABX; 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 MPLABX IDE version 5.05.

1. Démarrer MPLAB, puis aller sur le menu Projet : New Project

2. Choisir la catégorie Microchip embedded et Standalone project

3. Choisir la famille des pic Mid-Range et le microcontrôleur 16F84A

Y.ROCHDI Page 3
4. Sélectionner l’outil de débuggage et de mise au point : Simulator

5. Sélectionner l’outil de construction ou de compilation: mpasm

Y.ROCHDI Page 4
6. Donner un nom au projet et choisir le chemin où il sera placé. Eviter des chemin trop long
comme le bureau de windows ou des chemins avec des espaces ou des caractères
accentués.

7. Le projet est créé dans MPLABX et est ouvert dans la fenêtre Projects, mais il est encore vide
car il ne contient aucun fichier source.

Y.ROCHDI Page 5
8. Click droit sur le dossier Sources Files, et choisir l’option add existing item…

9. Naviguer vers le dossier où est installé MplabX, en général ca sera C:/Program Files
(x86)/Microchip/MplabX/v5.05, rentrer dans le dossier mpasm, chercher le fichier
p16F84A.inc , cocher la case copy pour faire une copie vers le dossier projet

Y.ROCHDI Page 6
10. Ajouter de la même manière le fichier template 16F84ATEMP.ASM, à partir du dossier
indiqué sur la figure suivante , Faire une copie en cochant la case copy:

11. Cliquer-glisser le fichier p16F84A.inc vers le dossier Header Files dans la fenêtre Projects :

1.4. Intégration du code Utilisateur dans le projet crée:

Le projet crée ne contient que deux fichiers: 16F84ATEMP.ASM et P16F84A.INC. Nous allons
analyser leur contenu.
1. 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:

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

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

Y.ROCHDI Page 7
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'

Ce fichier donne 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.

2. Double-cliquer sur le fichier 16F84TEMP.ASM pour l'ouvrir; Il contient déjà des directives et
des instructions ; c’est un modèle pour toute application en assembleur pour ce PIC.

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.

Pour le moment désactiver le watchdog en changeant _PWRTE_ON par _PWRTE_OFF.

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 numériques 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 sous-programme
d’interruption doit être placé à partir de 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
movf STATUS,w ; dans les variable temporaries w_temp et status_temp
movwf status_temp ;

; la routine d'interruption doit être place ici


movfstatus_temp,w ; avant de terminer la routine d'interruption, restaurer le registre
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

Y.ROCHDI Page 8
main
; l'utilisateur place ici son code

END ; directive de fin d'assemblage

3. 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 ceci 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.

1.5. Construction du projet (assemblage et génération du code machine):

Pour transformer le code assembleur en code machine exécutable, on doit construire (build) le
projet.
1. Click-droit sur le nom du projet, puis choisir Build ou Clean and Build ceci 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 83 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.

Y.ROCHDI Page 9
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.
Ce petit programme peut être maintenant exécuté et testé.

1.6. Debuggage du programme (exécution, simulation et mise au point):

Le débuggage est une opération qui permet de chercher les bugs (erreurs d’exécution). Quand un
programme ne fait pas ce qu’il devrait faire, on doit l’analyser (debugger) pour trouver les
éventuelles erreurs de programmation, en faisant une trace de son exécution.
1. Lancer le debugger: Click-droit sur le nom du projet puis option : Step into

Le debugger s’arrête sur la première instruction du programme (goto main) et attend les ordres du
développeur pour avancer, en pas à pas non détaillé, en pas à pas détaillé,… à l’aide de la barre de
debuggage, tout en surveillant le PC, les bits d’états (Z, C, DC), la bank sélectionnée :

Valeurs du PC, des bits d’états, de


Arrêter le debugger Avancer de manière continue
W, de la bank sélectionnée

Stopper le debugger Avancer de manière non détaillée

Reset Avancer de manière détaillée

Sortir du pas à pas détaillé

2. Afficher les registres SFR : Menu Windows/Target Memory Views /SFRs

Y.ROCHDI Page 10
3. Faire avancer l’exécution en pas à pas détaillé (Step Into) ou raccourcis clavier F7, et observer
l’effet des instructions exécutées sur les SFRs (TRISA et PORTA), le Wreg, les bits d’états, le
PC ….
4. Faites un Reset pour recommencer l’exécution depuis le début.
5. Lancer l’exécution de manière continue (F5). Stopper l’exécution à l’aide de Pause
(Ctrl+Alt+F8).
6. Arrêter le debuggage par Finish Debugger Session (Maj+F5)

2. Exemples de programmation des PIC en assembleur :


2.1. Travail demandé :
1. Tester les exemples étudiés en séances de cours et de TD à l’aide de MPLABX et ISIS Proteus.
2.2. Exercices de synthèse :
1. Dans l’exemple de clignotement d’une LED régler la temporisation de telle sorte que la LED
clignote avec une fréquence de 1Hz.
2. Créer un programme qui commande 8 LED liées au PORTB sous forme d’un feu tournant
(Une Led allumée à la fois et reste allumé pendant 100ms).

Y.ROCHDI Page 11
TP2 : Programmation d’une application complète à l’aide du PIC
16F877A

1. Horloge numérique : Heures/Minutes/Secondes


On conçoit une horloge numérique autour d’un PIC16F877A, comme le montre le design
ISIS de la figure suivante :

1. Créer un nouveau projet MPLABX basé sur le PIC16F877A, ajouter y les fichiers
p16F877A.inc et 16F877ATEMP.asm.

2. Compléter le fichier 16F877ATEMP.asm, par le code suivant :

Y.ROCHDI Page 12
3. Construisez le projet et tester le sur ISIS , testez le sur ISIS. Après 60 secondes les minutes
seront incrémentées…
4. Pour accélérer la cadence d’incrémentation, Indiquez un quartz de 20MHz pour le PIC
dans ISIS, et réduisez la constante 0x14 dans tempo_1s à 0x01. On remarque que les
heures ne sont pas incrémentées quand les minutes atteignent 60minutes. Ajoutez à
votre code, la mise à jour des heures de telle sorte que les heures s’incrémentent de 00 à
23 de manière cycliques. Reconstruisez le projet et testez-le en cadence rapide sur ISIS,
pour attester de son bon fonctionnement.
5. L’affichage des heures peut se faire en deux modes selon l’état du switch placé au niveau
du PORTA :
· Mode 1 : Switch vers le bas RA0=0, mode d’affichage de 00h à 23h
· Mode 2 : Switch vers le haut RA0=1, mode d’affichage de 00h à 12h AM ou 01h à 23h
PM, dans ce dernier cas deux LEDs indiquent AM (Matin) ou PM (après midi).
L’affichage de l’heure devient alors plus élaboré et on décide de le faire avec une
fonction affich_heure dont le code est donné ci-dessous.
Remplacez le code d’affichage des heures, par un appel à la fonction : affich_heure, ci-
dessous. Testez l’application, en changeant la position du switch.

Y.ROCHDI Page 13
Y.ROCHDI Page 14

Vous aimerez peut-être aussi