Académique Documents
Professionnel Documents
Culture Documents
(EasyPIC5 - MikroC)
7 juin 2010
F. Morain-Nicolier
http ://pixel-shaker.fr
://pixel-shaker.fr
Ce docu
do cume
ment
nt a ´
eté
ét´e réa
r´
ealilis´
sé
e avec
ave c LATEX, en utilisant
utilisa nt l’éditeur
l’´
editeur Emacs et le mode auctex, le tout
to ut ´
etant
ét ant exécu
ex´ecut´
té
e sur
su r le syst`
sy stème
eme
d’exploitation GNU/Linux.
Tabl
able des mati
mati`ere
ères
1 Prise en main 2
1.1 Pr´ea
éambule . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2 Observation de la maquette . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.3 Cr´ea
éation d’un premier projeojet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.4 Exécution
Ex´ecution pas-à
pas-`
a--pas, d´eb
éboguage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
3 Ports en entr´ ee
ée/sortie 6
3.1 S´el
élection des E/S . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
3.2 Scrutation de niveau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
3.3 Attente de fronts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
3.3.1 Changement d’´et état d’une diode
ode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
3.3.2 Compteur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
3.4 En attendant la fin du TP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
5 Afficheur
Afficheur GLCD - capteur capteur de températu
temp´ eraturere DS1820
DS1820 - liaison
liaison one-wire 11
5.1 Affichage sur le GLCD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
5.2 Commu
Communic nicati
ation
on one-wire avec le capteur DS1820 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
5.2.1 Mise en place . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
5.2.2 Communication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
5.2.3 D´ecécoda
odage de la tem
temp´er
ératur
ture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
5.3 Suppl´em
ément . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
6 Timer et intinterr
errupt
uptionion - me mesusurre de tem
emps
ps et prod
producucttion
ion de sig
signaux
naux p´ erio
é riodi
diqu
ques
es 15
´
6.1 El
Él´em
éments de docu
ocumentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
6.2 Test de fonctionnement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
6.3
6.3 Me
Mesu sure
re de dur
dur´ee
é e d’´
d’ex´
é xecut
é cutio
ionn d’u
d’un
n mor
morce
ceau
au de code
code . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
6.4 Produoductio
tion d’un signal p´er ériodi
odique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
7 Inte
Interf
rfa¸
aç
caage d’un ´
ec
écran tactile 18
1
TP 1
Prise en main
Objectifs Identifier les éléments de la maquette, créer un projet, le compiler et l’exécuter sur la maquette, observer
les fichiers créés, tracer le programme et des variables.
1.1 Préambule
– une documentation est disponible dans C:\doc_mikroc for PIC\ ;
– sur le site du constructeur (http://www.mikroe.com/ ), vous pourrez consulter divers éléments de documen-
tation et télécharger une version d’essai de l’environnement (IDE et compilateur).
Vous devez vous connecter en usant le login ge1 (sans mot de passe).
2
Manipulation Identifier les éléments suivant sur cette reproduction (donner les numéros) :
– Switch d’alimentation,
– programmateur USB ( mikroICD),
– micro-contrôleur PIC,
– bouton de reset ,
– diodes de contrôle des ports A à E,
– boutons poussoir de test de ports A à E,
– afficheurs 7 segments multiplexés,
Manipulation
– Aller dans le dossier de votre projet.
– Ouvrir les fichiers .hex, .mcl, asm, .lst. Que contiennent ces fichiers, quelle est leur utilité ?
– Par quelles instructions assembleur sont traduites les lignes suivantes ?
– PORTC = 0;
– et TRISC = 0;
3
Manipulation Exploiter le débogueur pour :
– Suivre en pas-à-pas l’exécution du programme (Step Into par exemple). Vérifier l’allumage correct des
diodes du port C.
– Ajouter le suivi des variables PORTC et k lorsque vous êtes en mode pas-à-pas. Contrôler la bonne évolution
des valeurs de ces variables.
– Expérimenter les autres possibilités du débogueur.
4
TP 2
2.1 Rappels
On rappelle qu’en C le «ou booléen» se fait par ||, le «et booléen» par &&. Nous aurons besoin du «ou bit à bit»
| et du «et bit à bit» &. Soit le contenu d’un registre B sur huit bits,
b7 b6 b5 b4 b3 b2 b1 b0
.
1 1 1 0 0 0 1 1
Préparation
1. Vous désirez mettre à 1 le bit b2 sans changer les autres bits, comment faites-vous ?
2. Vous désirez mettre à 0 le bit b6 sans changer les autres bits comment faites-vous ?
2.2 Exemple
On vous donne un programme C qui fait clignoter une led (poids faible mais à gauche) sur le port C.
§ ¤
void main( void ){
T RI SC = 0 ; / / T ou s l es b it s d u P OR TC e n s or ti e .
P OR TC = 0 ;
while ( 1) {
P O RT C = 0 x 01 ;
Delay_ms(1000);
P O RT C = 0 x 00 ;
Delay_ms(1000);
}
}
¦ ¥
Manipulation Écrire ce programme pour l’essayer, le compiler, le charger et l’exécuter. Modifier-le pour faire
clignoter la led RC1.
2.3 Exercices
1. Écrire un chenillard simple : une led se déplaçant sur le PORTC (de haut en bas) et en utilisant le même
type de temporisation que dans le programme exemple.
2. Écrire un chenillard double : un chenillard de haut en bas et simultanément un autre de bas en haut qui se
croisent.
3. Écrire un chenillard à entassement (1 led se déplaçant et s’accumulant en bas).
Note : les opérateurs de décalage sont >> et << pour respectivement le décalage à droite et le décalage à gauche.
5
TP 3
Ports en entrée/sortie
Les ports A, B, C, D et E sont des ports d’entrée/sortie dont chaque bit peut-être utilisé soit en entrée, soit en
sortie, de façon indépendante. Ainsi chaque port possède un satellite : TRISA, TRISB, TRISC, TRISD et TRISE
qui permet de déterminer le sens de chaque bit (0 : O utput , 1 : I nput ).
par exemple :
§ ¤
void m ai n ( void ){
A NS EL = A NS EL H = 0 ; / / T o ut e s l e p o rt s E / S s on t c o nf i gu r és c o mm e n u mé r iq u es
P OR TA = 0 ; / / R A Z d es b ro ch es d u p or t A
TRISA = 0b00000100; / / T o ut e s l e s b r oc h es d u p o rt A s a uf P O RT A .2 s on t d es s o rt i es
}
¦ ¥
6
3.2 Scrutation de niveau
Écrire un programme qui comporte les éléments suivants.
1. Un compteur binaire sur le port B (256 états). Placer une temporisation de 100ms entre chaque état.
2. Un appui sur PORTA.2 doit remettre à zéro le compteur.
3. Les accès individuels aux bits seront effectués à l’aide de masques.
Modifier ensuite le programme pour que le comptage n’ai lieu que lorsque PORTA.1 est à zéro.
3.3.2 Compteur
Reprendre le compteur précédent (cf scrutation par niveau 3.2) avec les changements suivants (un changement
à la fois).
1. Un front descendant sur PORTA.2 provoquera la RAZ du compteur.
2. Puis, seul un front montant sur PORTA.1 incrémentera le compteur.
Que pensez-vous de la gestion de plusieurs attentes de front ?
3.4 En attendant la fin du TP
Soit le programme suivant :
§ ¤
void m ai n ( void ){
A NS EL = A NS EL H = 0 ; / / T o ut e s l e p o rt s E / S s on t c o nf i gu r és c o mm e n u mé r iq u es
P O RT A = 0 x 55 ;
}
¦ ¥
7
TP 4
4.1 Matériel
8
§ ¤
// Fichier principl
#include "Display_utils.h"
void m ai n ( ) {
unsigned short i;
I NT CO N = 0 ; / / D i sa b le G IE , P EI E , I NT E , R BI E , T O IE
T RI SA = 0 ;
P OR TA = 0 ;
T RI SD = 0 ;
P OR TD = 0 ;
while ( 1) {
fo r ( i = 0; i <= 9 u; i ++ ){
P OR TA = 0 ; / / T ur n o f f a l l 7 s eg d i sp l ay s
P O RT D = m as k ( i) ; / / b r in g a p pr o pr i at e v al u e t o P O RT D
P OR TA = 1 ; / / t ur n o n a p pr o pr i at e 7 s eg . d i sp l ay
Delay_ms(1000);
}
}
}
¦ ¥
§ ¤
// Fichier Display_utils.h
− activer DIS1
− a f fi c he r l e c h if f re d e p o id s f o rt
− tempo
¦ ¥
1. Écrire et tester un programme qui affiche un compteur de 00 à 99 sur les deux afficheurs - en s’appuyant sur
l’algorithme donné.
2. Modifier les valeurs des temporisation - la méthode est-elle robuste ? simple ?
9
§ ¤
/ ∗
∗ Project name:
D i sp l ay 7 Se g _0 2 ( U s ag e o f 2 7 S eg . d i sp l ay s )
∗ Copyright:
(c) MikroElektronika, 2005 −2008.
∗ Description:
This code demonstrates displaying numbers (0,1,2..99) on two 7 −segment
d i sp l ay s . E ac h d i gi t i s o n f or 1 s e co n d .
∗ Test configuration:
MCU: PIC16F877A
Dev. Board: EasyPIC5
O sc ill at or : HS , 0 8.0 00 0 MHz
Ext. Modules: −
#include "Display_utils.h"
void interrupt() {
if (digit_no==0) {
P OR TA = 0 ; / / T u rn o ff a ll 7 s eg d i sp l ay s
P O RT D = d i gi t 1 ; / / s en d m a sk f or o ne s d i gi t t o P OR TD
P OR TA = 1 ; / / t ur n o n 1 st 7 s eg ., t ur n o ff 2 nd
d i gi t _n o = 1 ;
} else {
P OR TA = 0 ; / / T u rn o ff a ll 7 s eg d i sp l ay s
P O RT D = d i gi t 10 ; / / s en d m a sk f or t en s d i gi t t o P OR TD
P OR TA = 2 ; / / t ur n o n 2 nd 7 s eg ., t ur n o ff 1 st
d i gi t _n o = 0 ;
}
T MR 0 = 0 ; // c le ar T MR O
I N TC O N = 0 x 20 ; // c le ar T MR 0I F a n d s et T MR 0I E
}
void m ai n ( ) {
O PT IO N_ RE G = 0 x 80 ; // Timer0 settings
TMR0 = 0;
INTCON = 0xA0; // Disable PEIE,INTE,RBIE,T0IE
PORTA = 0; / / c l ea r P O RT A ( m ak e s ur e b ot h d i sp l ay s a re o ff )
TRISA = 0; / / d e si g na t e P O RT A p i ns a s o u tp u t
PORTD = 0; / / c l e a r P O R TD ( m ak e s ur e L ED s a re o ff )
TRISD = 0; / / d e si g na t e P O RT D p i ns a s o u tp u t
do {
fo r ( i = 0; i <= 99 ; i + +) { / / c o un t f ro m 0 t o 9 9
digit = i % 10u;
d i gi t 1 = m as k ( di gi t ) ; / / p r ep a re o ne s d i gi t
digit = ( char ) (i / 10 u) % 1 0u ;
digit10 = mask(digit); / / p r ep a re t en s d i gi t
Delay_ms(1000);
}
} while (1); / / e n dl e ss l oo p
}
¦ ¥
1. Tester le programme.
2. Le comparer avec la version précédente - en particulier, comment est réalisé le basculement ?
3. Expliquer le fonctionnement de ce programme - en donnant son algorithme par exemple.
10
TP 5
1. Écrire ”Hello world!” en noir sur fond blanc. Pour cela consulter la documentation des fonctions Glcd_Fill et
Glcd_Write dans l’aide intégrée (QHelp ).
11
où chaine est une chaine de caractères (i.e. un tableau de char) qui sera modifiée. format est une chaine de
caractères contenant des caractères ordinaires et des spécifications de format du type %0[taille][type], [taille]
étant le nombre de chiffres utilisés pour l’affichage et [type] étant d pour des entiers signés et u pour des entiers
non-signés. La fonction sprinti ne fonctionne qu’avec des int.
Compléter le programme suivant pour afficher ”t = 20,5”
§ ¤
_____ text[10];
void main(){
unsigned int v al = 2 0;
unsigned int d ec = 5;
my_glcd_init();
s p ri n ti ( t ex t , _ _ __ , v al , d ec ) ;
Glcd_Write_Text(text, 0, 0, 1);
}
¦ ¥
Le capteur de température DS1820 s’appuie sur le protocole one-wire pour communiquer sa mesure. Comme
son nom l’indique, un seul fil est nécessaire (même si plusieurs périphériques sont utilisés).
12
5.2.2 Communication
La librairie est composée de trois fonctions : Ow_reset(), 0w_Write() et Ow_Read. Pour lire et afficher une température,
il faut suivre les étapes suivantes :
a) Envoi de la commande CONVERT_T au capteur (mesure de la température)
b) Envoi de la commande READ_SCRATCHPAD au capteur (placement de la température dans le buffer du capteur)
c) Lecture du buffer
d) Affichage.
Compléter le programme suivant (en vous aidant de la documentation) :
§ ¤
void main(){
unsigned int temp;
my_glcd_init();
while ( 1) {
/ / S t ep a )
Ow_Reset(____, ____);
Ow_Write(____, ____, 0xCC); / / o n s ’ a dr e ss e à t ou s l es p é ri p hé r iq u es o ne −wire
Ow_Write(____, ____, 0x44); / / E n vo i d e l a c o mm a nd e C O NV E RT _ T
Delay_us(120); // attente mesure
/ / S t ep b )
Ow_Reset(____, ____);
Ow_Write(____, ____, 0xCC); / / o n s ’ a dr e ss e à t ou s l es p é ri p hé r iq u es o ne −wire
Ow_Write(____, ____, 0xBE); / / E n vo i d e l a c o mm a nd e R E AD _ SC R AT C HP A D
/ / S t ep c )
temp = Ow_Read(____, ____);
/ / S t ep d )
/ / a é cr ir e
delay_ms(100);
}
}
¦ ¥
Quel affichage obtenez-vous?
13
5.2.3 Décodage de la température
La mesure envoyée par le capteur est codée comme indiqué par l’extrait de la datasheet du DS1820 :
5.3 Supplément
Au choix :
1. Utiliser les fonctions de la librairie du GLCD pour réaliser un affichage graphique de la température en
fonction du temps.
2. Lire en détail la documentation du DS1820 pour réaliser une lecture de température avec une résolution
supérieure à 9bits (voir p. 3 de la datasheet et le projet OneWire dans les examples ).
14
TP 6
15
6.2 Test de fonctionnement
Saisir et tester le programme suivant :
§ ¤
unsigned int cnt;
void interrupt() {
cnt++; / / I n cr e me n t v a lu e o f c nt o n e v er y i n te r ru p t
T MR 0 = 9 6;
I N TC O N = 0 x 20 ; / / S e t T 0 IE , c l ea r T 0I F
}
void m ai n ( ) {
OPTION_REG = 0x84; / / A s si g n p r es c al e r t o T MR 0
A NS EL = 0 ; / / C o nf i gu r e A N p i ns a s d i gi t al I / O
A NS EL H = 0 ;
T RI SB = 0 ; // P O RT B i s o u tp u t
P O RT B = 0 x FF ; // Initialize PORTB
T MR0 = 96; // T i me r 0 i n it i al v a lu e
I N TC O N = 0 x A0 ; // Enable TMRO interrupt
c nt = 0 ; // Initialize cnt
while ( 1) {
if ( cn t = = 4 0 0) {
P O RT B = ~ P O RT B ; / / T o gg l e P O RT B L E Ds
c nt = 0; / / R e se t c nt
}
}
}
¦ ¥
1. Que se passe-t-il ?
16
2. Expliciter la configuration des registres OPTION_REG et INTCON.
3. A quels endroits est-il possible de modifier le code pour allonger la période de clignotement ?
4. Modifier les bits du prescaler selon la table fournie pour allonger la période de clignotement.
1. Écrire un programme utilisant cette fonction pour afficher le résultat (sur le GLCD) de la division par 10 du
nombre 171.
2. On souhaite maintenant connaitre la durée d’éxécution de cette fonction en utilisant le timer TMR0. Écrire un
programme qui mesure cette durée, avec l’algorithme suivant :
(a) Initialisation du timer
(b) Appel de la fonction
(c) Lecture du timer
(d) Calcul de la durée (en fonction de la fréquence d’horloge et du prescaler .
(e) Affichage de la durée mesurée.
17
TP 7
L’objectif est d’interfacer l’écran tactile pour commander l’allumage et l’extinction d’une LED. Voici le schéma
détaillant la connection de l’écran au microcontrôleur :
18
5. Ajouter le code suivant en début de la fonction main :
§ ¤
Glcd_Fill(0); / / C l ea r G LC D
Glcd_Write_Text("TOUCHPANEL EXAMPLE",10,0,1);
//Display Buttons on GLCD:
Glcd_Rectangle(8,16,60,48,1);
Glcd_Rectangle(68,16,120,48,1);
Glcd_Box(10,18,58,46,1);
Glcd_Box(70,18,118,46,1);
Glcd_Write_Text("BUTTON1",14,3,0);
Glcd_Write_Text("RC6 OFF",14,4,0);
Glcd_Write_Text("BUTTON2",74,3,0);
Glcd_Write_Text("RC7 OFF",74,4,0);
¦ ¥
Vérifier que deux “boutons” sont dessinés. Ajouter alors le code nécessaire dans la boucle infinie pour qu’une
pression sur le “bouton 1” provoque l’extinction de la LED n˚6 du PORTC, et qu’un appui sur le “bouton 2”
commande sont allumage.
6. Télécharger et tester le programme du fichier touchscreen2.c
19