Vous êtes sur la page 1sur 11

Informatique Industrielle

TP 3 Microcontrleur

Afficheur 7 segments
et interruption (TIMER0)

Thomas Quiniou et Albert Ranaivosoloarimanana

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.

2. Les afficheurs 7 segments de la carte Easypic7


Un afficheur est constitu de 7 segments identifis par les lettres de A G et du point
dcimal DP. Chaque segment est rattach l'une des broches du C. Pour les activer,
vous crirez dans le registre LATx correspondant au port x, une valeur hexadcimale
(mais on pourrait galement donner une valeur binaire ou octale) l'instar de ce que
vous aviez fait avec les LEDs au TP prcdent. En vous aidant du schma de l'afficheur,
compltez le tableau suivant :

bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0


Affichage Hexa
DP G F E D C B A
0 0 0 1 1 1 1 1 1 0x3F
1 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 0

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?

2. Quelles valeurs faut-il envoyer pour slectionner :


a. l'afficheur DIS0?.................................................

b. L'afficheur DIS1?.................................................

c. L'afficheur DIS2?................................................

d. L'afficheur DIS3?................................................

3. Quel port permet d'afficher les segments?

4. Est-il possible d'activer 2 segments en mme temps?

5. Est-il possible d'afficher 2 symboles en mme temps?

6. Quelle est l'utilit du multiplexage?

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?

3. Configurer le switch SW4 pour permettre l'activation de l'afficheur DIS0


(SW4.1 on).
4. Crer un nouveau projet (TP3/DIS0), frquence 32 MHz
5. Dans le Project > Edit Project, ne pas oublier dactiver la PLL (8 4 = 32 MHz)
6. Recopier le contenu du fichier DIS0.c et enregistrer
7. Ouvrir une page blanche : File > New > New Unit
8. Recopiez le contenu du fichier Display_utils.h
9. Sauvegarder ce fichier : File > Save As. Slectionner le type Header File (*.h)
10. Allumer la platine EasyPic7
11. Compiler et programmer (built+Program) le C
12. Vrifier le bon fonctionnement de votre code

Modifier le programme afin dutiliser lafficheur DIS1, puis DIS2 et finalement DIS3.

4. Exercice 2 : Gestion de 2 afficheurs - Multiplexage

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 :

Faire plusieurs fois ( boucle for : for (j = 1; j <= 50; j++) { )


activer DIS0
afficher le chiffre de poids faible
tempo (10 ms par exemple)
activer DIS1
afficher le chiffre de poids fort
tempo (10 ms par exemple)

1. Autoriser lutilisation des afficheurs DIS0 et DIS1 (switch SW4.1 et .2 on)


2. Crer un rpertoire TP3/DISO1/
3. Coller le fichier Display_utils.h dans ce rpertoire

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 ?

5. Exercice 3 : Gestion des 4 afficheurs - Interruption

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"

unsigned short shifter, portd_index;


unsigned int digit, number;
unsigned short portd_array[4];

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

// move shifter to next digit


shifter <<= 1;
if (shifter > 8u)
shifter = 1;

// 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

TRISA = 0; // Configure PORTA as output


LATA = 0; // Clear PORTA
TRISD = 0; // Configure PORTD as output
LATD = 0; // Clear PORTD

T0CON = 0xC4; // Set TMR0 in 8bit mode, assign prescaler to TMR0


TMR0L = 0; // clear TMROL
digit = 0;
portd_index = 0;
shifter = 1;

number = 9981; // Initial number value


GIE_bit = 1;
TMR0IE_bit = 1;

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

Delay_ms(1000); // one second delay (Temporisation Prog. Principal)

number++ ; // increment number


if (number > 9999u)
number = 0;

} while(1); // endless loop


}

1. Autoriser lutilisation des 4 afficheurs (SW4.1, SW4.2, SW4.3, SW4.4 on)


2. Crer un rpertoire TP3/DISO123/
3. Coller les fichiers DIS0123.c et Display_utils.h dans ce rpertoire
4. Crer un nouveau projet DIS0123, frquence 32 MHz
5. Dans la seconde fentre du New Project Wizard, ajouter les 2 fichiers
DIS0123.c et Display_utils.h
6. Ne pas oublier dans Project > Edit Project de valider la PLL
7. Compiler et programmer le C

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.

II. Analyse du programme

Aprs les dclarations de diffrentes variables, de type unsigned short ou int, le


programme est scind en 2 partie (void). La premire (void interrupt) concerne le code
qui sera excut lorsque linterruption sera active (dbordement du Timer0). La
seconde (void main) concerne le programme principal.

En parcourant rapidement le code, il est visible que linterruption est gnre par le
Timer0 - les bits GIE et TMR0IE sont mis 1.

II.1. Boucle do-while() du programme principal


Cette partie du programme permet dincrmenter le compteur toutes les secondes.
portd_array est un tableau de 4 lments qui contient les 4 digits du compteur. Chaque
digit est extrait grce aux oprateurs / et %.

II.1. Timer0 et interruption par dbordement


TOCON est le registre associ au Timer0 (cf. annexe2). Dans le programme, il prend la
valeur 0xC4.
1. Convertissez cette valeur en binaire et la reporter dans le tableau de lannexe2
2. Surligner les lignes valides en fonction des bits individuels
3. En particulier, dterminez la valeur du prescaleur (prdiviseur) ?
4. Sachant que la frquence dentre du prscaleur est de Fosc/4 (soit 32/4),
quelle est la priode de comptage du Timer0 ?
5. Sachant que le timer0 est configur sur 8 bits et quil est initialis 0, quelle est
la priode de gnration dune interruption ?
6. Comparer avec la temporisation du programme principal, quen dduisez-vous ?
7. Pour le reste, il sagit de slectionner chaque afficheur tour tour (grce
shifter) et dafficher le bon digit (portd_array[portd_index]).

8
Annexe 1 : rappel sur les Interruptions

9
10
Annexe 2 : Le Timer0 et le registre T0CON

Valeur du registre T0CON : 0xC4 ( convertir en binaire)

bit7 bit6 bit5 bit4 bit3 bit2 Bit1 bit0

11