Académique Documents
Professionnel Documents
Culture Documents
Enonce MSIS PDF
Enonce MSIS PDF
Travaux Pratiques
de
Microcontrôleur
2. Le Matériel..................................................................................................................................... 1
2.1. Le Kit PICDEM 2 Plus et PIC 18F4520..................................................................................1
2.2. MPLAB Integrated Development Environment...................................................................... 1
2.3. Le programmateur PICSTART Plus........................................................................................2
3. Gestion de vos fichiers...................................................................................................................2
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
Reset MCLR
LEDs
Entrée Analogique RB0...RB3
RA0 Contrôles
Poussoirs RA1...RA3
RA4, RB0
Microcontrôleur LCD
Données (Liquid Crystal Display )
RS232 RD0...RD3
RC6, RC7 Buzzer
RC2
RB6,
ICD Bus I2C
(In Circuit Debugger) RB7
RC4, RC3
RC5
Capteur de
Température
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.
M1 SIS 1 2011/2012
Travaux Pratiques de Microcontrôleur – PIC 18F4520
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.
M1 SIS 2 2011/2012
Travaux Pratiques de Microcontrôleur – PIC 18F4520
ASM
4. TP n°1 : Initiation à MPLAB IDE
Le but de ce TP est de se familiariser avec la suite logicielle « MPLAB Integrated Development Environment »
(v7.6) 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.
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
RB0 = 1 RB0 = 0
Allumer L1 Eteindre L1
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 amener à réaliser.
M1 SIS 3 2011/2012
Travaux Pratiques de Microcontrôleur – PIC 18F4520
Penser à ajouter des commentaires au programme pour montrer que vous avez bien compris les différentes
instructions. Une ligne de commentaire commence par « ; ».
Workspace
Output
Architecture et
Interface
contenu du projet
MPLAB Développeur
Editor
Edition des fichiers
de programme,
de configuration, …
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
M1 SIS 4 2011/2012
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.
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).
– 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 :
M1 SIS 5 2011/2012
Travaux Pratiques de Microcontrôleur – PIC 18F4520
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.
Déclencher
M1 SIS 6 2011/2012
Travaux Pratiques de Microcontrôleur – PIC 18F4520
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 5: 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.
Démarche de transfert :
– Connecter le programmateur PICSTART Plus sur le port série du PC et au secteur
– 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.
M1 SIS 7 2011/2012
Travaux Pratiques de Microcontrôleur – PIC 18F4520
– Placer le µC sur la carte PICDEM 2 Plus (Attention au sens !) mettre la carte sous tension et ça marche ...
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.
;----- 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
;----- 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
M1 SIS 8 2011/2012
Travaux Pratiques de Microcontrôleur – PIC 18F4520
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.
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.
Vous pouvez alors calculer la durée de la temporisation d = tf – ti = 250299 cycles soit 250,299 ms avec un
oscillateur à 4 MHz. Utiliser cette méthode pour valider vos initialisations de t10 et t20.
M1 SIS 9 2011/2012
Travaux Pratiques de Microcontrôleur – PIC 18F4520
M1 SIS 10 2011/2012
Travaux Pratiques de Microcontrôleur – PIC 18F4520
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.
DATA 4 ou 8 COM 16
Contôleur
µC LCD
d'affichage
CONTROL 3 SEG 40
16 × 2
PIC18F4520
HD44780U
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.
Les connexions entre le contrôleur d'affichage et le microcontrôleur sont regroupées dans le tableau 1.
M1 SIS 11 2011/2012
Travaux Pratiques de Microcontrôleur – PIC 18F4520
– 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 ».
M1 SIS 12 2011/2012
Travaux Pratiques de Microcontrôleur – PIC 18F4520
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 13, 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.
M1 SIS 13 2011/2012
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
M1 SIS 14 2011/2012
Travaux Pratiques de Microcontrôleur – PIC 18F4520
« 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.
5.2.4. 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.
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 » afin d'attendre que le contrôleur est pris en compte l'action.
5.2.5. Tests des différentes fonctions
Voilà nous sommes maintenant prêt à 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.
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.
M1 SIS 15 2011/2012
Travaux Pratiques de Microcontrôleur – PIC 18F4520
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 ».
M1 SIS 16 2011/2012
Travaux Pratiques de Microcontrôleur – PIC 18F4520
Interruptions de débordement
max
T
Figure 14: Interruption de débordement du TIMER0
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.
Interruptions de débordement
max
min
0
T-t
Figure 15: Interruption de débordement du TIMER0
6.2. Chronomètre
Nous allons maintenant réaliser un chornomètre simplifié en utilisant le TIMER0, l'afficheur LCD et le bouton
S2, broche RA4. Le temps doit s'afficher sur le LCD sous le format :
M1 SIS 17 2011/2012
Travaux Pratiques de Microcontrôleur – PIC 18F4520
m m - - s s
– Un premier appui sur S2 déclenche le chronomètre, le temps évolue sur l'afficheur LCD.
– Un deuxième appui sur S2 arrête le chronomètre, le temps écoulé est affiché sur le LCD.
Les nombres représentant les minutes et les secondes seront respectivement stockés dans les octects MIN et SEC.
Le temps est mesuré par l'interruption de débordement du TIMER0. Comme il a été vu au TP précédent, l'afficheur
LCD ne comprend que des caractères (code ASCII), on ne peut donc pas directement lui envoyer les octects MIN et
SEC puisque ceux sont des nombres.
Caractère 0 1 2 3 4 5 6 7 8 9
Code 48 49 50 51 52 53 54 55 56 57
ASCII (0x30) (0x31) (0x32) (0x33) (0x34) (0x35) (0x36) (0x37) (0x38) (0x39)
Réaliser l'algorigramme puis écrire le code de la fonction « lcd_ecrire_nombre » qui affiche sur le LCD le
nombre contenu dans NB sachant que ce nombre est compris entre 00 et 99. Il faut donc afficher le chiffre des
dizaines puis le chiffre des unités. (NB est un octect à déclarer, vous pouvez tester cette fonction en simulation)
Réaliser l'algorigramme puis écrire le code de la routine d'interruption et de l'interruption de débordement du
TIMER0.
Le bouton poussoir S2 permet à l'utilisateur d'agir sur l'état chronomètre. D'après le fonctionnement décrit ci-
dessus, un appui sur le bouton change l'état du chronomètre.
Réaliser l'algorigramme et écrire la fonction « bouton_appui » qui détecte un appui sur le bouton S2, l'appui
étant détecté lorsque l'utilisateur relâche le bouton.
Réaliser l'algorigramme du chronomètre puis écrire le programme principal.
Transférer votre programme et chronometrez-vous!
M1 SIS 18 2011/2012
Travaux Pratiques de Microcontrôleur – PIC 18F4520
Le mouvement de la lamelle dans l’air génère un son. La fréquence du son émis est directement lié à la nature
et à la fréquence du signal appliqué aux bornes du transducteur piézo-électrique.
Sur la carte d’évaluation PICDEM 2 Plus, le transducteur piézo-électrique peut être commandé grâce à la
broche RC2 du micro-contrôleur. Le montage électronique utilisé pour commander le transducteur piézo-électrique
permet de l’alimenter avec une tension bipolaire (+5V, -5V).
Pour générer un son, on doit donc générer un signal rectangulaire (grâce au module PWM) que l'on appliquera
au transducteur piézo-électrique si l'utilisateur appuie sur le bouton poussoir S3. Il faudra initialiser tous les modules
nécessaires à la génération d'un signal rectangulaire (module CCP1, TIMER2) (voir p.159 du « data-sheet ») et
initialiser le PORTC. À partir du programme précédent, apporter les modifications nécessaires :
lors de l'initialisation :
– Dans le cas où RB0 est à l'état haut on activera le transducteur piézo-électrique en agissant sur le registre
CCP1CON,
– Dans le cas où RB0 est à l'état bas on désactivera le transducteur piézo-électrique en agissant sur le registre
CCP1CON,
– Dans le cas où la valeur sur la broche RB0 est égale à la dernière valeur acquise on ne fera rien.
Attention : Le Duty Time est le temps pendant lequel le signal est à l’état haut. Il faut adapter ce temps en fonction de
la fréquence du signal généré pour garder un rapport cyclique égale à 0,5. Pour cela lisez la documentation technique
et trouver la relation qu’il doit exister entre les valeurs des registres PR2 et CCPR1L:CCP1CON<5:4> pour que le
rapport cyclique reste égale à 0.5.
Donner la relation qu’il doit exister entre les valeurs des registres PR2 et CCPR1L:CCP1CON<5:4> pour que le
rapport cyclique reste égale à 0.5 et proposer un partie de programme (le plus simple possible) en langage
Assembleur qui permet d’adapter le rapport cyclique (contrôlé par les registres CCPR1L:CCP1CON<5:4>) en
fonction de la fréquence (contrôlée par le registre PR2) du signal généré.
Réaliser l'algorigramme du programme demandé,
Écrire le programme sur ordinateur avec MPLAB, simuler son fonctionnement et le valider sur la carte
d'évaluation.
Dans un premier temps, modifier le programme précédent pour qu’il génère un signal rectangulaire (en utilisant le
module PWM) sur la broche RC2. Puis vous prendrez en compte la gestion du bouton RB0. En séparant les deux
problèmes, la difficulté est réduite.
M1 SIS 19 2011/2012
Travaux Pratiques de Microcontrôleur – PIC 18F4520
cela, on va faire varier la fréquence (contrôlée par le registre PR2) du signal rectangulaire généré dans la partie
précédente. Pour faire varier la fréquence du signal, on va utiliser le potentiomètre R16. À chaque fois que l'on activera
le transducteur piézo-électrique, on va mesurer la tension sur la broche RA0 en utilisant le module de conversion A/D,
on utilisera la valeur de la tension sur la broche RA0 pour déterminer la fréquence du signal rectangulaire. Les
modifications portées au programme sont les suivantes,
lors de l'initialisation,
– réaliser une acquisition de la valeur de la tension sur la broche RA0 en réalisant une conversion A/D,
– modifier la valeur du registre PR2 (fréquence du signal généré) en utilisant les bits de poids forts du
résultat de la conversion A/D,
– ajuster le rapport cyclique pour qu'il reste égale à 0.5.
M1 SIS 20 2011/2012
Travaux Pratiques de Microcontrôleur – PIC 18F4520
Assembleur Compilateur C
Fichiers pré-
compilés
script de
configuration de
l'éditeur de lien
On notera que, dans le cadre d'un même projet, il est possible de développer des parties en C
et des parties en assembleur. Dès lors, la construction d'un code machine exécutable est illustré par
le diagramme de la figure 17. Dans cet exemple, un code source en assembleur et deux codes
sources en C ont été écrits. Pour chaque source, l'assembleur (MPASMWIN) ou le
compilateur(MCC18) est utilisé pour générer des fichiers objets (file1.o,...,file3.o). Le fichier objet
file3.o est ensuite utilisé avec un fichier pré-compilé existant file4.o de manière à former un fichier
de librairie lib1.lib. Finalement, les fichiers objets restants sont utilisés avec le fichier de librairie
par l'éditeur de lien (MPLINK) pour créer un exécutable output.hex.
Notez bien également le fichier script.lkr (cf., figure 17) qui permet de configurer correctement l'éditeur de lien
pour le micro-contrôleur utilisé.
M1 SIS 21 2011/2012
Travaux Pratiques de Microcontrôleur – PIC 18F4520
L1, broche RB0, à une fréquence de 1Hz. L’état de la LED change donc toutes les 500ms.
// Author: ???
//================================================
// Description :
// Programme de génération d'un signal carré En-tête du programme
// sur le port RB[0] de période de 1 s
//================================================
//------------------------------------------------
// Directives au préprocesseur
//------------------------------------------------ Fichiers d'en-tête pour le PIC184520
// fichier d'en-tête pour le PIC184020 (p18f4520.h) et pour l'utilisation des
#include <p18f4520.h> fonctions de temporisation (delays.h)
// fichier d'en-tête pour les fonctions de tempo
#include <delays.h>
Directive « pragma » de désactivation
// Désactivation du WatchDog du watchdog.
#pragma config WDT = OFF
// Programme Principal
void main(){
//------------------------------------------------
// Déclaration des variables locales Déclaration et affectation de la variable
//------------------------------------------------ définissant le nombre de cycles
nécessaire à une demi-période
// 1/2 Periode d'oscillation en Nb de cycles
TYPE DemiPeriode = ARGUMENT; d'oscillation (à compléter).
M1 SIS 22 2011/2012
Travaux Pratiques de Microcontrôleur – PIC 18F4520
– Lancer la suite logicielle MPLAB IDE à partir de l’icône qui se trouve sur votre bureau.
7.3.2. Création d’un nouveau projet en utilisant l’assistant « Project Wizard … »
– Cliquer sur Project >> Project Wizard …
– Cliquer sur Suivant > puis sélectionner « PIC18F4520 » dans le menu déroulant « Device ».
– Cliquer sur Suivant > puis sélectionner « Microchip C18 Toolsuite » afin de pouvoir développer en C.
– Cliquer sur Suivant > puis dans le champ « Project Name » saisir le nom du projet (ex : clignotant_C) et
dans le champ « Project Directory » aller chercher à l’aide du bouton « Browse », le dossier créé au début :
« tp4/clignotant_C ».
– Cliquer deux fois sur Suivant > et ajouter « 18f4520.lkr » au projet à l’aide du bouton Add >>
– Cliquer sur Suivant > puis sur Terminer.
7.3.3. Configurer les options de compilation et d'édition de lien
– Cliquer sur Project>Build Options...>Project et cliquer sur l'onglet « General ». Vérifiez que les chemins
de « Include Path » et de « Library Path » sont correctement positionnés en utilisant l'option « Browse »...
– Dans l'onglet MPLINK Linker, cliquer sur l'option « Suppress COD-file generation ». Cliquer sur OK.
7.3.4. Édition 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 c (ex : clignotant_C.c)
– MPLAB Editor se lance
– Saisir le programme et enregistrer.
Penser à ajouter des commentaires au programme pour montrer que vous avez bien compris les différentes
instructions.
7.3.5. Compilation
La compilation et l'édition de lien se fait en cliquant sur l'icône de la barre de menu. Comme en assembleur,
les 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.
7.5. Applications
Donner l'algorigramme du chenillard défini par la séquence de motif {0x01, 0x02, 0x04, 0x08}. Chaque motif
devra rester allumé pendant un temps de 500 ms.
Pour définir la séquence de motifs, vous prendrez soin de déclarer un tableau de unsigned char car ce type correspond
à un format 8 bits qui pourra directement être affecté sur le PORT B (cf., MPLAB C18 C COMPILER USER’S
GUIDE, page 11).
M1 SIS 23 2011/2012
Travaux Pratiques de Microcontrôleur – PIC 18F4520
Donner l'algorigramme du chenillard défini par le couple de séquences {0x01, 0x02, 0x04, 0x08} et {0x01,
0x02, 0x04, 0x08, 0x04, 0x02}.
Écrire et tester ce programme.
//-------------------------------------------------
// Configuration des interruptions, cf. sections 9 et
// 11 du datasheet et le fichier header p18h4520.h
//-------------------------------------------------
L'objectif est alors de déclencher une interruption à chaque fois que le TIMER0 est en « overflow », cette
interruption commandant le changement de motif du chenillard. A toutes fins utiles, on rappelle que le langage C ne
permet pas directement de traiter les interruptions puisqu'il ne laisse pas à l'utilisateur le contrôle des adresses du
programme (équivalent du org en assembleur). A la place une directive #pragma a donc été intégrée au compilateur :
– Les directives
#pragma code mon_prog = @
void mon_prog(void)
{
code C ...
}
#pragma code
forcent le compilateur à placer le code C à l'adresse @ (cf., MPLAB C18 C COMPILER USER’S
GUIDE, page 20 et 29).
M1 SIS 24 2011/2012
Travaux Pratiques de Microcontrôleur – PIC 18F4520
– La directive
#pragma interrupt ma_fonction
déclare ma_fonction comme la fonction de traitement des interruptions prioritaires (adresse 0x18).
– La directive
#pragma interruptlow ma_fonction
déclare ma_fonction comme la fonction de traitement des interruptions non prioritaires (adresse 0x08).
Donner l'algorigramme du chenillard défini par le couple de séquences {0x01, 0x02, 0x04, 0x08} et {0x01,
0x02, 0x04, 0x08, 0x04, 0x02}, le changement de séquence étant commandé par interruption du TIMER0 par
période de 4 secondes, approximativement.
Écrire et tester ce programme.
M1 SIS 25 2011/2012
Travaux Pratiques de Microcontrôleur – PIC 18F4520
Picdem 2 Plus PC
Figure 18: Communication PC-µC
RS232 est une norme qui standardise les communications séries. La transmission de données pouvant se faire sur
7 ou 8 bits, avec ou sans contrôle de parité, celle-ci pouvant être gérées de façons paire ou impaire. Une trame RS232
commence par un bit de start et se termine par un ou deux bits de stop. La figure suivante illustre une des configurations
possibles. La vitesse de transfert pouvant également varier d'une application à l'autre. La vitesse se mesure en Bauds
(nombre de symbole transmis par seconde). Une connexion RS232 est asynchrone car entre l'émetteur et le récepteur, il
y a seulement les lignes de données Rx et Tx (pas de ligne d'horloge).
8.1.1. L'hyperterminal
L'hyperterminal est un programme livré avec Windows qui permet de se connecter à des hôtes distants
(ordinateurs, sites telnet, oscilloscope, ...) à l'aide d'un modem, d'un câble null-modem (liaison série) ou d'une
connexion TCP/IP. A chaque fois qu'un caractère est saisi, il est envoyé sur le support de communication, tout caractère
reçu est affiché.
L'hyperterminal est accessible dans le menu Démarrer > Tous les programmes > Accessoires >
Communications > Hyperterminal (Win XP) ou alors via la commande « hyperterm » dans menu Démarrer > Exécuter.
Lorsqu'il s'ouvre, il vous demande de configurer la connexion :
M1 SIS 26 2011/2012
Travaux Pratiques de Microcontrôleur – PIC 18F4520
– BAUDCON, 'Baud Rate Control Register' qui initialise la vitesse via le registre SPBRGH:SPBRG dont la
valeur est calculée en utilisant les tableaux reproduits en page 205-208 du datasheet. BAUDCON autorise
également les interruptions, la réception, ...
– RCSTA, 'Recieve Status And Control Register' pour configurer la réception
– TXSTA, 'Transmit Status And Control Register' pour configurer l'émission
✗ Émission et Réception
L'octet reçu est placé dans le registre RCREG (Recieve Register) et l'octet à envoyer est à placer dans TXREG
(Transmit Register).
Même lorsque que les interruptions sont interdites, on peut utiliser les flags pour connaître l'état (vide ou plein)
des registres RCREG et TXREG. Les flags se trouvent dans le registre PIR1 (Peripheral Interrupt Request Flag
Register 1).
Pour savoir si un octet est disponible, il suffit simplement de regarder le flag associé à RCREG (réception d'un
octet).
La procédure d'émission est représentée par le schéma bloc, ci-dessous (extrait du datacheet).
Lorsqu'un octet est placé dans TXREG, il est « coupé » dans TSR (Transmit Shift Register) qui comme son nom
l'indique effectue un décalage à la vitesse imposée par SPBRGH:SPBRG. On notera que l'état de TXREG est visible
dans TXIF et que l'information de transmission en cours se situe dans TRMT. Le schéma bloc de la réception se trouve
en page 213 du « datasheet ».
Utiliser le datacheet pour initialiser les registres BAUDCON, RCSTA et TXSTA.(Pour régler 1 bit de stop, le
bit SENDB du registre TXSTA doit être à 0)
Écrire et tester le programme « echo », utiliser le câble série du programmateur pour communiquer avec la carte
µC.
8.2. Applications
M1 SIS 27 2011/2012
Travaux Pratiques de Microcontrôleur – PIC 18F4520
étant :
Caractère 0 1 2 3 4 5 6 7 8 9
Code 48 49 50 51 52 53 54 55 56 57
ASCII (0x30) (0x31) (0x32) (0x33) (0x34) (0x35) (0x36) (0x37) (0x38) (0x39)
Toutes les 500ms, l'état des LED est modifié en utilisant une fonction de delays.h. Le changement de séquence
est géré sur interruption de réception (EUSART), quand un octet est reçu par le µC, il le renvoi pour l'afficher dans
l'hyperterminal. Si la séquence demandé n'existe pas, le µC renvoi '?' au PC et ne modifie pas le choix de séquence.
Note : La valeur du chiffre associé au code ASCII peut être obtenue par une soustraction. En C, le premier élément du
tableau est 0. Une matrice est un tableau de tableau.
8.2.2. Devinette
Le programme « Devinette » est un jeu entre le µC et vous, les communications se faisant via le PC
(hyperterminal). Le principe est simple, le µC choisi un nombre entre 0 et 255 et doit vous le faire deviner en un temps
donné, 1 min. Le temps restant est visible sur les 4 LEDs (1 led correspondant à 25s). Si vous trouvez le nombre choisi
avant 1 min, le µC vous donne le temps que vous avez mis en secondes, sinon il vous informe que vous avez perdu et
vous donne la réponse, puis le jeu recommence.
✗ Fonctions de communications :
Dans l'hyperterminal, le caractère '\n' permet de passer à la ligne suivante (touche CTRL+Entrée) et '\r' de faire un
retour chariot, retour en début de ligne (touche Entrée). Une chaîne se termine par le caractère '\0'.
Cette fonction doit renvoyer le nombre mystère. Pour cela elle incrémente un entier n codé sur 8 octets (de type
unsigned char) tant qu'aucune donnée n'est reçue sur la liaison série. Quand n = 255, si on ajoute 1 on a n = 256 qui
se code sur 9 bits mais comme n est sur 8 bits, on aura n = 0. Écrire cette fonction.
Le temps maximal pour trouver la solution est définit dans le programme principal (main). Le temps restant est
une variable globale (commune à toutes les fonctions). On mesure le temps avec le TIMER 0.
✗ Programme complet
M1 SIS 28 2011/2012
Travaux Pratiques de Microcontrôleur – PIC 18F4520
Lorsque le programme démarre, le µC envoie un message au joueur en lui demandant d'appuyer sur une touche
pour commencer, ce qui permet de générer le nombre mystère. Dès l'appui le chrono est lancé, lorsque une proposition
est faire, le µC informe le joueur du fait que le nombre mystère est supérieur ou inférieur à sa proposition. Si le joueur
trouve, il est informé de son temps sinon le nombre mystère lui est donné. A la fin d'une partie le programme se relance.
Écrire et tester le programme « devine », la conversion d'une chaîne de caractère en entier peut se faire avec la
fonction atoi de la bibliothèque stdlib.h, il y a également la fonction inverse itoa.
Le temps peut se terminer lorsque le µC est en attente d'une saisie du joueur. Le jeu se joue avec le pavé numérique du
clavier, tout appui sur une autre touche peut faire bugger le programme. Si vous avez le temps, vous pouvez détecter les
erreurs de saisie et demander une nouvelle saisie.
M1 SIS 29 2011/2012
Travaux Pratiques de Microcontrôleur – PIC 18F4520
...
_endasm
}
Nous avons maintenant codé les deux fonctions de base pour la gestion du lcd, les autres fonctions vont être
recodées en C.
Écrire la fonction « void lcd_ecrire_octet(char lcd_db) ». Dans MCC18 l'instruction swapf est remplacée par la
fonction Swapf. Pour inverser les quartets MSB et LSB de « w », il suffit d'écrire « Swapf (WREG,0,0); ».
Écrire les fonctions « void lcd_ecrire_ordre(char o) » et « void lcd_ecrire_donnee (char d) ».
Écrire les fonctions « void lcd_cls(void) », « void lcd_l1(void) » et « void lcd_l2(void) ».
Écrire les fonctions « void lcd_init(void) » en utilisant la bibliothèque « delays.h » pour les temporisations.
Créer la fonction « void lcd_curseur_position(char l, char p) » qui permet de positionner le curseur d'affichage à
la « p »ième position de la ligne « l ». (cf figure, page )
Tester ses fonctions sur la carte d'évaluation.
9.1.2. Création de fonctions de haut niveau
Le langage C nous permet d'écrire très simplement des fonctions plus évoluées pour la gestion de l'afficheur.
M1 SIS 30 2011/2012
Travaux Pratiques de Microcontrôleur – PIC 18F4520
C H A I N E
- Cas d'une chaine de longueur impaire : (plus d'espace à droite).
C H A I N E S
Créer un nouveau projet sous MPLAB comme pour faire un programme classique.
Dans le fichier source « coller » vos fonctions de gestion de l'afficheur avec les différents « #include »
Compiler, une erreur vous informe que la fonction « main » n'est pas définie, c'est normal !
Dans votre répertoire projet, un fichier objet du même nom que votre programme a été créé. C'est ce fichier que
nous allons maintenant convertir en librairie à l'aide de l'utilitaire de gestion de bibliothèque MPLIB. MPLIB est un
programme fonctionnant en mode console sous DOS avec les options suivantes :
/c Création contenant un ou plusieurs fichiers objets
/t Liste le contenu de la libraire
/d Efface un objet de la librairie
/r Remplace un objet existant dans la librairie
/x Extrait un membre de la librairie
Si l'on souhaite utiliser notre bibliothèque comme une bibliothèque déjà installée (avec
M1 SIS 31 2011/2012
Travaux Pratiques de Microcontrôleur – PIC 18F4520
Écrire les fonctions « char eeprom_lire(char ad) » et «void eeprom_ecrire(char data, char ad) » qui permettent
respectivement de lire et d'écrire à l'adresse « ad » de l'EEPROM. L'adresse mémoire varie entre 0x00 et 0xFF.
Dans la fonction d'écriture l'interdiction des interruptions est nécessaire seulement si celle-ci ont été activée et on ne
doit pas quitter cette procédure tant que l'enregistrement dans la mémoire n'est pas terminé. Vous pouvez tester les
fonctions d'écriture et de lecture dans l'EEPROM avec le simulateur de MPLAB à condition de désactiver l'attente de
fin d'écriture... Aller dans le menu View > EEPROM en double cliquant sur un espace mémoire vous pouvez le
modifier.
Pour notre panneau d'affichage, nous allons venir lire la chaine (ligne 1) ou une partie de la chaine (ligne 2) dans
l'EEPROM. Pour cela vous allez écrie la fonction « void eeprom_lire_chaine( char *ch, char len, char ad) ». Cette
fonction copie dans la chaine « ch » le contenu de l'EEPROM à partir de l'adresse « ad » jusqu'à ce que le caractère '\0'
soit rencontrer ou que la chaine « ch » soit de longeur « len »
Quel sont les plages d'adresse en EEPROM de l'état de l'afficheur, le titre et le corps du message ?
Écrire la fonction eeprom_lire_chaine. Simuler cette fonction avec MPLABSIM.
Vous pouvez programmer l'EEPROM interne du µC via MPLAB afin d'initialiser le texte à afficher. Vous
pouvez initialiser vous même le texte à afficher dans l'EEPROM en respectant les plages mémoires, les valeurs et le
caractères '\0' ou alors importer directement le fichier « tp6_eeprom.mch » qui vous est fourni. Lors de la
programmation du µC, l'EEPROM le sera également.
Tester ce programme sur la carte, penser à essayer le cas où le panneau est actif et celui où il est hors service.
M1 SIS 32 2011/2012
Travaux Pratiques de Microcontrôleur – PIC 18F4520
Compléter le progammme précédent pour intégrer l'interface d'administration. Commentez bien ce programme
afin d'expliquer ce que vous faîtes et pourquoi.
Penser à gérer la taille maximale des chaines et le carctère '\0' en cas de dépassement de la taille maximale en informé
la secrétaire (hyperterminal).
Valeur dans
RCREG ?
RCREG='d' RCREG='e' RCREG='s' RCREG='u'
Récupérer le nouveau
corps du message
L'application réalisée ici est très proche d'un cas d'utilisation réelle si ce n'est que l'afficheur aurait peut être plus
de lignes. La différence majeure serait dans l'interace d'administration elle ne serait pas réalisée avec hyperterminal,
mais avec un programme spécial en C, C++, etc ... qui serait écrit avec des boîtes de dialogues beaucoup plus conviales
pour la secrétaire.
M1 SIS 33 2011/2012
Travaux Pratiques de Microcontrôleur – PIC 18F4520
Écrire un premier programme qui initialise les entrées sorties utilisées, le timer 0, autorise les interruptions puis à
l'infini éxécute :
moteur pompe arrêté
débimètre arrêté
tant que Poignée Accrochée faire
fin faire
moteur pompe activé
débimètre activé
tant que Poignée Décrochée faire
fin faire
Pour tester ce programme lors d'une interruption, inverser l'état de RC2 afin d'envoyer un signal d'environ 50 Hz sur le
transducteur piézo-électrique.
Nous allons maintenant intégré au programme les calculs de volume et de prix. Le volume est compté en
centilitres de 0 à 9999 cl. Il peut donc être stocker dans une variable de type entier (16 bits). Le prix du litre est fixé à
1,08€, un centilitre vaut donc 1,08 centime d'euro. Le prix maximun peut atteindre 108,00 €. Le prix sera donc un
nombre de centièmes de centimes variant entre 0 et 1079892, il doit être codé sur entier long (32 bits).
Chaque interruption du timer 0 correspond à un centrilitre versé. Le sous programme d'interruption incrémentre
le volume (+1cl) et le prix en centième de centime (+108c). On aurait également pu calculé le prix en multipliant le
volume par le prix au litre mais cela aurait nécessité des multiplications, plus longues à effectuer que les additions.
Modifier votre programme pour intégrer ces calculs, puis assurez-vous en simulation que le volume et le prix
évoluent correctement.
L'afficheur LCD va nous permettre (via la librairie écrite au TP n°6) d'afficher le prix et le volume lorsque la
distribution est en cours. Le volume est un entier compris entre 0 et 9999 et nous voulons l'afficher à l'écran sous la
forme décimale :
<m><c>,<d><u> l
où < m >, ..., < u > représentent respectivement le chiffre des milliers, centaintes, dizaines et unités.
Si on effectue la division euclidienne de la variable volume par 1000, < m > est le quotient et le
reste représente centaines, dizaines, unités ...
Ajouter ces calculs au programme précédent, et le simuler. Vérifier l'exactitude des différents chiffres à afficher.
Puis en utilisant les points d'arrêt, mesurer la durée d'éxécution du code de calcul des chiffres à afficher.
Pour accélérer les calculs, nous allons utiliser l'algorithme suivant, donné ici pour le chiffre <m>. Les calculs
étant effectué dans la variable vol afin de ne pas modifier la variable volume.
m = 0
vol = volume
tant que vol >= 1000 faire
m = m + 1
vol = vol – 1000
fin faire
M1 SIS 34 2011/2012
Travaux Pratiques de Microcontrôleur – PIC 18F4520
Après avoir bien compris cet algorithme, remplacer toutes les divisions de votre programme par ces boucles
(fonction : deux valeurs sont à retourner effectuer un passage par adresse pour l'une des deux ...). Simuler le
fonctionnement et mesurer la durée d'éxécution. Attention ! La durée dépend du chiffre à déterminer. Faites des
essais avec le volume à 1 puis avec les valeurs qui donneront la plus grande durée. Avons nous gagné beaucoup de
temps ?
On calcule le prix à afficher de la même façon que le volume. Quel est le premier chiffre à afficher ? Écrire le
code corresspondant au calcul des yyy,yy €.
Lorsque que le client raccroche la poignée, la pompe est bloquée tant que celui-ci n'a pas payé. La validation du
paiement étant reçue de l'automate de caisse. Pour l'instant un appui sur RA4 validera la paiement et permettra au client
suivant de se servir en carburant. Intégrer également la contrainte que le volume ne doit pas dépasser pas 9999cl, sinon
la pompe s'arrête et attends le paiement.
SDA
SCL
Le module qui demande le transfert de données et qui génère l’horloge est le maître, le module qui répond est un
esclave. Un même système peut disposer de plusieurs maîtres, on le nomme alors multimaître. Dans ce cas, il faut
arbitrer la discussion entre les différents modules. Nous ne verrons ici seulement le cas d'un seul maître avec plusieurs
esclaves. Le bus I²C travaille à une vitesse de 100 kbits/s en mode standard et 400 kbits/s en mode rapide. Les lignes
SDA et SCL sont bidirectionnelles. Au repos, elles sont au niveau haut.
Le format d'une trame standard est reproduit dans le tableau 4. Un transfert type I²C est reproduit en figure 25.
M1 SIS 35 2011/2012
Travaux Pratiques de Microcontrôleur – PIC 18F4520
mettre plusieurs fois le même esclave sur le bus (au maximum 8).
– RW (Read Write) : est le bit de mode de transmission. S’il est à 0, on est en mode écriture, c’est le maître
qui envoie des données à l’esclave. S’il est à 1, on est en mode lecture, c’est l’esclave qui envoie des
données au maître. L’Adresse et R/W sont transmis ensemble ce qui forme un mot de 8 bits.
– A : bit d’acquittement, il a lieu à la fin de chaque transmission d’un mot pour dire que le récepteur a bien
reçu les données. Après, l’envoi du mot de 8 bits, au coup d’horloge, le récepteur force SDA à l’état bas.
– Donnée : sont les huit bits de données que l’on transmet.
– P : bit de stop, est la condition de stop. SDA passe de l’état bas à l’état haut pendant que SCL est au niveau
haut (cf. figure 24).
Le maître émet l'adresse de l'esclave, RW et l'émetteur émet les données, le maître gère
gère l'horloge. l'horloge.
Figure 25: Transfert de données sur le bus I²C
M1 SIS 36 2011/2012
Travaux Pratiques de Microcontrôleur – PIC 18F4520
Pour stopper une transmission, en mode lecture le maître n’acquitte pas le dernier mot transmis et génère un bit
de stop. En mode écriture, si l’esclave n’acquitte pas le dernier mot, le maître génère le bit de stop. Les données ne sont
valides que sur un niveau haut de SCL. Une extension de l'I²C permet d'avoir plus de périphériques en codant l'adresse
sur 10 bits, nous ne verrons pas ce cas dans ce tp.
Sur un bus I²C, le pic peut être soit maître soit esclave. Dans notre application qui jouent les rôles de maître et
d'esclave ? Justifier votre réponse.
10.2.2. Échange entre les automates de caisse et de pompes
Les tableaux suivants représentent les échanges entre les automates :
Message
Message
Les chronogrammes page 192 et 193 de la datasheet pourraient vous être utile.
Quelles modifications faut-il apporter aux fonctions que vous venez d'écrire pour qu'elles soient utilisables dans
le cas de la station service ?
M1 SIS 37 2011/2012
Travaux Pratiques de Microcontrôleur – PIC 18F4520
C'est l'automate de caisse qui va venir demander à l'automate de pompe la somme à encaisser. Lorsque
A6 A5 A0 RW D7 D6 D5...0
Bit de Bit de
Acquittement de Acquittement du récpeteur si ce n'est
Start l'esclave pas la fin du transfert Stop
l'automate de caisse veut faire une demande, il envoi sur le bus l'adresse de la pompe intérrogée (mode lecture). Si
l'automate de pompe reconnaît son adresse et le flag SSPIF se lève. Si les interruptions ont été autorisée le programme
passe alors à la routine associée.
L'automate de pompe fonctionnant en mode esclave il est donc nécessaire d'utiliser les interruptions car sinon, le
programme va passer son temps à surveiller le bus et ne pourra pas effectuer la distribution de carburant. D'autant plus
que la demande de l'automate de caisse peut intervenir n'importe quand. (Nous utiliserons les messages reproduits en
tableau 5.)
M1 SIS 38 2011/2012
Travaux Pratiques de Microcontrôleur – PIC 18F4520
Compléter la fonction d'initialisation (ci-après) du module MSSP pour l'utilisation en mode I²C dans le cas d'un
automate de pompe. Expliquer vos initialisations.
void i2c_slave_init(void)
{
TRISCbits.TRISC3 = ...
TRISCbits.TRISC4 = ...
SSPCON1 = ... //CKP=1 ...
SSPCON2=0;
SSPSTAT=0;
SSPSTATbits.SMP = ...
SSPADD = ...
IPR1bits.SSPIP = 1
... = ...
... = ...
}
En utilisant la datasheet du pic, quels sont les bits à initialiser pour autoriser l'interruption du module I²C ?
Rajouter ces initialisations à la fonction « void i2c_slave_init( void ) ».
En regardant la datasheet on s'aperçoit quand mode esclave, il y'a 3 bits qui permettent de connâitre l'état de la
communication I²C. Tout le reste étant gérer par le module MSSP et donc transparent pour nous. Ceux sont les bits
R_W, D_A et BF du registre SSPSTAT.
Quelles sont les informations que nous donnent chacun de ces bits ?
L'étude des chronogrammes page 176 et 177 de la datasheet montrent les différentes configurations possibles de
ces bits lors d'une interruption du module I²C :
Compléter le tableau 8. En fonction de la configuration de « D_A, R_W, BF », expliquer ce que veut le mettre
et ce que doit faire l'esclave.
Lors d'une requête de lecture, le module I²C esclave du PIC force SCL à 0 pour empêcher que le maître
reprenne le contrôle du bus avant qu'il est pu préparer la donnée à transmettre. Une fois que la donnée à transmettre est
prêtre il faut repositionner le bit CKP du registre SSPCON1 à 1 afin de relâcher l'horloge. On parle de clock stretch.
Erratum Microchip Mode I²C : Dans la datasheet du PIC18F4520, il est dit que dans le cas d'une lecture du maître, la
réception de l'octet d'adresse ne positionne pas le bit BF, or ce n'est pas le cas ! Tenez compte de cette erreur dans
l'écriture de votre routine d'interruption I²C.
Intégrer les fonctions I²C au programme de l'automate de pompe et tester son fonctionnement. Le programme de
l'automate de caisse vous est fournit. Lisez la partie suivante avant de tester votre programme sur la carte.
10.2.5. Connexion I²C entre deux cartes PICDEM 2 Plus
Comme on peut le voir sur la figure 26, la partie physique d'un bus I²C est réalisée par trois lignes électriques : la
masse (GND), les données (SDA) et l'horloge (SCL). Comme les composants connectés sont de types collecteur ouvert
M1 SIS 39 2011/2012
Travaux Pratiques de Microcontrôleur – PIC 18F4520
ou drain ouvert, les lignes SDA et SCL doivent être maintenues à l'état haut par une résistance. Ces résistances sont
dites de « pull-up » et sont caculées en fonction du nombre de composants, de la longueurs du bus ... (cf. documentation
I²C de Phillips).
Dans le cas des cartes PICDEM 2 Plus, chacune d'entre elle a déjà ses résistances puisqu'elles disposent d'un
capteur de température et d'une EEPROM I²C. Donc si on connecte directement deux cartes ensemble, on se retrouve
avec les deux résistances en parallèle sur chaque ligne (le courant est donc multiplié par 2) et on a deux fois le même
composant sur le bus (cela ne serait pas grave si les composants n'avait pas la même adresse, hors les deux cartes sont
identiques). Pour vos tests, vous devez donc utiliser le microcontrôleur pour lequel le support a été modifié : les broches
RC3, RC4 et GND ont été remplaçées par des fils connectés à une autre carte PICDEM 2 Plus.
24L256
24L256
TC74
TC74
GND GND
SDA SDA
GND GND
SCL SCL
R R R R
+5 V +5 V
Figure 27: Connexion en I²C de deux cartes PICDEM 2 Plus
Dans le programme de caisse, si vous taper le caractère 't' dans hyperterminal, la temperature sera affichée en utilisant
le capteur TC74 connecté au bus à l'adresse 0x4D.
Rédiger un petit bilan sur l'ensemble des travaux pratiques : Qu'est ce qui vous a plu, déplu, ennuyé ? Qu'avez
vous appris, retenu ? Y'a t'il des choses à améliorer pour les futurs étudiants ? ...
M1 SIS 40 2011/2012
Travaux Pratiques de Microcontrôleur – PIC 18F4520
Notes :
M1 SIS 41 2011/2012
Travaux Pratiques de Microcontrôleur