Académique Documents
Professionnel Documents
Culture Documents
7 juin 2010
A Ce document a t ralis avec L TEX, en utilisant lditeur Emacs et le mode auctex, le tout tant excut sur le syst`me e e e e e e e e e dexploitation GNU/Linux.
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
3 Ports en entre/sortie e 3.1 Slection des E/S . . . . . e 3.2 Scrutation de niveau . . . 3.3 Attente de fronts . . . . . 3.3.1 Changement dtat e 3.3.2 Compteur . . . . . 3.4 En attendant la n du TP
. . . . . . . . . . . . . . . . . . . . . dune diode . . . . . . . . . . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
4 Multiplexage - acheurs sept segments 4.1 Matriel . . . . . . . . . . . . . . . . . . e 4.2 Logiciel - test . . . . . . . . . . . . . . . 4.3 Logiciel - multiplexage . . . . . . . . . . 4.4 Logiciel - avec interruptions . . . . . . . 4.5 Si vous avez encore du temps . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
8 . 8 . 8 . 9 . 9 . 10 11 11 12 12 13 14 14 15 15 16 17 17 18
5 Acheur GLCD - capteur de temprature DS1820 e 5.1 Achage sur le GLCD . . . . . . . . . . . . . . . . . 5.2 Communication one-wire avec le capteur DS1820 . . 5.2.1 Mise en place . . . . . . . . . . . . . . . . . . 5.2.2 Communication . . . . . . . . . . . . . . . . . 5.2.3 Dcodage de la temprature . . . . . . . . . . e e 5.3 Supplment . . . . . . . . . . . . . . . . . . . . . . . e
liaison one-wire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
6 Timer et interruption - mesure de temps et production de e 6.1 Elments de documentation . . . . . . . . . . . . . . . . . . . 6.2 Test de fonctionnement . . . . . . . . . . . . . . . . . . . . . 6.3 Mesure de dure dxcution dun morceau de code . . . . . . e e e 6.4 Production dun signal priodique . . . . . . . . . . . . . . . e 7 Interfaage dun cran tactile c e
signaux priodiques e . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
TP 1
Prise en main
Objectifs Identier les lments de la maquette, crer un projet, le compiler et lexcuter sur la maquette, observer ee e e les chiers crs, tracer le programme et des variables. ee
1.1
Prambule e
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 documenee tation et tlcharger une version dessai de lenvironnement (IDE et compilateur). ee Vous devez vous connecter en usant le login ge1 (sans mot de passe).
1.2
Observation de la maquette
Manipulation Identier les lments suivant sur cette reproduction (donner les numros) : ee e Switch dalimentation, programmateur USB (mikroICD), micro-contrleur PIC, o bouton de reset, diodes de contrle des ports A ` E, o a boutons poussoir de test de ports A ` E, a acheurs 7 segments multiplexs, e
1.3
Vous disposez dun petit fascicule (en anglais) intitul Creating the rst project in mikroC for PIC. Ce texte e vous indique la marche ` suivre pour crer et compiler un projet. a e Manipulation Suivre les instructions (jusqu` lexcution - run) avec les recommandations suivantes : a e Nom du projet : tp1a Chemin du projet : D:\rep_perso\tp1. Ce dossier doit tre cr en remplaant rep_perso par un nom e ee c qui vous est propre. Le type (device) de PIC est ` lire sur la puce elle-mme. a e Le programme ` saisir est le suivant : a
void main () { PORTC = 0; // Init PORTC TRISC = 0; // PORTC as output while (1) { PORTC = ~ PORTC ; // toggle PORTC Delay_ms (1000); // 1s delay } }
Manipulation Aller dans le dossier de votre projet. Ouvrir les chiers .hex, .mcl, asm, .lst. Que contiennent ces chiers, quelle est leur utilit ? e Par quelles instructions assembleur sont traduites les lignes suivantes ? PORTC = 0; et TRISC = 0;
1.4
Crer un nouveau projet (toujours dans votre dossier tp1) nomm tp1b. Le programme ` saisir est le suivant : e e a
void main () { int k; PORTC = 0; // Init PORTC TRISC = 0; // PORTC as output for (k = 0; k < 256; k++) { PORTC = k; } }
Manipulation Pour utiliser le dbogueur (voir la photocopie jointe) : e Modier les options du projet pour activer le dbogueur ICD (dans Project Setup Window, sur la gauche) : e cocher mikroICD Debug sous Build Type, vrier que mikroICD Debugger est activ sous Debugger. e e Compiler le projet (Build - CTRL+F9). Programmer la puce (Program - F11). Lancer le dbogueur (Start Debugger - F9) e 3
Manipulation Exploiter le dbogueur pour : e Suivre en pas-`-pas lexcution du programme (Step Into par exemple). Vrier lallumage correct des a e e diodes du port C. Ajouter le suivi des variables PORTC et k lorsque vous tes en mode pas-`-pas. Contrler la bonne volution e a o e des valeurs de ces variables. Exprimenter les autres possibilits du dbogueur. e e e
TP 2
Rappels
On rappelle quen C le ou boolen se fait par ||, le et boolen par &&. Nous aurons besoin du ou bit ` bit e e a et du et bit ` bit &. Soit le contenu dun registre B sur huit bits, a b7 1 b6 1 b5 1 b4 0 b3 0 b2 0 b1 1 b0 . 1
Prparation e 1. Vous dsirez mettre ` 1 le bit b2 sans changer les autres bits, comment faites-vous ? e a 2. Vous dsirez mettre ` 0 le bit b6 sans changer les autres bits comment faites-vous ? e a
2.2
Exemple
On vous donne un programme C qui fait clignoter une led (poids faible mais ` gauche) sur le port C. a
void main(void ){ TRISC = 0; // Tous les bits du PORTC en sortie . PORTC = 0; while (1) { PORTC = 0x01; Delay_ms (1000); PORTC = 0x00; Delay_ms (1000); } }
Manipulation Ecrire ce programme pour lessayer, le compiler, le charger et lexcuter. Modier-le pour faire e clignoter la led RC1.
2.3
Exercices
1. Ecrire un chenillard simple : une led se dplaant sur le PORTC (de haut en bas) et en utilisant le mme e c e type de temporisation que dans le programme exemple. 2. Ecrire un chenillard double : un chenillard de haut en bas et simultanment un autre de bas en haut qui se e croisent. 3. Ecrire un chenillard ` entassement (1 led se dplaant et saccumulant en bas). a e c Note : les oprateurs de dcalage sont >> et << pour respectivement le dcalage ` droite et le dcalage ` gauche. e e e a e a
TP 3
Ports en entre/sortie e
Les ports A, B, C, D et E sont des ports dentre/sortie dont chaque bit peut-tre utilis soit en entre, soit en e e e e sortie, de faon indpendante. Ainsi chaque port poss`de un satellite : TRISA, TRISB, TRISC, TRISD et TRISE c e e qui permet de dterminer le sens de chaque bit (0 : Output, 1 : Input). e
par exemple :
(void ){ ANSELH = 0; // Toutes le ports E/S sont configurs comme numriques 0; // RAZ des broches du port A 0 b00000100 ; // Toutes les broches du port A sauf PORTA .2 sont des sorties
3.1
Ecrire un programme qui positionne en entre les 4 bits de poids faibles du port B et en sortie les autres. Le e programme doit ensuite en permanence recopier les 4 bits de poids faibles vers les 4 bits de poids forts.
1. http://www.mikroe.com/en/books/pic-books/mikroc/
3.2
Scrutation de niveau
Ecrire un programme qui comporte les lments suivants. ee 1. Un compteur binaire sur le port B (256 tats). Placer une temporisation de 100ms entre chaque tat. e e 2. Un appui sur PORTA.2 doit remettre ` zro le compteur. a e 3. Les acc`s individuels aux bits seront eectus ` laide de masques. e e a Modier ensuite le programme pour que le comptage nai lieu que lorsque PORTA.1 est ` zro. a e
3.3
3.3.1
Attente de fronts
Changement dtat dune diode e
Raliser un programme avec le cahier des charges suivant. e 1. En dbut de programme la diode PORTB.0 doit tre allume. e e e 2. Ensuite, un front montant appliqu sur PORTA.0 provoquera un changement dtat de la diode. e e 3. Les acc`s au bits seront eectus ` laide des acc`s directs (en crivant PORTB.F2 pour accder au bit 2 du port e e a e e e B par exemple). Puis dans un second temps avec des masques.
3.3.2
Compteur
Reprendre le compteur prcdent (cf scrutation par niveau 3.2) avec les changements suivants (un changement e e a ` la fois). 1. Un front descendant sur PORTA.2 provoquera la RAZ du compteur. 2. Puis, seul un front montant sur PORTA.1 incrmentera le compteur. e Que pensez-vous de la gestion de plusieurs attentes de front ?
3.4
En attendant la n du TP
void main (void ){ ANSEL = ANSELH = 0; // Toutes le ports E/S sont configurs comme numriques PORTA = 0x55; }
1. Quelles sont les diodes allumes du port A ? e 2. Proposer un schma compatible avec cette constatation. e 3. Proposer un schma o` les diodes seraient allumes en positionnant les bits ` 0 du port. e u e a
TP 4
1. Quel port permet de slectionner lacheur actif ? e 2. Quelles valeurs faut-il envoyer pour slectionner lacheur DIS0 ? Lacheur DIS1 ? Lacheur DIS2 ? Lacheur e DIS3 ? 3. Quel port permet dactiver les segments ? 4. Est-il possible dactiver deux acheurs en mme temps ? e 5. Est-il possible dacher deux symboles dirents en mme temps ? e e 6. Quelle est lutilit du multiplexage ? e
4.2
Logiciel - test
// Fichier principl # include " Display_utils .h" void main () { unsigned short i; INTCON = 0; // Disable GIE , PEIE , INTE , RBIE , TOIE TRISA = 0; PORTA = 0; TRISD = 0; PORTD = 0; while (1) { for (i = 0; i <= 9u; i++){ PORTA = 0; // Turn off all 7seg displays PORTD = mask(i); // bring appropriate value to PORTD PORTA = 1; // turn on appropriate 7seg. display Delay_ms (1000); } } } // Fichier Display_utils .h unsigned switch case 0 case 1 case 2 case 3 case 4 case 5 case 6 case 7 case 8 case 9 } } short mask( unsigned short num) { (num) { : return 0x3F; : return 0x06; : return 0x5B; : return 0x4F; : return 0x66; : return 0x6D; : return 0x7D; : return 0x07; : return 0x7F; : return 0x6F;
1. Compiler et excuter le programme. Que fait ce programme ? e 2. Le modier pour acher le compteur sur DIS1, puis sur DIS2, puis sur DIS3.
4.3
Logiciel - multiplexage
Lobjectif est dacher un compteur sur DIS1 et DIS0 - donc de 00 ` 99. Il sera indispensable de basculer entre a les deux acheurs selon lalgorithme suivant :
Faire plusieurs fois: activer DIS0 afficher le chiffre de poids faible tempo activer DIS1 afficher le chiffre de poids fort tempo
1. Ecrire et tester un programme qui ache un compteur de 00 ` 99 sur les deux acheurs - en sappuyant sur a lalgorithme donn. e 2. Modier les valeurs des temporisation - la mthode est-elle robuste ? simple ? e
4.4
Voici une autre mthode pour raliser le multiplexage. Le chier est tlchargeable ` ladresse suivante : http: e e ee a //pixel-shaker.fr/fr/enseignements/geii-programmation-pic-en-c-easypic5-mikroc. 9
/ Project name: Display7Seg_02 ( Usage of 2 7Seg. displays ) Copyright : (c) MikroElektronika , 20052008. Description : This code demonstrates displaying numbers (0 ,1 ,2..99) on two 7segment displays . Each digit is on for 1 second . Test configuration : MCU: PIC16F877A Dev. Board : EasyPIC5 Oscillator : HS , 08.0000 MHz Ext. Modules : SW: mikroC v8 .0 / # include " Display_utils .h" unsigned short digit_no , digit10 , digit1 , digit , i; void interrupt () { if ( digit_no ==0) { PORTA = 0; PORTD = digit1 ; PORTA = 1; digit_no = 1; } else { PORTA = 0; PORTD = digit10 ; PORTA = 2; digit_no = 0; } TMR0 = 0; INTCON = 0x20; }
// Turn off all 7seg displays // send mask for ones digit to PORTD // turn on 1st 7 seg., turn off 2nd
// Turn off all 7seg displays // send mask for tens digit to PORTD // turn on 2nd 7 seg., turn off 1st
// //
void main () { OPTION_REG = 0x80; // Timer0 settings TMR0 = 0; INTCON = 0xA0; // Disable PEIE ,INTE ,RBIE ,T0IE PORTA = 0; // clear PORTA (make sure both displays are off) TRISA = 0; // designate PORTA pins as output PORTD = 0; // clear PORTD (make sure LEDs are off) TRISD = 0; // designate PORTD pins as output do { for (i = 0; i <=99; i++) { // count from 0 to 99 digit = i % 10u; digit1 = mask( digit ); // prepare ones digit digit = (char )(i / 10u) % 10u; digit10 = mask( digit ); // prepare tens digit Delay_ms (1000); } } while (1); // endless loop }
1. Tester le programme. 2. Le comparer avec la version prcdente - en particulier, comment est ralis le basculement ? e e e e 3. Expliquer le fonctionnement de ce programme - en donnant son algorithme par exemple.
4.5
1. Modier le programme pour stocker les valeurs des segments dans un tableau (au lieu dutiliser une fonction).
10
TP 5
void my_glcd_init (){ ANSEL = ANSELH = 0; // AN pins as digital Glcd_Init (& PORTB , 0, 1, 2, 3, 5, 4, & PORTD ); Glcd_Set_Font ( FontSystem5x8 , 5, 8, 0x20 ); // Slection police de caractres Glcd_Fill (0 x00 ); } void main (){ my_glcd_init (); Glcd_Write_Text (" Hello world !", 0, 0, 1); }
1. Ecrire Hello world! en noir sur fond blanc. Pour cela consulter la documentation des fonctions Glcd_Fill et Glcd_Write dans laide intgre (QHelp). e e 2. Modier le programme pour placer (approximativement) la phrase au milieu de lcran. e 3. La fonction sprinti est frquemment utilise pour formatter un achage. Elle sutilise comme suit (voir laide) : e e
sprinti (& chaine , format , arg1 , arg2 , ...)
11
o` chaine est une chaine de caract`res (i.e. un tableau de char) qui sera modie. format est une chaine de u e e caract`res contenant des caract`res ordinaires et des spcications de format du type %0[taille][type], [taille] e e e tant le nombre de chires utiliss pour lachage et [type] tant d pour des entiers signs et u pour des entiers e e e e non-signs. La fonction sprinti ne fonctionne quavec des int. e Complter le programme suivant pour acher t = 20,5 e
_____ text [10]; void main (){ unsigned int val = 20; unsigned int dec = 5; my_glcd_init (); sprinti (text , ____ , val , dec ); Glcd_Write_Text (text , 0, 0, 1); }
5.2
Le capteur de temprature DS1820 sappuie sur le protocole one-wire pour communiquer sa mesure. Comme e son nom lindique, un seul l est ncessaire (mme si plusieurs priphriques sont utiliss). e e e e e
5.2.1
Mise en place
1. Vrier que le commutateur (switch) J11 est plac en position RE2, le dplacer si ncessaire. La ligne DQ est e e e e ainsi connecte ` la broche 2 de PORTE. e a 2. En consultant la documentation de la librairie (QHelp, OneWire Library), donner les caractristiques princie pale du protocole one-wire. 12
5.2.2
Communication
La librairie est compose de trois fonctions : Ow_reset(), 0w_Write() et Ow_Read. Pour lire et acher une temprature, e e il faut suivre les tapes suivantes : e a) Envoi de la commande CONVERT_T au capteur (mesure de la temprature) e b) Envoi de la commande READ_SCRATCHPAD au capteur (placement de la temprature dans le buer du capteur) e c) Lecture du buer d) Achage. Complter le programme suivant (en vous aidant de la documentation) : e
void main (){ unsigned int temp; my_glcd_init (); while (1) { // Step a) Ow_Reset (____ , ____ ); Ow_Write (____ , ____ , 0xCC ); // on sadresse tous les priphriques onewire Ow_Write (____ , ____ , 0x44 ); // Envoi de la commande CONVERT_T Delay_us (120); // attente mesure // Step b) Ow_Reset (____ , ____ ); Ow_Write (____ , ____ , 0xCC ); // on sadresse tous les priphriques onewire Ow_Write (____ , ____ , 0xBE ); // Envoi de la commande READ_SCRATCHPAD // Step c) temp = Ow_Read (____ , ____ ); // Step d) // a crire delay_ms (100); }
13
5.2.3
Dcodage de la temprature e e
La mesure envoye par le capteur est code comme indiqu par lextrait de la datasheet du DS1820 : e e e
Il est donc indispensable de la dcoder avant de lacher. e 1. Quels bits contiennent la partie enti`re de la temprature ? e e 2. Quels bits contiennent la partie dcimale de la temprature ? e e 3. Quels bits contiennent le signe de la mesure ? 4. Quelle est la prcision de la mesure ? e 5. Crer deux variables temp_int et temp_dec dclare en unsigned int destines ` contenir respectivement la partie e e e e a enti`re et la partie dcimale. On ngligera de grer le signe. e e e e 6. Aecter ces deux variables avec les parties enti`re et dcimale, dtermine ` partir de temp. Vous pourrez e e e e a utiliser des oprateurs de masque (&) et de dcalage (>>, <<). e e 7. Corriger lachage en utilisant la fonction sprinti utilise comme suit : e
sprinti (text , "t = %02u ,%01u ( Celsius )", temp_int , temp_dec );
5.3
Supplment e
Au choix : 1. Utiliser les fonctions de la librairie du GLCD pour raliser un achage graphique de la temprature en e e fonction du temps. 2. Lire en dtail la documentation du DS1820 pour raliser une lecture de temprature avec une rsolution e e e e suprieure ` 9bits (voir p. 3 de la datasheet et le projet OneWire dans les examples). e a
14
TP 6
15
6.2
Test de fonctionnement
unsigned int cnt; void interrupt () { cnt ++; TMR0 = 96; INTCON = 0x20; } void main () { OPTION_REG = 0x84; ANSEL = 0; ANSELH = 0; TRISB = 0; PORTB = 0xFF; TMR0 = 96; INTCON = 0xA0; cnt = 0; while (1) if (cnt PORTB cnt = } } { == 400) { = ~ PORTB ; 0;
// Assign prescaler to TMR0 // Configure AN pins as digital I/O // // // // // PORTB is output Initialize PORTB Timer0 initial value Enable TMRO interrupt Initialize cnt
1. Que se passe-t-il ? 16
2. Expliciter la conguration des registres OPTION_REG et INTCON. 3. A quels endroits est-il possible de modier le code pour allonger la priode de clignotement ? e 4. Modier les bits du prescaler selon la table fournie pour allonger la priode de clignotement. e
6.3
unsigned int div10 ( unsigned int A){ unsigned int Q; / the quotient / Q = ((A >> 1) + A) >> 1; / Q = A0.11 / Q = ((Q >> 4) + Q) ; / Q = A 0.110011 / Q = ((Q >> 8) + Q) >> 3; / Q = A 0.00011001100110011 / / either Q = A/10 or Q+1 = A/10 for all A < 534 ,890 / return Q; }
1. Ecrire un programme utilisant cette fonction pour acher le rsultat (sur le GLCD) de la division par 10 du e nombre 171. 2. On souhaite maintenant connaitre la dure dxcution de cette fonction en utilisant le timer TMR0. Ecrire un e e e programme qui mesure cette dure, avec lalgorithme suivant : e (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 e (e) Achage de la dure mesure. e e
6.4
17
TP 7
Divers ressources sont rcuprable ` ladresse e e a 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 ; c e un premier programme (` terminer) dinterfaage : touchscreen1.c a c un second programme ` tester (en n de TP) : touchscreen2.c a 1. Lire le document, en particulier le paragraphe principe de fonctionnement et expliquer pourquoi seuls quatre ls sont ncessaires pour interfacer lcran tactile. e e 2. Expliquer alors le fonctionnement des fonctions GetX() et GetY() dans le programme touchscreen1.c 3. Placer le chier touchscreen1.c dans un projet et complter le programme pour dans une boucle innie, acher e (sur le GLCD) les coordonnes x et y acquises via les fonctions GetX() et GetY(). e Quelles sont les valeurs min et max que peuvent prendre ces coordonnes ? e Quelle est lorientation des axes ? 4. A partir des coordonnes x et y, calculer les coordonnes x_screen et y_screen correspondant ` la position e e a courante dans le GLCD.
18
Vrier que deux boutons sont dessins. Ajouter alors le code ncessaire dans la boucle innie pour quune e e e pression sur le bouton 1 provoque lextinction de la LED n 6 du PORTC, et quun appui sur le bouton 2 commande sont allumage. 6. Tlcharger et tester le programme du chier touchscreen2.c ee
19