Beruflich Dokumente
Kultur Dokumente
TP 3 Microcontrleur
Afficheur 7 segments
et interruption (TIMER0)
Licence SPI-2
Anne 2014
1
1. Objectifs
Manipuler les 4 afficheurs 7 segments de la platine EasyPic7. Dans un premier temps,
vous mettrez en uvre un seul afficheur afin de maitriser uniquement la gestion des
segments et l'utilisation d'un fichier de dfinition (.h1). Ensuite, vous devrez multiplexer
deux afficheurs selon 2 approches diffrentes, sans et avec gestion d'interruption.
Ce tableau reprsente une opration de masquage qui sera mise en uvre dans un
fichier de dfinition (.h). Autrement dit, chaque symbole (0, 1, 2 etc.) est remplac par
un mot binaire. Par exemple, le symbole 8 (0000 1000 b) est remplac par le mot binaire
0111 1111b. Mais on pourrait sy prendre autrement et utiliser un tableau de 10 cases
pour mmoriser les valeurs hexadcimales.
Vous pouvez facilement contrler les valeurs hexadcimales obtenues grce lun des
utilitaires de mikroC. Pour lafficher : Tools > Seven Segment Editor.
1
h pour header file ou fichier d'en tte en franais
2
Le schma des connections des afficheurs est rappel ci-dessous :
Questions :
1. Quel port permet de slectionner l'afficheur actif?
b. L'afficheur DIS1?.................................................
c. L'afficheur DIS2?................................................
d. L'afficheur DIS3?................................................
3
3. Exercice 1 : Gestion de l'afficheur DIS0 seul
Votre projet sera ici constitu de 2 fichiers, un fichier principal (.c) et un fichier de
dfinition oprant le masquage (.h). Afin que le compilateur puisse lier le fichier .h au
fichier .c, la directive #include sera utilise.
1. Grce au tableau que vous avez rempli en page 2, complter le fichier suivant
(fonction mask):
// Fichier Display_utils.h
unsigned short mask(unsigned short num) {
switch (num) {
case 0 : return 0x3F;
case 1 : return.....;
case 2 : return ...;
case 3 : return ...;
case 4 : return ...;
case 5 : return ...;
case 6 : return ...;
case 7 : return ...;
case 8 : return ...;
case 9 : return ...;
}
}
Remarques :
- Utilisation du format unsigned short, sur 8 bits (de 0 255), ce qui est
largement suffisant ici
- il est galement possible de n'indiquer que le prototype de la fonction
dans le fichier .h (cd. seulement la ligne " unsigned short mask(unsigned
short num); ") et de coder la fonction dans un autre fichier .c.
2. Remplacer les lettres x et y par les bons ports dans fichier principal suivant :
// Fichier principal (DIS0.c)
#include "Display_utils.h"
void main () {
unsigned short i;
RCON. IPEN = 0; // Disable priority levels on interrupts
INTCON.GIE = 0; // Disable all interrupts
TRISx = 0; // Configure Portx as output
LATx = 0; // Turn off all 7seg displays
TRISy = 0; // Configure Porty as output
LATy = 0; // Clear port y
while (1) {
for (i = 0; i <= 9u; i++){
4
LATx = 0; // Turn off all 7seg displays
LATy = mask(i); // bring appropriate value to PORTy
LATx = 1; // turn on appropriate 7seg. display
Delay_ms (1000);
}
}
}
Remarque : dans la boucle for, la lettre u accole au chiffre 9 signifie unsigned
Avant daller plus loin, analyser le code. Selon vous, que va faire lafficheur DIS0?
Modifier le programme afin dutiliser lafficheur DIS1, puis DIS2 et finalement DIS3.
Vous allez maintenant mettre en uvre 2 afficheurs (DIS0 et DIS1) afin dafficher une
valeur qui sincrmentera de 00 99. Etant donn quil nest pas possible de valider
simultanment plusieurs afficheurs (en raison du cblage de la carte EasyPic7), il vous
faudra basculer de lun lautre (multiplexage). Si le multiplexage fonctionne bien, le
basculement ne doit pas tre visible. Dans cet exercice, il sera indispensable de
basculer entre les 2 afficheurs en passant par lalgorithme suivant :
5
4. Crer un nouveau projet (TP3/DIS01), frquence 32 MHz
5. Dans la seconde fentre du New Project Wizard, ajouter le fichier
Display_utils.h
6. Ne pas oublier dans Project > Edit Project de valider la PLL
7. En sappuyant sur lalgorithme donn, crire et tester un programme qui affiche
un compteur de 00 99 sur les deux afficheurs. Vous utiliserez les oprateurs
/ (division) et % (modulo reste de la division) :
a. Pour extraire le chiffre des dizaines dun nombre number :
digit = (number / 10u) % 10u.
b. Pour extraire le chiffre des units : digit = number % 10u;
8. Modifier la valeur des temporisations (100 ms)
9. Que constatez-vous ? Donnez une explication.
10. Mme si la valeur de la temporisation est faible (10 ms ou moins), cette manire
de programmer est-elle viable ?
Vous allez maintenant utiliser une autre mthode pour raliser le multiplexage. Il sagit
ici dutiliser linterruption gnr par le Timer0. Le programme suivant (DIS0123.c), que
vous pourrez tlcharger ladresse http://pages.univ-nc.nc/~quiniou, permet dafficher
un compteur sur les 4 afficheurs 7 segments de la carte Easypic7.
#include "Display_utils.h"
void interrupt() {
LATA = 0; // Turn off all 7seg displays
LATD = portd_array[portd_index]; // bring appropriate value to PORTD
LATA = shifter; // turn on appropriate 7seg. display
// increment portd_index
portd_index++ ;
if (portd_index > 3u)
portd_index = 0; // turn on 1st, turn off 2nd 7seg.
TMR0L = 0; // reset TIMER0 value
TMR0IF_bit = 0; // Clear TMR0IF
}
6
void main() {
ANSELA = 0; // Configure PORTA pins as digital
ANSELD = 0; // Configure PORTD pins as digital
do {
digit = number / 1000u ; // extract thousands digit
portd_array[3] = mask(digit); // and store it to PORTD array
digit = (number / 100u) % 10u; // extract hundreds digit
portd_array[2] = mask(digit); // and store it to PORTD array
digit = (number / 10u) % 10u; // extract tens digit
portd_array[1] = mask(digit); // and store it to PORTD array
digit = number % 10u; // extract ones digit
portd_array[0] = mask(digit); // and store it to PORTD array
7
I. Test du programme
Vrifier que le compteur dmarre bien 9981 et bascule 0000 aprs 9999. Vous
pouvez tout moment reseter la carte en appuyant sur le bouton reset situ en
haut droite de la carte Easypic7.
En parcourant rapidement le code, il est visible que linterruption est gnre par le
Timer0 - les bits GIE et TMR0IE sont mis 1.
8
Annexe 1 : rappel sur les Interruptions
9
10
Annexe 2 : Le Timer0 et le registre T0CON
11