Tpii 2 PIC
Tpii 2 PIC
Tpii 2 PIC
Morain-Nicolier
TP 1 Prise en main
I. Prambule
une documentation est disponible dans C:\doc_mikroc for PIC\
sur le site du constructeur(http://www.mikroe.com/), vous pourrez consulter divers lments de la
documentation et tlcharger une version de dmonstration de l'IDE et du compilateur.
Sur votre poste de travail, vous devez obligatoirement vous
connecter en utilisant comme login "ge1" et sans mot de passe.
II.Observation de la maquette
Voici une maquette comportant des numros
1. Manipulation
Identifier les lments suivants sur cette reproduction (donner les numros) :
- switch d'alimentation
- programmateur USB (mikroICD)
- micro-contrleur PIC,
- bouton de reset
-diodes de contrle des PORTs A E,
- afficheurs sept segments multiplexs
1. Manipulation
Suivre les instructions (jusqu' l'excution - run) avec les recommandations suivantes :
- nom du projet : tp1a
- Chemin du projet d:\rep_perso\tp1. Ce dossier doit tre cr en remplaant rep_perso par un nom
qui vous est propre
- Le type (device) est lire sur la puce elle-mme. En principe 16F887.
- Choisir les fusibles par dfaut.
- Le programme suivant est saisir :
1 void main () {
2 //ANSEL = ANSELH = 0; // Toutes le ports E/S sont configurs comme numriques
3 PORTC = 0;
4 TRISC = 0;
5 while (1) {
6 PORTC = ~PORTC; // toggle PORTC
7 Delay_ms(1000);
8 }
9 }
2. Manipulation
Aller dans le dossier de votre projet et examiner 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;
- TRISC = 0;
Ce programme est tellement rapide qu'il y a peu de chance que vous voyez ce qu'il fait. Pour le voir
on va utiliser un dbogueur qui permet de l'excuter pas pas.
3. Manipulation
Pour utiliser le dbogueur reportez-vous la photocopie ci-aprs.
- Modifier les options du projet pour activer le dbogueur ICD (dans project setup Window, sur la
gauche) :
** cocher mikroICD Debug sous Build type
** vrifier que mikroICD Debugger est activ sous Debugger.
- Compiler le projet (Build - CTRL+F9)
- Programmer la puce (Program -F11)
- Lancer le debogueur (Start Debugger - F9)
- Suivre en pas pas l'excution du programme (Step Info par exemple). Vrifier l'allumage correct
des diodes du PORTC.
Prenez l'habitude partir de maintenant de raliser vos programme en version runtime, c'est dire
sans dbogueur. Celui-ci ne sera utilis que si ncessaire, c'est dire pour retrouver une erreur
subtile dans un programme.
I. Rappels
On rappelle qu'en C le OU boolen se fait par ||, le ET boolen par &&. Nous aurons besoin du OU
bit bit | et du ET bit bit &. Soit le contenu d'un registre B sur 8 bits,
b7 b6 b5 b4 b3 b2 b1 b0
1 1 1 0 0 0 1 1
1. Prparation
- Vous dsirez mettre le bit b2 1 sans changer les autres bits, comment faites-vous ?
- Vous dsirez mettre le bit b6 0 sans changer les autres bits, comment faites-vous ?
II.Exemple
On vous donne un programme C qui fait clignoter une led (poids faible) sur le port C.
1 void main () {
2 ANSEL = ANSELH = 0; // Toutes le ports E/S sont configurs comme numriques
3 TRISC = 0; // tous les bits en sortie pour PORTC
4 PORTC = 0;
5 while(1) {
6 PORTC = 0x01;
7 Delay_ms(1000);
8 PORTC = 0x00;
9 Delay_ms(1000);
10 }
11 }
1. Exercice 2.1
crire ce programme, le charger et l'excuter. Modifiez-le pour faire clignoter RC1.
III.Exercices
1. Exercice 2.2
crire un chenillard simple : une led se dplaant sur le PORTC (de haut en bas) et en utilisant le
mme type de temporisation que dans le programme exemple. Utilisez l'un des opratuers >> ou <<.
2. Exercice 2.3
crire un chenillard double : un chenillard de haut en bas et simultanment de bas en haut qui se
croisent. Utilis
3. Exercice 2.4
crire un chenillard entassement. Une led se dplaant et s'accumulant vers le bas.
1. Exercice 3.1
sw6 sw9
crire un programme qui positionne en entre les quatre bits de poids
faible du PORTB et en sortie les quatre autres. Le programme doit alors
en permanence copier les 4 bits de poids faibles vers les quatre bits de
poids fort.
2. Exercice 3.2
crire un programme qui comporte les lments suivants : sw6
- un compteur binaire sur le PORTB (256 tats). Placer une J1 sw1
temporisation de 100 ms entre chaque tat.
- L'appui sur RA2 (bit b2 du PORTA) doit remettre zro le J17
compteur.
- Les accs individuels aux bits seront effectus l'aide de
masques.
- Modifier ensuite le programme pour que le comptage n'ait lieu que lorsque RA1 est 0.
I. Le matriel
On vous donne le schma de principe de la maquette de TP avec la figure ci-dessous. Ce qui n'est
pas apparent est que le segment "a" est poids faible (RD0) et "g" est reli en RD6 et que les
afficheurs sont cathode commune c'est dire qu'ils s'allument avec un un logique.
MCLR RB7
RA0 RB6 a b c d e f g DP
RA1 RB5 DIS3 DIS0
RA2 RB4
RA3 RB3 f
RA4 RB2 g b
RA5 RB1
RE0 RB0 e c
RE1 Vcc
RE2 GND
VCC PIC16FRD7 d
GND RD6
RA7 RD5
RA6 RD4
RC0 RC7
RC1 RC6
RC2 RC5 10k
RC3 RC4
RD0 RD3
RD1 RD2
sw6
DIS3
DIS0
II.Logiciel - test
1. Exercice 4.1
Voici un premier projet exploitant un afficheur.
2 void main () {
3 //ANSEL = ANSELH = 0; // Toutes le ports E/S sont configurs comme numriques
4 unsigned short i;
5 INTCON = 0; // Disable GIE , PEIE , INTE , RBIE , TOIE
6 TRISA = 0;
7 PORTA = 0;
8 TRISD = 0;
9 PORTD = 0;
10 while (1) {
11 for (i = 0; i <= 9u; i++){
12 PORTA = 0; // Turn off all 7seg displays
13 PORTD = mask(i); // bring appropriate value to PORTD
14 PORTA = 1; // turn on appropriate 7seg. display
15 Delay_ms (1000);
16 }
17 }
18 }
19
20 unsigned short mask( unsigned short num) {
21 switch (num) {
22 case 0 : return 0x3F;
23 case 1 : return 0x06;
24 case 2 : return 0x5B;
25 case 3 : return 0x4F;
26 case 4 : return 0x66;
27 case 5 : return 0x6D;
28 case 6 : return 0x7D;
29 case 7 : return 0x07;
30 case 8 : return 0x7F;
31 case 9 : return 0x6F;
32 }
33 }
III.Logiciel - multiplexage
Lobjectif est dafficher un compteur sur DIS1 et DIS0 - donc de 00 99. Il sera indispensable de
basculer entre les deux afficheurs selon lalgorithme suivant :
Faire plusieurs fois:
activer DIS0
afficher le chiffre de poids faible
tempo
activer DIS1
afficher le chiffre de poids fort
tempo
2. Exercice 4.2
1. crire et tester un programme qui affiche un compteur de 00 99 sur les deux afficheurs - en
sappuyant sur lalgorithme donn. On utilisera les oprateurs modulo (%) et division (/).
2. Modifier les valeurs des temporisation - la mthode est-elle robuste ? simple ?
3. Exercice 4.3
Les oprateurs modulo et division sont trs couteux sur un PIC 16F. On vous demande donc de les
viter en grant une incrmentation BCD. Astuce trouver.
IV.Affichage de 4 digits
1. Exercice 4.4
Raliser un compteur et son affichage sur 4 digits en vous basant sur un algorithme similaire celui
de la section 3.
1. Exercice 4.5
On dsire afficher la valeur en provenance d'un convertisseur analogique numrique sur trois digits.
La valeur lue est sur 10 bits et ncessite donc en principe quatre digits. Mais pour des raisons
lectriques, il nous est impossible d'utiliser l'afficheur de poids le plus fort. La figure ci-dessous
explique pourquoi. Un programme d'exemple se trouve parmi les dmonstrations fournies avec la
carte.
Raliser un programme qui lit le convertisseur et affiche le rsultat sur trois digits.
- adapter pour que votre programme lise RA3 (contre RA2 dans le programme d'exemple)
- reprer le connecteur J15 sur votre carte et brancher le comme ci-dessous.
- reprer les interrupteurs sw6 et teindre l'afficheur DIS3 comme indiqu ci-dessous.
- adapter votre afficheur 4 digits sur 3 digits. Un bon programme devra grer le cas du digit des
centaines dpassant neuf, ce qui peut arriver.
- aprs utilisation remettre J15 comme votre arrive.
Vcc
RA3
J15
MCLR RB7
RA0 RB6 a b c d e f g DP
RA1 RB5 DIS3 DIS0
RA2 RB4
RA3 RB3 f
RA4 RB2 g b
P1 RA5 RB1
RE0 RB0 e c
RE1 Vcc
RE2 GND
VCC PIC16FRD7 d
GND RD6
RA7 RD5
RA6 RD4
RC0 RC7
RC1 RC6
RC2 RC5 10k
RC3 RC4
RD0 RD3
RD1 RD2
sw6
DIS2
DIS0
1. crire Hello world! en noir sur fond blanc. Pour cela consulter la documentation des fonctions
Glcd_Fill et Glcd_Write dans laide intgre (QHelp).
2. Modifier le programme pour placer (approximativement) la phrase au milieu de lcran.
3. La fonction sprinti est frquemment utilise pour formater un affichage. Elle sutilise comme suit
(voir laide) :
1 sprinti (& chaine , format , arg1 , arg2 , ...)
o chaine est une chaine de caractres (i.e. un tableau de char) qui sera modifie, format est une
chaine de caractres contenant des caractres ordinaires et des spcifications de format du type
%0[taille][type], [taille] tant le nombre de chiffres utiliss pour laffichage et [type] tant d pour des
entiers signs et u pour des entiers non-signs. La fonction sprinti ne fonctionne quavec des int.
Complter le programme suivant pour afficher t = 20,5
1 _____ text[10];
2 void main (){
1. Mise en place
1. Vrifier que le commutateur (switch) J11 est plac en position RE2, le dplacer si ncessaire. La
ligne DQ est ainsi connecte la broche 2 de PORTE.
2. En consultant la documentation de la librairie (QHelp, OneWire Library), donner les
caractristiques principales du protocole one-wire.
2. Communication
La librairie est compose de trois fonctions : Ow_reset(), 0w_Write() et Ow_Read. Pour lire et
afficher une temprature, il faut suivre les tapes suivantes :
a) Envoi de la commande CONVERT_T au capteur (mesure de la temprature)
3. Dcodage de la temprature
La mesure envoye par le capteur est code comme indiqu par lextrait de la datasheet du
DS1820 :
III.Supplment
On rappelle que la rsolution graphique de l'cran est de 128 pixels horizontaux et 64 pixels
verticaux. Elle sera note 128x64 par la suite. Les coordonnes suivant l'axe x vont donc de 0 127
et de 0 63 pour y.
Exercice 5-3 :
Au choix :
1. Utiliser les fonctions de la librairie du GLCD pour raliser un affichage graphique de la temprature
en fonction du temps.
2. Lire en dtail la documentation du DS1820 pour raliser une lecture de temprature avec une
rsolution suprieure 9 bits (voir p. 3 de la datasheet et le projet OneWire dans les examples).
Exercice 5-4 :
Raliser un jeu de pong deux raquettes commandes par des boutons poussoirs. L'affichage du
score se fera sur les afficheurs sept segments (deux afficheurs par joueurs)
I. Ressources
Diverses ressources sont rcuprable ladresse
http://pixel-shaker.fr/fr/enseignements/geii-programmation-pic-en-c-easypic5-mikroc :
un article (en franais) sur le fonctionnement et lutilisation de lcran tactile ;
un premier programme ( terminer) dinterfaage : touchscreen1.c (reproduit ci-dessous)
un second programme tester (en fin de TP) : touchscreen2.c
1. Programme touchescreen1.c
1 unsigned int GetX() {
2 //reading X
3 PORTC.F0 = 1; // DRIVEA = 1 (LEFT drive on, RIGHT drive on, TOP drive off)
4 PORTC.F1 = 0; // DRIVEB = 0 (BOTTOM drive off )
5 Delay_ms(5);
6 return ADC_read(0); // reading X value from RA0 (BOTTOM)
7 }
8 unsigned int GetY() {
9 //reading Y
10 PORTC.F0 = 0; // DRIVEA = 0 (LEFT drive off, RIGHT drive off, TOP drive on)
11 PORTC.F1 = 1; // DRIVEB = 1 (BOTTOM drive on)
12 Delay_ms(5);
13 return ADC_read(1); // reading Y value from RA1 (from LEFT)
14 }
15
16 void main() {
17 PORTA = 0x00;
18 TRISA = 0x03; // RA0 i RA1 are analog inputs
19 ANSEL = 0x03;
20 ANSELH = 0; // Configure other AN pins as digital I/O
21 PORTC = 0 ;
22 TRISC = 0 ;
23 // PORTC is output
24 ...
25 while (1) {
II.Travail de ralisation
1. Prparation
1. Lire le document, en particulier le paragraphe principe de fonctionnement et expliquer pourquoi
seuls quatre fils sont ncessaires pour interfacer lcran tactile.
2. Expliquer alors le fonctionnement des fonctions GetX() et GetY() dans le programme
touchscreen1.c
2. Ralisation
Exercice 6-1 :
Placer le fichier touchscreen1.c dans un projet et complter le programme pour, dans une boucle
infinie, afficher (sur le GLCD) les coordonnes x et y acquises via les fonctions GetX() et GetY().
Quelles sont les valeurs minimales et maximales que peuvent prendre ces coordonnes ?
Quelle est lorientation des axes ?
Exercice 6-2 :
1. A partir des coordonnes x et y, calculer les coordonnes x_screen et y_screen correspondant la
position courante dans le GLCD.
2. Ajouter le code suivant en dbut de la fonction main :
1 Glcd_Fill (0); // Clear GLCD
2 Glcd_Write_Text (" TOUCHPANEL EXAMPLE " ,10 ,0 ,1);
3 // Display Buttons on GLCD:
4 Glcd_Rectangle (8 ,16 ,60 ,48 ,1);
5 Glcd_Rectangle (68 ,16 ,120 ,48 ,1);
6 Glcd_Box (10 ,18 ,58 ,46 ,1);
7 Glcd_Box (70 ,18 ,118 ,46 ,1);
8 Glcd_Write_Text (" BUTTON1 " ,14 ,3 ,0);
9 Glcd_Write_Text ("RC6 OFF" ,14 ,4 ,0);
10 Glcd_Write_Text (" BUTTON2 " ,74 ,3 ,0);
11 Glcd_Write_Text ("RC7 OFF" ,74 ,4 ,0);
3. Vrifier que deux boutons sont dessins. Ajouter alors le code ncessaire dans la boucle infinie
pour quune pression sur le bouton 1 provoque lextinction de la LED numro 6 du PORTC, et quun
appui sur le bouton 2 commande sont allumage.
Exercice 6-3 : Afficher un bargraph horizontal qui s'allonge et se rtrcit avec les deux boutons.
Exercice 6-4 :
Vrifier le programme touchscreen2.c tlchargeable partir du lien au dbut de ce TP.
Exercice 7-1 :
1. crire un programme utilisant cette fonction pour afficher le rsultat (sur le GLCD) de la division
par 10 du nombre 171.
2. On souhaite maintenant connaitre la dure dexcution de cette fonction en utilisant le timer TMR0.
crire un programme qui mesure cette dure, avec lalgorithme suivant :
(a) Initialisation du timer
(b) Appel de la fonction
(c) Lecture du timer
(d) Calcul de la dure (en fonction de la frquence dhorloge et du prescaler.
(e) Affichage de la dure mesure.
III.Test d'interruption
1. Interruption simple
Exercice 7-4 :
Saisir et tester le programme suivant :
33 PWM1_Set_Duty(current_duty);
34 }
35
36 if (RA1_bit) { // button on RA1 pressed
37 Delay_ms(40);
38 current_duty--; // decrement current_duty
39 PWM1_Set_Duty(current_duty);
40 }
41
42 if (RA2_bit) { // button on RA2 pressed
43 Delay_ms(40);
44 current_duty1++; // increment current_duty1
45 PWM2_Set_Duty(current_duty1);
46 }
47
48 if (RA3_bit) { // button on RA3 pressed
49 Delay_ms(40);
50 current_duty1--; // decrement current_duty1
51 PWM2_Set_Duty(current_duty1);
52 }
53
54 Delay_ms(5); // slow down change pace a little
55 }
56 }
Exercice 7-5 :
Modifier l'exemple pour raliser un clairage sur une LED dont l'intensit dpend de la valeur d'un
potentiomtre. Il faut donc supprimer une gestion PWM et la remplacer par la lecture d'un
potentiomtre dj vu auparavant.