Vous êtes sur la page 1sur 22

Aix Marseille Université

Travaux Pratiques

Informatique
Industrielle

Julien Marot Belgacem Jaballah Marc Allain


julien.marot@fresnel.fr belgacem.jaballah@lsis.org marc.allain@fresnel.fr
Formation au développement d'applications en Assembleur sur un microcontrôleur Mircrohip PIC 18F4520 en utlisant
l'environnement MPLAB IDE.
Travaux Pratiques de Microcontrôleur – PIC 18F4520
1. Avant de commencer
Ces séances de travaux pratiques (TP) sont destinées à illustrer les notions qui vous ont été présentées en cours. Pour
cela, vous aurez à concevoir et à tester un certain nombre de programmes soit en langage assembleur soit en langage C.

Pour chaque tâche que vous aurez à réaliser, nous vous invitons à enregistrer votre programme sous un nom
particulier pour garder une sauvegarde de travail. Pour faciliter le débogage et assurer la maintenance et la portabilité de
vos codes, il est primordial que vous commenciez par rédiger un algorigramme, que vous commentiez clairement votre
programme et que vous pensiez à le rendre le plus clair possible (ex : en choisissant des noms appropriés pour les
labels).

Concernant l'évaluation de votre travail, nous vous demanderons de nous présenter le programme
correspondant à chaque tâche que vous aurez à programmer sur le simulateur ou sur le kit de démonstration (cf. plus
bas). Nous corrigerons également vos codes en portant une attention particulière à la lisibilité (pensez donc aux
commentaires !). Enfin, vous devrez également nous rendre les algorigrammes qui correspondent aux codes.

2. Le Matériel

2.1. Le Kit PICDEM 2 Plus et PIC 18F4520


Le kit PICDEM 2 Plus est un kit simple qui permet de mettre en évidence les capacités de différents micro-
contrôleurs du fabricant Microchip à travers divers périphériques et accessoires reproduits sur le schéma de la figure 1.

Figure 1 : Le kit PICDEM 2 PLUS, Périphériques et Accessoires

Le micro-contrôleur utilisé est le PIC18F4520 de Microchip. C'est un micro-contrôleur 8 bits disposant d'une
mémoire de programme de 32 Ko, de 1536 octets de RAM (Random Access Memory), d'une EEPROM (Electrically
Erasable Programmable Read Only Memory) de 256 octets et de 36 entrées/sorties.

Une part importante de la difficulté pour programmer un micro-contrôleur réside dans l'acquisition
d'informations. Pour acquérir cette compétence, nous vous invitons à vous référer fréquemment à la documentation
technique du micro-contrôleur, ainsi qu'à la documentation technique de la carte d'évaluation, cf. les documentations
électroniques.

2.2. MPLAB Integrated Development Environment


MPLAB IDE est un environnement gratuit de programmation pour les micro-contrôleurs de la famille
Microchip. L’environnement intègre un éditeur d’assembleur, un débogueur
RC3 complet ainsi que tous les outils permettant
Travaux Pratiques de Microcontrôleur – PIC 18F4520
de gérer les programmateurs de composants. La possibilité d’intégrer un compilateur C dans l’environnement de
développement MPLAB s’inscrit directement dans la politique du service qui est d’utiliser des langages de
programmation évolués dans les développements en électronique.

2.3. Le programmateur PICSTART Plus


Il permet de transférer le programme directement de MPLAB dans le micro-contrôleur via le port série (RS232)
d'un PC.

3. Gestion de vos fichiers


Pour chacun des binômes, un compte utilisateur a éré créé. Pour ne pas oublier votre nom d'utilisateur et votre
mot de passe. vous pouvez le noter ci-dessous. Attention windows faire la déifférence entre les majuscules et les
minuscules.

Nom d'utilisateur :

Mot de passe :

Avec votre compte vous avez droit à un espace de stockage sur le serveur. Cette espace de sotckage apparait
dans « Poste de Travail » sous le nom de « voir le nom ». C'est ici que vous devez stocker tous vos documents afin
qu'ils vous soient disponibles sur toutes les machines de TP.

Il vous est fortement conseillé de bien ranger vos documents tout au long des séances. pour chacun des TP, faîtes un
répertoire associé ex: tp3 pour le tp n°3. Puis pour chaque question si c'est nécessaire faîtes des sous réperoires
question5 par exemple.

Les documentations techniques nécessaires au TP sont disponibles à


l'adresse:

https://sites.google.com/site/infoindusamu/
Travaux Pratiques de Microcontrôleur – PIC 18F4520
4. TP n°1 : Initiation à MPLAB IDE
Le but de ce TP est de se familiariser avec la suite logicielle « MPLAB Integrated Development Environment »
(v8.91) de Microchip afin de pouvoir utiliser les fonctions de bases de cet outil développement à savoir : créer un projet,
éditer et compiler un programme en assembleur, simuler son fonctionnement et enfin programmer le microcontrôleur
(µC). Les différentes fonctions sont expliquées à travers deux programmes qui vous sont donnés.

4.1. Programme « Interrupteur »


Le programme « Interrupteur » boucle à l’infini sur les tâches ci-dessous afin de reproduire le fonctionnement
d’un interrupteur.
 Tâche 1 : lire l’état du bouton poussoir S2, broche RA4
 Tâche 2 : si le bouton est appuyé, on allume la diode électro-luminescente (LED) L1, broche RB0, sinon on
l’éteint.

On notera que les boutons poussoirs sont branchés au microcontrôleur en logique négative. L'état « bouton
appuyé » correspond donc à un 0 logique. Les LED sont câblées en logique positive, elles s'allument pour un 1 logique.
Le fonctionnement demandé peut être reproduit par l'algorigramme ci-dessous.

Initialisation du µ C

oui RA 4 = 0 non
S2 appuyé

RB 0 = 1 RB0 = 0
Allumer L1 Eteindre L1

Figure 1: Algorigramme du programme « Interrupteur »

L'algorigramme peut se traduire en assembleur de la manière suivante :

LIST P=18F4520 Définition du µC utilisé, des constantes spécifiques au µC et des


#include <P18F4520.inc>
#include <CONFIG.inc> paramètres de configuration encodés lors de la programmation.

org h'0000' Adresse de départ après un reset du µC.


goto init On place l’instruction goto init à l’adresse (0000)
init clrf PORTB
movlw b'00000000' Initialisation :
movwf TRISB
clrf PORTA Remise à zéro des bascules D des différents ports utilisés et
movlw b'00010000' configuration des entrées/sorties.
movwf TRISA
boucle btfsc PORTA,4
goto eteindre
bsf PORTB,0
goto boucle
eteindre bcf PORTB,0 Boucle infini :
goto boucle Allume ou éteint la LED en fonction de l’état du bouton poussoir.
END

Tout au long des travaux pratiques, nous vous demandons d'établir un glossaire des
différentes instructions rencontrées avec leur explication en français. Ce glossaire vous sera
très utile pour les différents programmes que vous serez amenés à réaliser.
Travaux Pratiques de Microcontrôleur – PIC 18F4520
4.2. Édition et Compilation du programme
Cette partie permet d'apprendre à créer un projet MPLAB, saisir un programme en assembleur et le compiler.
4.2.1. Démarrage
 Avant de commencer, créer le répertoire tp1 puis dans ce répertoire créer à nouveau un répertoire
interrupteur.
 Copier dans ce dernier répertoire les fichiers P18F4520.inc et CONFIG.inc
 Lancer la suite logicielle MPLAB IDE à partir de l’icône qui se trouve sur votre bureau.

4.2.2. Création d’un nouveau projet avec « Project Wizard »


 Cliquer sur Project >> Project Wizard …
 Cliquer sur Suivant > puis sélectionner PIC18F4520 dans le menu déroulant Device.
 Les fichiers asmwin, asmlib, asmlink doivent ensuite être trouvés (cliquer sur Browse à chaque fois) dans le
dossier MPASM SUITE en remontant dans l'arborescence des dossiers.
 Cliquer sur Suivant > puis sélectionner « Microchip MPASM Toolsuite » et « MPASM Assembler » afin de
pouvoir programmer en Assembleur.
 Cliquer sur Suivant > puis dans le champ « Project Name » saisir le nom du projet (ex : interrupteur) et
dans le champ « Project Directory » aller chercher à l’aide du bouton « Browse », le dossier créé au début :
tp1/interrupteur.
 Cliquer sur Suivant > et ajouter les fichiers P18F4520.inc et CONFIG.inc au projet à l’aide du bouton
« Add » >>
 Cliquer sur Suivant > puis sur Terminer.
4.2.3. Edition du programme
Créer un nouveau fichier dans le projet, File >> Add New Files to Project…
L’enregistrer dans le répertoire projet avec l’extension asm (ex : prog.asm)
MPLAB Editor se lance
Saisir le programme « Interrupteur » et enregistrer.

Penser à ajouter des commentaires au programme pour montrer que vous avez bien compris les différentes
instructions. Une ligne de commentaire commence par « ; ».

Workspace
Architecture et
contenu du projet Output
Interface
MPLAB Développeur

Editor
Edition des
fichiers
de programme,
de configuration
Figure 2: MPLAB IDE, Mode Edition

4.2.4. Compilation
 Cliquer sur Project >> Build All … ou sur l’icône de la barre de menu ou encore Ctrl+F10 pour
compiler le projet complet. Erreurs et warnings sont signalés dans la fenêtre Output ainsi que le résultat de
la compilation BUILD SUCCEEDED ou BUILD FAILED.
En double-cliquant sur une erreur ou un warning dans la fenêtre Output, vous serez amener directement à
la ligne concernée dans votre programme.
Travaux Pratiques de Microcontrôleur – PIC 18F4520
4.3. Simulation
Avant d’envoyer un programme au µC, vous pouvez tester son fonctionnement dans le simulateur (Debugger)
MPLAB SIM. Pour lancer le simulateur, cliquer sur Debugger >> Select Tool >> MPLAB SIM. Une nouvelle barre
d’outils est ajoutée ainsi qu’un onglet « MPLAB SIM » dans la fenêtre Output. Le simulateur fonctionne selon trois
modes :
 le mode Step By Step qui permet de faire une exécution pas à pas du programme (vous êtes alors l’horloge
du µC).
 le mode Animate qui exécute automatiquement le programme mais à une vitesse réduite pour que l’on
puisse suivre l'éxécution.
 le mode Run où le programme est exécuté automatiquement à la vitesse du PC.

Dans les deux premiers modes, nous obtenons des résultats au fur et à mesure de la simulation alors que dans le
dernier, les résultats ne sont visibles que lorsque la simulation est stoppée. Dans ce paragraphe, nous nous intéressons
aux modes Animate et Step By Step car ils nous permettent de voir qu’elle est l’influence des entrées sur les sorties.
Le réglage de la fréquence de l’oscillateur utilisé se fait dans Debugger >> Settings …. Dans notre cas c’est 4
Mhz.

4.3.1. Entrées : Stimulus


Comme son nom l’indique cette fonctionnalité permet de prévoir les événements d'entrées de manières
synchrones (les dates sont connues avant la simulation) et asynchrones (les événements sont déclenchés durant la
simulation par l’utilisateur). Les différents événements sont enregistrés dans une table (Workbook). Pour en créer une,
cliquer sur Debugger >> Stimulus >> New Workbook.
Dans le cadre du projet « interrupteur » on souhaite créer les événements suivants :
 à t = 0, initialisation de RA4 à 1 (bouton S2 relâché),
 à t = 10 cycles, on appuie sur S2 (RA4 = 0),
 à t = 25 cycles, on relâche le bouton (RA4 = 1).
 on veut également pouvoir inverser l’état de RA4 quand on le souhaite.

L’onglet « Pin / Register Actions » de la fenêtre « Stimulus » permet la saisie des événements en programmant
leurs dates d’arrivée (événements synchrones).

Démarche de création d’événements synchrones :

 Ajouter une colonne RA4 au tableau d’événement (bouton « Clic here to Add Signals »)
 Rechercher RA4 dans la liste « Available Signals » et l’ajouter à la liste « Selected Signals »
 Remplir la table d’événement (Time, RA4) avec (0,1) (10,0) (25,1)
 Choisir cyc (cycle) comme base de temps dans menu « Time Units »
 Enregistrer la table (bouton « Save Workbook »)

L’onglet « Asynch » de la fenêtre « Stimulus » permet de pré-programmer des boutons (colonne « Fire ») à la
génération d’événement (événements asynchrones).
Démarche de création d’événement asynchrone :

 Saisir RA4 dans la colonne « Pin/SFR » de la première ligne


 Le menu de la colonne « Action » propose cinq types d’action :
 Set High : RA4 = 1
 Set Low : RA4 = 0
 Toggle : RA4 = RA4
 Pulse High : RA4 = la largeur de l’impulsion est réglée dans les
 Pulse Low : RA4 = colonnes « Width » et « Units ».
 Choisir « Toggle » pour inverser RA4
 Enregistrer la table (bouton « Save Workbook »)

 Appliquer l’échéancier d’événement (bouton « Apply »)

Après chaque changement dans l’échéancier d’événement, cliquer sur « Apply » afin que ces changements
soient pris en compte par la simulation.
Travaux Pratiques de Microcontrôleur – PIC 18F4520

Déclencher

Figure 3: Stimuli synchrone et asynchrone

4.3.2. Sorties : Watch & Logic Analyzer


Afin de suivre et de visualiser les résultats de simulation, MPLAB SIM intègre divers outils dont :
 La fenêtre « Watch » (menu View >> Watch) qui affiche le contenu des différents registres du µC et des
différentes variables du programme. La sélection et la validation des registres et variables à afficher se fait à
travers les deux menus déroulants et les deux boutons « Add SFR » et « Add Symbol ». Un clic droit sur un
des éléments observés permet l’accès à la boîte de dialogue « Properties » afin de régler le format
d’affichage de l’élément (ex : Hex, Binary, Single Bit, ...) mais aussi de sauvegarder, exporter, … le
tableau « Watch ». Il est aussi possible de faire glisser des éléments de la fenêtre « Editor » vers la fenêtre
« Watch ».
 La fenêtre « Logic Analyzer » permet l’affichage des éléments logiques (1 bit) en fonction du « Time
Base ». Le choix des éléments à afficher se fait à l’aide du bouton « Channels ».

Pour le projet « interrupteur », on souhaite afficher :

 les registres TRISA et TRISB sous forme hexadécimale


 les registres PORTA, PORTB et W sous forme binaire
 les bits RA4 et RB0

Configurer correctement les fenêtres « Watch » et « Logic Analyzser ».


Travaux Pratiques de Microcontrôleur – PIC 18F4520

4.3.3. Simulation du programme en mode Animate


Maintenant que les entrées et sorties de la simulation sont configurées, on peut lancer la simulation. Avant toutes
choses, afin d’initialiser le µC, il est nécessaire d’effectuer un « Reset » en cliquant sur le bouton puis cliquer sur
le bouton « Animate » et observer les fenêtres « Watch » et « Logic Analyzer ».
Arrêter l’animation à l’aide du bouton , faire un nouveau « Reset », relancer l’animation, ouvrir l’onglet
« Asynch » de la fenêtre « Stimulus », agir sur RA4 et observer les résultats.

Logic Analyzer
Graphe d’évolution
de bits

Editor Watch
La flèche verte Affichage de l’état
symbolise le Program courant
Counter des registres et variables

Figure 4: MPLAB IDE, Mode Simulation

Vous pouvez également faire avancer le programme pas à pas (mode « Step By Step ») avec le bouton « Step
Into » . On notera que les boutons « Step Over » et « Step Out » permettent respectivement une exécution pas
à pas avec une exécution automatique des sous-programmes et une exécution jusqu’à la fin des sous-programmes.

4.4. Programmation du microcontrôleur


Cette phase consiste à envoyer le code hexadécimal du programme dans le µC. Une fois le programme compilé
avec succès, le code hexadécimal du programme se trouve dans le fichier avec l'extension hex (ex : prog.hex), voir le
fichier avec la fenêtre « Program Memory » du menu « View ». Le code de trouve sous l'onglet « Opcode Hex ». Si on
utilise le programmateur MPLAB ICD3 le programme est injecté dans le PIC qui se trouve sur la plaquette de test.

Si on utilise le programmateur PICSTARTPLUS:


 Connecter le programmateur PICSTART Plus sur le port série du PC et au secteur

 Placer le µC sur le programmateur (Attention au sens !)

 Dans MPLAB, sous le menu Programmer > Select Programmer chosir « 1 PICSTART Plus ». Un nouvel
onglet est alors ajouté à la fenêtre « Output ».

 Configurer le port COM sur lequel est connecté le programmateur (COM1), menu Programmer > Settings
...

 Activer le programmateur, menu Programmer > Enable Programmer, une nouvelle barre d'outils est
ajoutée.

 Envoyer votre programme, menu Programmer > Program ou en cliquant sur , le transfert est terminé
lorsque la LED jaune Activate du programmateur est éteinte et que le message « Programming/Verification
completed successfully! » apparaît dans la fenêtre Output.

 Désactiver le programmateur, menu Programmer > Disable Programmer

 Placer le µC sur la carte PICDEM 2 Plus (Attention au sens !) mettre la carte sous tension et ça marche ...
Travaux Pratiques de Microcontrôleur – PIC 18F4520
Lors des phases de manipulation du microcontrôleur, vérifier que la carte PICDEM 2 Plus ne soit pas sous
tension et faîtes attention aux pattes, elles sont fragiles.

Figure 5: MPLAB IDE, Code hexadécimal du programme

4.5. Programme « Clignotant »

4.5.1. Analyse et compréhension du programme


Le programme ci-après fait clignoter la LED L1, broche RB0, à une fréquence d’environ 1Hz. L’état de la LED
change donc toutes les 500ms.

LIST P=18F4520 Définition du µC utilisé, des constantes spécifiques au µC et des


#include <P18F4520.inc>
#include <CONFIG.inc> paramètres de configuration encodés lors de la programmation.

org h'0000' Adresse de départ après un reset du µC.


;----- Déclaration de variables
CBLOCK 0x00 Les variables t1 et t2 sont rangées dans la bank 0 de la
t1 : 1
t2 : 1 ram (adresse 0x00) et ont pour taille un octet.
ENDC

;----- Initialisation
Init clrf PORTB Remise à zéro des bascules D du port B et définition du
movlw h'00' port B en sortie.
movwf TRISB

;----- Programme Principal


boucle movlw h'01'
xorwf PORTB Boucle infini :
call tempo250ms Allume et éteint la LED toutes les 500ms.
call tempo250ms
goto boucle

;----- Sous-programme
tempo250ms
movlw t10
movwf t1
comp1 dcfsnz t1
return Sous programme de temporisation (à compléter)
movlw t20 On réalise deux boucles imbriquées qui « occupe » le
movwf t2 µC durant environ 250 ms.
comp2 dcfsnz t2
goto comp1
goto comp2

END
Travaux Pratiques de Microcontrôleur – PIC 18F4520
Comprendre le programme « clignotant » et réaliser l'algorigramme associé.
Expliquer l’utilité de xorwf dans le programme principal (utiliser une table de vérité).
Calculer les valeurs d’initialisation t10 et t20 pour que le sous programme de temporisation s’exécute en 250 ms ± 1
ms. Le nombre de cycle requis par chaque instruction est donné dans le jeu d’instruction.
Créer un nouveau projet dans MPLAB et le sauver dans le répertoire tp1/cligno puis saisir le programme précédent
en remplaçant t10 et t20 par leur valeur (pour informer le compilateur de la base dans laquelle la valeur est écrite on
précède la valeur de la première lettre de la base, ainsi 192 en décimal s’écrit d’192’, h’C0’ en hexadécimal ou encore
b’11000000’ en binaire).
Compiler votre programme et passer à la partie simulation.

N’oubliez pas de copier les fichiers P18F4520.inc et CONFIG.inc dans le répertoire tp1/cligno.

4.5.2. Simulation
Vous pouvez simuler le programme de la même manière que le programme « interrupteur » mais vous vous
apercevrez très vite que c’est très long du fait de l’animation et de la temporisation. (Vous pouvez tout de même le faire
pour bien comprendre mais en initialisant t10 et t20 à 3 et 5 par exemple.) Nous allons donc faire les simulations en
mode Run, exécution automatique.

Pour notre programme, nous n’avons besoin d’aucun événement d’entrée mais si besoin avait été on aurait pu
saisir un échéancier comme précédemment. En mode « Run » le programme s’exécute donc de façon automatique et ne
s’arrête que lorsqu’il rencontre un point d’arrêt ou à la fin du programme. Il faut donc placer correctement les points
d’arrêt afin de valider le fonctionnement de notre programme. Pour observer la durée de la temporisation il faut donc
mettre un point d’arrêt sur la ligne d’appel du sous programme de temporisation et un autre sur la ligne suivante. Pour
ajouter un point d’arrêt , double cliquer sur la ligne du programme où vous le souhaitez, ou alors utiliser le menu
Debugger >> Breakpoints … disponible depuis la touche F2.

Figure 6: Placement des points d'arrêt

Nous allons suivre l’exécution du programme à l’aide de la fenêtre « Simulator Trace » disponible dans le menu
« View ». Nous allons nous intéresser plus particulièrement à la colonne « Time ». Vous pouvez changer l’unité de
temps de cette colonne par un clic droit menu « Display Time ». Lorsque vous affichez le temps en toutes
autres unités que cycle, la valeur affichée dépend de la fréquence de l’oscillateur du µC.

 Lancer la simulation, bouton


 Observer la fenêtre « Simulator Trace » lorsque la simulation s’arrête au premier point d’arrêt et noter le
temps d’appel de la temporisation (ex : ti = 250303 cycles)
 Relancer la simulation, bouton
 Noter à nouveau le temps de la fenêtre « Simulator Trace » (ex : tf = 500602 cycles)

Vous pouvez alors calculer la durée de la temporisation d = t f – ti = 250299 cycles soit 250,299 ms avec un
oscillateur à 4 MHz. Utiliser cette méthode pour valider vos initialisations de t10 et t20.
Travaux Pratiques de Microcontrôleur – PIC 18F4520

Figure 7: Simulator Trace aux différents points d'arrêt

Une fois les simulations terminées transférer le programme dans le microcontôleur, et effectuez le test : la LED
connectée au port RB0 clignote-t-elle ?
Travaux Pratiques de Microcontrôleur – PIC 18F4520

5. TP n°2 : Interruptions du TIMER 0


Dans ce TP, vous ferez clignoter une LED en utilisant un programme d’interruption, au lieu de la temporisation
utilisée dans un TP précédent. Nous devons faire clignoter la led L1, broche RB0, à une fréquence de 0.5Hz sans
mobiliser le microprocesseur. Il n'est donc plus question d'utiliser une temporisation pour compter le temps (cf. TP n°1).
Nous allons demander à un module externe : le TIMER0, de compter le temps et de signaler la fin du comptage au
microprocesseur par une interruption dite interruption de débordement. La figure 14 montre le signal de sortie du
TIMER0 et les interruptions de débordement associées. Le TIMER0 compte jusqu'à la valeur max en T secondes.
Toutes les T secondes, l'état de la led L1 est inversé.

Figure 8: Interruption de débordement du TIMER0

Trouver, en utilisant la datasheet, l'expression de la valeur max et de la période de comptage T en fonction de la


configuration du TIMER0. (cf datasheet p123)
Qu'elle est la configuration pour une période de comptage T d'environ 1s ?
Quels sont les bits à intialiser pour activer l'interruption du TIMER0 ?
Expliquer la configuration du registre T0CON.

L'énoncé demande de faire clignoter la led à une fréquence de 2Hz donc une période de comptage de 1s. Avec la
configuration choisi précédemment, on a une interruption toutes les (1+t)s, si on souhaite mesuer le temps précisement
cette erreur de t seconde n'est pas négligeable.
Pour compenser cette erreur décalage, l'idée est d'initialiser les registres TMR0H TMR0L afin que le comptage
ne commence pas à 0 mais à une valeur min permettant d'annuler t comme le montre la figure 15.

Figure 9: Interruption de débordement du TIMER0

Calculer la valeur min pour avoir une fréquence de comptage de 1s exactement.


Réaliser l'algorigramme du programme demandé, écrire et tester ce programme. Utilisez pour le test le logic analyser,
en initialisant TMR0 à une valeur proche de la valeur max (par exemple 'FFFD'). Vous pourrez ainsi visualiser les
changements d'état de la LED RB0.
Travaux Pratiques de Microcontrôleur – PIC 18F4520
6. TP n°3 : Ecriture d'un driver pour LCD Partie 1
L'objectif de ce TP est d'écrire et de tester un ensemble de fonctions assembleurs pour communiquer avec un
afficheur LCD. La première partie de ce TP est réalisée en simulation afin d'écrire les différentes fonctions nécessaires
au bon fonctionnement de l'afficheur.

6.1. Les afficheurs LCD


Les afficheurs à cristaux liquides généralement appelés LCD (Liquid Crystal Display) sont des modules
compacts qui nécessitent peu de composants pour leur mise en oeuvre. Plusieurs afficheurs sont disponibles sur le
marché, ils se différencient les uns des autres par leurs dimensions (de 1 à 4 lignes de 6 à 80 caractères). Certains sont
également dotés de fonctions de rétroéclairage. L'afficheur du kit PICDEM 2 Plus est un afficheur 16 × 2 c'est à dire 2
lignes de 16 caractères avec des caractères de 5×8 pixels.

Pour communiquer avec l'extérieur tout afficheur à besoin d'un circuit spécialisé de gestion appelé « contrôleur
d'affichage », il en existe différents modèles sur le marché mais ils ont tous le même fonctionnement. La carte
d'évaluation est équipée du modèle HD44780U de SHARP. Le contrôleur sert donc d'interface entre le microcontrôleur
et l'afficheur (cf. figure 9). Le but du driver est de gérer le bus CONTROL afin que le contrôleur d'affichage comprenne
le bus DATA et affiche ce que l'on souhaite sur l'écran LCD.

Figure 10: Communication avec l'afficheur LCD

Le contrôleur d'affichage peut recevoir deux types d'information sur le bus DATA, un ordre (ex: effacer l'écran)
ou une donnée (ex: le caractère A). Ordres ou données sont envoyés sur le bus DATA sous forme d'octets (8 bits). Mais
pour ne pas utiliser toutes les broches de sorties d'un microcontrôleur pour communiquer avec un LCD, les contrôleurs
d'affichage fonctionnent également en 4 bits, un nombre codé sur 4 bits s'appelle un quartet. En mode 4 bits, un octet est
envoyé en deux fois : le quartet de poids fort puis le quartet de poids faible.

Le bus CONTROL est constitué de trois lignes :


 La ligne RS (Register Select) qui permet au contrôleur d'affichage de savoir si le contenu du bus DATA
est un ordre ou une donnée. Un niveau bas indiquera un ordre et un niveau haut une donnée.
 La ligne RW (Read Write) informe le contrôleur si on vient lire ou écrire dans sa mémoire, un niveau bas
correpondant à une action d'écriture.
 La ligne E (Enable) qui informe le contrôleur d'affichage qu'un quartet (mode 4 bits) ou un octet (mode 8
bits) est disponible. Cette ligne est active sur front descendant. Elle réalise la syncronisation entre le
microcontrôleur et l'afficheur.

Les connexions entre le contrôleur d'affichage et le microcontrôleur sont regroupées dans le tableau 1.

D'après le tableau 1 et le schéma extrait du User’s Guide, quel est le mode de fonctionnement du contrôleur
d'affichage ?
Travaux Pratiques de Microcontrôleur – PIC 18F4520

Bus Contrôleur Microcontrôleur


RS RA3
CONTROL RW RA2

E RA1

DB7 RD3

DB6 RD2
DATA
DB5 RD1

DB4 RD0

a) b)
a) tableau 1: Connexion entre le contrôleur d'affichage et le microcontrôleur; b) extrait PICDEM 2 Plus User's
Guide (p18). On a Power-on Reset, RA5 and RA3:RA0 are configured as analog inputs and
read as ‘0’. RA4 is configured as a digital input... (cf datasheet p224).
b) Attention : sur les nouvelles cartes PICDEM2+, le câblage microcontrôleur vs. Contrôleur
d’affichage a changé. D’où la nécessité de définir les ports d’entrée pour l’afficheur LCD.
Dans le cadre de la gestion des ports de configuration du contrôleur d’affichage, l’objectif de cet
exercice est de paramétrer les ports E, R/W, et RS en fonction des broches du microcontrôleur
auxquelles ces ports sont connectés. Seul le bus de contrôle (voir figure 10 et tableau 1 de l’énoncé)
est concerné.
Comparaison des schémas de câblage des cartes rouge/verte/noire

D’après les figures ci-dessous, à quelles broches du microcontrôleur sont reliées les broches de
contrôle E, R/W, RS du contrôleur d’affichage, dans chaque cas ?

Schéma de câblage du LCD pour la carte PICDEM2PLUS rouge


Travaux Pratiques de Microcontrôleur – PIC 18F4520

Schéma de câblage du LCD pour les cartes PICDEM2PLUS verte et noire

i. Proposez un fichier de configuration ‘My_Config_LCD.inc’ dans lequel vous définirez les


variables E, RS, et RW, en fonction des broches correspondantes du microcontrôleur.
Considérez tout d’abord la configuration des cartes rouges.

Par exemple, l’une des lignes de code sera :


#define RS PORTA,3

Considérez maintenant la configuration des cartes verte/noire. Créez le fichier


‘My_Config_LCD_Noir.inc’ correspondant.

En incluant cette définition dans votre fichier de configuration, vous pourrez utiliser la notation
‘RS’ au lieu de la notation ‘PORTA,3’ ou ‘PORTD,4’ dans les fichiers assembleur que vous allez
créer désormais. Par exemple, pour passer à 1 le bit 4 du port D, et donc la broche RS d’un
contrôleur d’affichage vous pourrez utiliser la ligne de commande suivante :
bsf RS

Pour que votre fichier de configuration soit pris en compte dans votre programme principal, vous
devez l’inclure dans le projet et le fichier principal de la même façon que le fichier ‘CONFIG.inc’.

ii. Ecrivez deux lignes de code qui permettent de passer à 1 la broche E du contrôleur
d’affichage, d’attendre 2 cycles, puis de passer à 0 la broche E. On suppose que E est
initialisé à 0.

Par extension, on parlera indistinctement des ‘lignes’ E, R/W, RS et des ‘broches’ E, R/W, RS. Le
terme ligne se réfère plutôt au bus de contrôle.
Vous êtes maintenant prêt à aborder les fonctions de gestion.
Travaux Pratiques de Microcontrôleur – PIC 18F4520

6.2. Fonctions de gestion

6.2.1. Transfert d'un octet


L'écriture d'un ordre ou d'une donnée en mode 4 bits se fait selon la séquence reproduite en figure 10, l'octet à
transférer étant b7b6b5b4b3b2b1b0 avec b7 bit de poids fort.

Figure 11: Transfert d'un octet en mode 4 bits

 Phase I : RW=0 et E=0. RS et DB7...4 sont positionnés à la valeur souhaitée : quartet de poids fort (MSB)
 Phase II : E=1.
 Phase III : E=0, le quartet transféré (poids fort) est pris en compte par le contrôleur lors du front descendant.
 Phase IV : DB7...4 sont positionnés à la valeur souhaitée : quartet de poids faible (LSB)
 Phase V : E=1.
 Phase VI : E=0, le quartet transféré (poids faible) est pris en compte par le contrôleur lors du front
descendant.

Réaliser l'algorigramme et écrire la fonction « lcd_ecrire_quartet » qui génère la séquence IV, V, VI sans tenir
compte de l'état de RS pour l'instant, E étant déjà initialisé à 0. Le quartet à écrire est stocké dans les 4 bits de poids
faible du registre de travail « W ». La ligne E restant à l'état haut durant 2 cycles. Vous pourrez utiliser les instructions
nop, bsf, bcf, movwf, andlw (cf. datasheet). Tester cette fonction avec le simulateur de MPLAB.
Nous allons maintenant écrire la fonction « lcd_ecrire_octet » (c'est à dire la séquence I ...VI) en utilisant bien
évidemment la fonction « lcd_ecrire_quartet ». On ne tient toujours pas compte de l'état de RS et E étant initialisé à 0.
L'octet complet à transférer se trouve dans le registre « W » et sera sauvegardé dans la variable « lcd_db » stockée en
ram. L'instruction swapf pourrait vous être utile. Écrire et tester cette fonction en simulation.

Les fonctions d'écriture sont maintenant quasiment terminées. Il reste à gérer l'état ligne de la ligne RS, il suffit pour
cela d'ajouter une instruction avant l'appel de la fonction « lcd_ecrire_octet ». Réaliser les algorigrammes et écrire les
deux fonctions « lcd_ecrire_ordre » et « lcd_ecrire_donnee ».

6.2.2. Lecture de l'état du contrôleur d'affichage


Lorsque que l'on demande au contrôleur d'exécuter une action (ordre ou commande), ce dernier met un certain
temps à la réaliser. Si une nouvelle action lui est demandée alors que la précédente n'est pas encore terminée, elle ne
sera pas prise en compte. Pour résoudre ce problème il est nécessaire de savoir si le contrôleur est disponible. On ne va
donc plus « écrire » mais « lire » dans le contrôleur.
Travaux Pratiques de Microcontrôleur – PIC 18F4520

Figure 12: Lecture de l'état de l'afficheur en mode 4 bits


 Phase I : RW=1 et RS = 0, il s'agit d'une instruction (ordre) de lecture et E=0
 Phase II : E passe à 1 pour demander le quartet de poids fort.
 Phase III : On vient lire la valeur du quartet MSB sur DB7...DB4.
 Phase IV : E passe à 0 pour signaler la fin de la lecture du premier quartet.
 Phase V : E repasse à 1 pour demander le quartet de poids faible.
 Phase VI : On vient lire la valeur du quartet LSB sur DB7...DB4.
 Phase VII : E repasse à 0 pour signaler la fin de la lecture du deuxième quartet.

Note : Pour venir lire DB7...DB4 il faut que les broches RD3...RD0 soient configurées en entrées. Mais il faut
pense à les remettre en sortie pour la suite.

Sur la figure 12, l'octet reçu est de la forme BF AC6AC5AC4AC3AC2AC1AC0 avec BF bit de poids fort. BF qui
signifie Busy Flag vaut 1 si l'afficheur est occupé. Les bits AC6...1 représentent l'Address Counter c'est à dire la valeur
courante du pointeur de RAM du contrôleur cette information doit être lue mais ne nous est pas utile, elle ne sera donc
pas mémorisée.

Réaliser l'algorigramme puis écrire la fonction « lcd_dispo » qui boucle tant que le bit BF n'est pas égal 0. C'est à
dire tant que l'afficheur n'est pas prêt à effectuer une nouvelle action. Au début de la fonction mettre les broches
RD3...RD0 en entrée et penser à les remettre en sortie avant de quitter celle-ci, gérer également les lignes RS et RW.
Avant de lire le quartet on attend 2 cycles. Tester ce sous-programme avec le simulateur.
Travaux Pratiques de Microcontrôleur – PIC 18F4520
6.2.3. Procédure d'initialisation du contrôleur d'affichage
Quand le contrôleur démarre on ne sait pas si il est positionné en 4 ou 8 bits, comme le montre la procédure
d'intialisation reproduite en figure 12, il est donc nécessaire d'envoyer la commande de passage en mode 8 bits
(Function Set 8-Bit Interface) plusieurs fois pour qu'elle soit bien comprise. Puis on demande le passage en 4 bits
(Function Set 4-Bit Interface).

Figure 13: Procédure d'initialisation 4 bits du contrôleur d'affichage


(extrait de la datasheet du HD44780U )
Travaux Pratiques de Microcontrôleur – PIC 18F4520

En analysant la procédure on remarque qu'il y a trois temporisations (>15ms, >4,1ms et >100µs). Pour simplifier
le code nous allons écrire deux fonctions de temporisation, une d'environ 5 ms (15 = 5×3) et une autre d'environ 100µs.
En vous inspirant de la temporisation réalisée au TP n°1. Réaliser les algorigrammes puis écrire les fonctions
« tempo_5ms » et « tempos_100us » et les valider par simulation. Si besoin est vous pouvez créer des variables en
mémoire.

La dernière partie de la procédure consiste à régler les caractéristiques de l'écran. Dans notre cas nous prendrons :
 N = 1 pour fonctionner sur deux lignes.
 F = 0 règle la taille des caractères (5×8 dots).
 I/D = 1 afin que le curseur se déplace vers la droite après avoir affiché un caractère.

Réaliser l'algorigramme puis écrire la fonction « lcd_init » qui réalise cette procédure, pensez à utiliser les fonctions
que vous avez déjà créées. Intégrer l'intialisation des ports dans « lcd_init ». Valider la procédure par simulation.

Les principales fonctions de transfert et de lecture d’informations vers le contrôleur d’affichage sont maintenant
conçues. L’objet du TP 4 est de se rapprocher de la partie ‘hardware’ en gérant le choix de la ligne pour l’affichage par
exemple, et en écrivant une chaîne de caractères.
Travaux Pratiques de Microcontrôleur – PIC 18F4520
7. TP n°4 : Ecriture d'un driver pour LCD Partie 2

Dans ce TP, on complétera la fonction lcd_ecrire_octet, on contrôlera le basculement entre les lignes de l’écran
LCD, et enfin on affichera une chaîne de caractères.

7.1 Basculement entre les lignes


Le contrôleur d'affichage dispose d'une mémoire DDRAM représentant l'afficheur. Dans notre cas la taille de la
mémoire utilisée est de 2 lignes de 16 octets chacune. Pour changer de ligne, il suffit de venir positionner l'Address
Counter au début de ligne souhaitée.

Figure 14: DDRAM du contrôleur

En utilisant vos différentes fonctions écrire les fonctions « lcd_l1 » et « lcd_l2 » permettant de choisir la ligne sur
laquelle on souhaite écrire.
Écrire la fonction « lcd_cls » qui efface tout l'écran. (cf. figure 12)
Modifier la fonction « lcd_ecrire_octet » : au début pour se placer en mode écriture, et à la fin pour attendre que le
contrôleur ait pris en compte l'action.
Dans le fonction d’initialisation, mettez le contrôleur d’affichage sur ‘ON’ en fixant à 1 la valeur de PORTD,7.
C’est nécessaire au bon fonctionnement des cartes noires ou vertes.
7.2 Tests des différentes fonctions
Voilà nous sommes maintenant prêts à utiliser l'afficheur LCD. Pour faciliter l'utilisation des fonctions que vous
venez de créer il est conseillé de toutes les mettre dans un fichier « lcd.asm » afin de pouvoir les inclure dans vos futurs
programmes. L'utilisation de ce fichier par la suite est très simple, il suffit de taper la commande « #include lcd.asm » à
l'endroit de votre programme où vous souhaitez intégrer vos fonctions et de définir les variables « lcd_db, ... » au début
de votre programme. Le fichier « lcd.asm » doit se trouver dans le même répertoire que votre programme.

Écrire le programme qui reproduit l'écran ci-dessous sur l'afficheur.

I n f o
I n d u s

Si vous taper « movlw 'I' » le registre « W » sera chargé avec le code ascii du caractère I.
Travaux Pratiques de Microcontrôleur – PIC 18F4520

7.3 Écrire une chaine de caractères


La méthode qui nous a permis de tester les fonctions de gestion de l'afficheur n'est pas des plus efficace car il est
nécessaire de retaper le même code pour chacun des caractères. Nous allons donc écrire une fonction qui affiche une
chaine de caractères complète. La chaine de caractères est stockée dans la mémoire programme. Pour stocker une
chaîne en mémoire programme, il suffit d'utiliser la directive « db » comme dans l'exemple suivant :
...
org h'0000'
goto main
ch db "Microcontroleur",'\0' ;ecrire en mémoire programme

main nop
...
La chaîne « Microcontroleur » est stockée dans la mémoire programme, elle se termine par le caractère « \0 ».
Le label « ch » pointe vers le premier caractère de la chaîne, c'est donc l'adresse de début de la chaine. Dans la mémoire
programme du PIC 18F4520, les adresses sont codées sur 21 bits donc 3 octets. Comme nous disposons d'un
microcontrôleur 8 bits nous utiliserons les directives « UPPER(ch), HIGH(ch), LOW(ch) » pour obtenir respectivement
l'octet de poids le plus fort, de poids intermédiaire et de poids faible.

Pour lire dans la mémoire programme, il faut tout d'abord initialiser le pointeur d'adresse de mémoire
programme « TBLPTR » avec l'adresse de l'octet à lire. Pour lire un octet on utilse l'instruction « TBLRD » qui transfère
le contenu de la mémoire dans le registre « TALBAT ».

Consulter la datasheet du pic p73-76 et p305.

Configurer correctement l'instruction « TBLRD ».


Réaliser l'algorigramme de la fonction « lcd_ecrire_chaine ».
Écrire et tester cette fonction.

L'afficheur LCD ne peut afficher que 16 caractères par ligne...

NOTES : Comment améliorer ces TPs ?