P. 1
geii_c_tp

geii_c_tp

|Views: 15|Likes:
Published by Ibrahima Gueye

More info:

Published by: Ibrahima Gueye on Nov 18, 2013
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

04/22/2015

pdf

text

original

Programmation C sur PIC (EasyPIC5 - MikroC

)

Geii - S2 - II2 - Travaux pratiques

7 juin 2010

F. Morain-Nicolier http ://pixel-shaker.fr

A Ce document a ´ et´ e r´ ealis´ e avec L TEX, en utilisant l’´ editeur Emacs et le mode auctex, le tout ´ etant ex´ ecut´ e sur le syst` eme d’exploitation GNU/Linux.

Table des mati` eres
1 Prise en main 1.1 Pr´ eambule . . . . . . . . . . . . 1.2 Observation de la maquette . . 1.3 Cr´ eation d’un premier projet . 1.4 Ex´ ecution pas-` a-pas, d´ eboguage 2 Des 2.1 2.2 2.3 2 2 2 3 3 5 5 5 5 6 6 7 7 7 7 7

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

leds, des leds Rappels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3 Ports en entr´ ee/sortie 3.1 S´ election des E/S . . . . . 3.2 Scrutation de niveau . . . 3.3 Attente de fronts . . . . . 3.3.1 Changement d’´ etat 3.3.2 Compteur . . . . . 3.4 En attendant la fin du TP

. . . . . . . . . . . . . . . . . . . . . d’une diode . . . . . . . . . . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

4 Multiplexage - afficheurs sept segments 4.1 Mat´ eriel . . . . . . . . . . . . . . . . . . 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 Afficheur GLCD - capteur de temp´ erature DS1820 5.1 Affichage 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 D´ ecodage de la temp´ erature . . . . . . . . . . 5.3 Suppl´ ement . . . . . . . . . . . . . . . . . . . . . . .

liaison one-wire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

6 Timer et interruption - mesure de temps et production de ´ ements de documentation . . . . . . . . . . . . . . . . . . . 6.1 El´ 6.2 Test de fonctionnement . . . . . . . . . . . . . . . . . . . . . 6.3 Mesure de dur´ ee d’´ ex´ ecution d’un morceau de code . . . . . . 6.4 Production d’un signal p´ eriodique . . . . . . . . . . . . . . . 7 Interfa¸ cage d’un ´ ecran tactile

signaux p´ eriodiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

1

mikroe. observer les fichiers cr´ e´ es. 1.com/).1 Pr´ eambule – une documentation est disponible dans C:\doc_mikroc for PIC\ . Vous devez vous connecter en usant le login ge1 (sans mot de passe). cr´ eer un projet. 1. 2 .TP 1 Prise en main Objectifs Identifier les ´ el´ ements de la maquette. vous pourrez consulter divers ´ el´ ements de documentation et t´ el´ echarger une version d’essai de l’environnement (IDE et compilateur). le compiler et l’ex´ ecuter sur la maquette.2 Observation de la maquette Voici une vue de maquette comportant des num´ eros. – sur le site du constructeur (http://www. tracer le programme et des variables.

– Programmer la puce (Program . – Ouvrir les fichiers . – Le type (device ) de PIC est ` a lire sur la puce elle-mˆ eme. // PORTC as output while (1) { PORTC = ~ PORTC . . – Compiler le projet (Build . – et TRISC = 0. – boutons poussoir de test de ports A ` a E. Ce dossier doit ˆ etre cr´ e´ e en rempla¸ cant rep_perso par un nom qui vous est propre.run ) avec les recommandations suivantes : – Nom du projet : tp1a – Chemin du projet : D:\rep_perso\tp1. k++) { PORTC = k. Que contiennent ces fichiers. – afficheurs 7 segments multiplex´ es. – v´ erifier que mikroICD Debugger est activ´ e sous Debugger. // Init PORTC TRISC = 0. d´ eboguage ¤ Cr´ eer un nouveau projet (toujours dans votre dossier tp1) nomm´ e tp1b. asm.4 § Ex´ ecution pas-` a-pas.F11).CTRL+F9). Ce texte vous indique la marche ` a suivre pour cr´ eer et compiler un projet. quelle est leur utilit´ e? – Par quelles instructions assembleur sont traduites les lignes suivantes ? – PORTC = 0. PORTC = 0. 1. Manipulation Suivre les instructions (jusqu’` a l’ex´ ecution .3 Cr´ eation d’un premier projet Vous disposez d’un petit fascicule (en anglais) intitul´ e Creating the first project in mikroC for PIC. 1. Le programme ` a saisir est le suivant : ¦ void main () { int k. – Lancer le d´ ebogueur (Start Debugger . // PORTC as output for (k = 0. // Init PORTC TRISC = 0.mcl. sur la gauche) : – cocher mikroICD Debug sous Build Type. } } ¥ Manipulation Pour utiliser le d´ ebogueur (voir la photocopie jointe) : – Modifier les options du projet pour activer le d´ ebogueur ICD (dans Project Setup Window. – bouton de reset.lst. – Le programme ` a saisir est le suivant : ¤ § void main () { PORTC = 0. // 1s delay } } ¦ ¥ Manipulation – Aller dans le dossier de votre projet.F9) 3 . – micro-contrˆ oleur PIC. – diodes de contrˆ ole des ports A ` a E.hex. k < 256. . – programmateur USB (mikroICD). // toggle PORTC Delay_ms (1000).Manipulation Identifier les ´ el´ ements suivant sur cette reproduction (donner les num´ eros) : – Switch d’alimentation.

Contrˆ oler la bonne ´ evolution des valeurs de ces variables. – Ajouter le suivi des variables PORTC et k lorsque vous ˆ etes en mode pas-` a-pas. – Exp´ erimenter les autres possibilit´ es du d´ ebogueur.Manipulation Exploiter le d´ ebogueur pour : – Suivre en pas-` a-pas l’ex´ ecution du programme (Step Into par exemple). V´ erifier l’allumage correct des diodes du port C. 4 .

} } ¥ ´ Manipulation Ecrire ce programme pour l’essayer. Ecrire un chenillard simple : une led se d´ epla¸ cant sur le PORTC (de haut en bas) et en utilisant le mˆ eme type de temporisation que dans le programme exemple. 5 . Delay_ms (1000). le compiler. Vous d´ esirez mettre ` a 1 le bit b2 sans changer les autres bits. Ecrire un chenillard double : un chenillard de haut en bas et simultan´ ement un autre de bas en haut qui se croisent. des leds 2. ´ 2.3 Exercices ´ 1. Note : les op´ erateurs de d´ ecalage sont >> et << pour respectivement le d´ ecalage ` a droite et le d´ ecalage ` a gauche. Modifier-le pour faire clignoter la led RC1. // Tous les bits du PORTC en sortie . Nous aurons besoin du «ou bit ` a bit» et du «et bit ` a bit» &.TP 2 Des leds. ´ 3. 1 Pr´ eparation 1. le «et bool´ een» par &&. Soit le contenu d’un registre B sur huit bits.2 § Exemple ¤ On vous donne un programme C qui fait clignoter une led (poids faible mais ` a gauche) sur le port C. b7 1 b6 1 b5 1 b4 0 b3 0 b2 0 b1 1 b0 . Ecrire un chenillard ` a entassement (1 led se d´ epla¸ cant et s’accumulant en bas).1 | Rappels On rappelle qu’en C le «ou bool´ een» se fait par ||. Delay_ms (1000). le charger et l’ex´ ecuter. while (1) { PORTC = 0x01. Vous d´ esirez mettre ` a 0 le bit b6 sans changer les autres bits comment faites-vous ? 2. 2. PORTC = 0x00. comment faites-vous ? 2. PORTC = 0. ¦ void main( void ){ TRISC = 0.

Programming in C 1 . Figures issues de PIC Microcontrollers . D et E sont des ports d’entr´ ee/sortie dont chaque bit peut-ˆ etre utilis´ e soit en entr´ ee. C. // RAZ des broches du port A 0 b00000100 .com/en/books/pic-books/mikroc/ 6 .1 S´ election des E/S ´ Ecrire un programme qui positionne en entr´ ee les 4 bits de poids faibles du port B et en sortie les autres. § par exemple : ( void ){ ANSELH = 0.mikroe. B. // Toutes les broches du port A sauf PORTA . 1 : Input ). // Toutes le ports E/S sont configurés comme numériques 0. de fa¸ con ind´ ependante. 1.2 sont des sorties ¤ ¦ void main ANSEL = PORTA = TRISA = } ¥ 3.TP 3 Ports en entr´ ee/sortie Les ports A. TRISD et TRISE qui permet de d´ eterminer le sens de chaque bit (0 : Output. Le programme doit ensuite en permanence recopier les 4 bits de poids faibles vers les 4 bits de poids forts. TRISB. http://www. TRISC. Ainsi chaque port poss` ede un satellite : TRISA. soit en sortie.

Placer une temporisation de 100ms entre chaque ´ etat.0 doit ˆ etre allum´ ee. seul un front montant sur PORTA. En d´ ebut de programme la diode PORTB.3. 3. ` 1. Quelles sont les diodes allum´ ees du port A ? 2. } ¥ 1.2 Compteur Reprendre le compteur pr´ ec´ edent (cf scrutation par niveau 3. 3. // Toutes le ports E/S sont configurés comme numériques PORTA = 0x55.2 provoquera la RAZ du compteur. 1. 2.1 est ` a z´ ero.2 doit remettre ` a z´ ero le compteur. 7 .4 § En attendant la fin du TP ¤ Soit le programme suivant : ¦ void main ( void ){ ANSEL = ANSELH = 0. 2. Proposer un sch´ ema o` u les diodes seraient allum´ ees en positionnant les bits ` a 0 du port. un front montant appliqu´ e sur PORTA. Les acc` es au bits seront effectu´ es ` a l’aide des acc` es directs (en ´ ecrivant PORTB.3.3 3. Un compteur binaire sur le port B (256 ´ etats). Proposer un sch´ ema compatible avec cette constatation. Ensuite. Un front descendant sur PORTA. 3. Puis.1 incr´ ementera le compteur. Modifier ensuite le programme pour que le comptage n’ai lieu que lorsque PORTA. Un appui sur PORTA. Les acc` es individuels aux bits seront effectu´ es ` a l’aide de masques. Que pensez-vous de la gestion de plusieurs attentes de front ? 3. Puis dans un second temps avec des masques. 1. 3.3.2 Scrutation de niveau ´ Ecrire un programme qui comporte les ´ el´ ements suivants.0 provoquera un changement d’´ etat de la diode. 2.1 Attente de fronts Changement d’´ etat d’une diode R´ ealiser un programme avec le cahier des charges suivant.F2 pour acc´ eder au bit 2 du port B par exemple). 3.2) avec les changements suivants (un changement a la fois).

Est-il possible d’afficher deux symboles diff´ erents en mˆ eme temps ? 6. Quelle est l’utilit´ e du multiplexage ? 4. Quelles valeurs faut-il envoyer pour s´ electionner l’afficheur DIS0 ? L’afficheur DIS1 ? L’afficheur DIS2 ? L’afficheur DIS3 ? 3. Est-il possible d’activer deux afficheurs en mˆ eme temps ? 5.1 Mat´ eriel 1.test Voici un premier projet exploitant les afficheurs.afficheurs sept segments 4. Quel port permet d’activer les segments ? 4.2 Logiciel . Quel port permet de s´ electionner l’afficheur actif ? 2.TP 4 Multiplexage . 8 .

PORTA = 0. : return 0x4F. TRISD = 0. ¤ ¦ § ¥ ¤ ¦ ¥ 1. Il sera indispensable de basculer entre les deux afficheurs selon l’algorithme suivant : ¤ § Faire plusieurs fois: − activer DIS0 − afficher le chiffre de poids faible − tempo − activer DIS1 − afficher le chiffre de poids fort − tempo ¦ ¥ ´ 1. // Disable GIE . Le fichier est t´ el´ echargeable ` a l’adresse suivante : http: //pixel-shaker. : return 0x7F.3 Logiciel .multiplexage L’objectif est d’afficher un compteur sur DIS1 et DIS0 . : return 0x6F. : return 0x6D. Modifier les valeurs des temporisation . display Delay_ms (1000). Que fait ce programme ? 2. } } } // Fichier Display_utils . : return 0x7D.avec interruptions Voici une autre m´ ethode pour r´ ealiser le multiplexage. 2. : return 0x66. PORTD = 0. i <= 9u. RBIE . : return 0x06. // bring appropriate value to PORTD PORTA = 1.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. Compiler et ex´ ecuter le programme. Ecrire et tester un programme qui affiche un compteur de 00 ` a 99 sur les deux afficheurs . : return 0x07. TOIE TRISA = 0. : return 0x5B.donc de 00 ` a 99. INTE .4 Logiciel .fr/fr/enseignements/geii-programmation-pic-en-c-easypic5-mikroc. puis sur DIS2. 4. INTCON = 0. i++){ PORTA = 0.la m´ ethode est-elle robuste ? simple ? 4.en s’appuyant sur l’algorithme donn´ e. while (1) { for (i = 0. 9 . Le modifier pour afficher le compteur sur DIS1. PEIE . // Turn off all 7seg displays PORTD = mask(i).h" void main () { unsigned short i. puis sur DIS3.§ // Fichier principl # include " Display_utils . // turn on appropriate 7seg.

// endless loop } ¥ 1. PORTD = digit10 . digit . 08.RBIE .en donnant son algorithme par exemple.5 Si vous avez encore du temps 1. // Disable PEIE .. i <=99. digit1 . // prepare tens digit Delay_ms (1000). digit_no = 0. Expliquer le fonctionnement de ce programme .. void interrupt () { if ( digit_no ==0) { PORTA = 0.99) on two 7−segment displays . Each digit is on for 1 second . 2005 − 2008. i. PORTA = 1. } } while (1). } else { PORTA = 0. 10 .0000 MHz Ext. PORTA = 2. 4. // prepare ones digit digit = ( char )(i / 10u) % 10u. turn off 1st // // clear TMRO clear TMR0IF and set TMR0IE ¦ void main () { OPTION_REG = 0x80. digit_no = 1. // clear PORTD (make sure LEDs are off) TRISD = 0.T0IE PORTA = 0. ∗ Description : This code demonstrates displaying numbers (0 . 2.§ /∗ ∗ Project name: Display7Seg_02 ( Usage of 2 7Seg. INTCON = 0xA0.. } ¤ // Turn off all 7seg displays // send mask for ones digit to PORTD // turn on 1st 7 seg. displays ) ∗ Copyright : (c) MikroElektronika .0 ∗/ # include " Display_utils . ∗ Test configuration : MCU: PIC16F877A Dev. // designate PORTA pins as output PORTD = 0. Modifier le programme pour stocker les valeurs des segments dans un tableau (au lieu d’utiliser une fonction).en particulier. // clear PORTA (make sure both displays are off) TRISA = 0. PORTD = digit1 . Tester le programme.1 . digit10 . Modules : − SW: mikroC v8 . Le comparer avec la version pr´ ec´ edente . Board : EasyPIC5 Oscillator : HS . comment est r´ ealis´ e le basculement ? 3. digit10 = mask( digit ). // designate PORTD pins as output do { for (i = 0. turn off 2nd // Turn off all 7seg displays // send mask for tens digit to PORTD // turn on 2nd 7 seg.2. // Timer0 settings TMR0 = 0. i++) { // count from 0 to 99 digit = i % 10u.INTE . digit1 = mask( digit ). INTCON = 0x20.h" unsigned short digit_no . } TMR0 = 0.

0x20 ). 5. } ¥ ´ 1.liaison one-wire 5. Glcd_Set_Font ( FontSystem5x8 . arg2 . Elle s’utilise comme suit (voir l’aide) : § ¤ ¦ sprinti (& chaine . 3. 1. // AN pins as digital Glcd_Init (& PORTB . 8.TP 5 Afficheur GLCD . arg1 . 5. } void main (){ my_glcd_init (). 2. 0.) ¥ 11 . 4.. La fonction sprinti est fr´ equemment utilis´ ee pour formatter un affichage. & PORTD ). format . Ecrire ”Hello world!” en noir sur fond blanc.. Glcd_Write_Text (" Hello world !".capteur de temp´ erature DS1820 . Pour cela consulter la documentation des fonctions Glcd_Fill et Glcd_Write dans l’aide int´ egr´ ee (QHelp ). // Sélection police de caractères Glcd_Fill (0 x00 ). 3.1 Affichage sur le GLCD § Tester le programme suivant : ¤ ¦ void my_glcd_init (){ ANSEL = ANSELH = 0. . Modifier le programme pour placer (approximativement) la phrase au milieu de l’´ ecran. 2. 1). 0. 0.

sprinti (text . En consultant la documentation de la librairie (QHelp.2. un seul fil est n´ ecessaire (mˆ eme si plusieurs p´ eriph´ eriques sont utilis´ es). val .5” ¤ § _____ text [10]. [taille] ´ etant le nombre de chiffres utilis´ es pour l’affichage et [type] ´ etant d pour des entiers sign´ es et u pour des entiers non-sign´ es. 0. Compl´ eter le programme suivant pour afficher ”t = 20.e. donner les caract´ eristiques principale du protocole one-wire. V´ erifier que le commutateur (switch ) J11 est plac´ e en position RE2.o` u chaine est une chaine de caract` eres (i. format est une chaine de caract` eres contenant des caract` eres ordinaires et des sp´ ecifications de format du type %0[taille][type]. 2. unsigned int dec = 5. un tableau de char) qui sera modifi´ ee. La fonction sprinti ne fonctionne qu’avec des int.2 Communication one-wire avec le capteur DS1820 Le capteur de temp´ erature DS1820 s’appuie sur le protocole one-wire pour communiquer sa mesure. 1). my_glcd_init (). ____ . Glcd_Write_Text (text . le d´ eplacer si n´ ecessaire. OneWire Library ). Comme son nom l’indique.1 Mise en place 1. La ligne DQ est ainsi connect´ ee ` a la broche 2 de PORTE. void main (){ unsigned int val = 20. 5. 0. dec ). } ¦ ¥ 5. 12 .

il faut suivre les ´ etapes suivantes : a) Envoi de la commande CONVERT_T au capteur (mesure de la temp´ erature) b) Envoi de la commande READ_SCRATCHPAD au capteur (placement de la temp´ erature dans le buffer du capteur) c) Lecture du buffer d) Affichage. // Envoi de la commande CONVERT_T Delay_us (120). ____ ). 0xBE ). Ow_Write (____ .5. 0xCC ). // Envoi de la commande READ_SCRATCHPAD // Step c) temp = Ow_Read (____ . 0xCC ). ____ . // attente mesure // Step b) Ow_Reset (____ . while (1) { // Step a) Ow_Reset (____ . } ¦ } ¥ Quel affichage obtenez-vous ? 13 . // Step d) // a écrire delay_ms (100). Ow_Write (____ . // on s’adresse à tous les périphériques one−wire Ow_Write (____ . my_glcd_init (). ____ ).2 Communication La librairie est compos´ ee de trois fonctions : Ow_reset(). ____ . § Compl´ eter le programme suivant (en vous aidant de la documentation) : ¤ void main (){ unsigned int temp. ____ . 0w_Write() et Ow_Read. ____ ). // on s’adresse à tous les périphériques one−wire Ow_Write (____ . ____ .2. Pour lire et afficher une temp´ erature. 0x44 ).

7. <<).%01u ( Celsius )". Quels bits contiennent la partie d´ ecimale de la temp´ erature ? 3. ¤ ¥ 8. Quels bits contiennent la partie enti` ere de la temp´ erature ? 2. On n´ egligera de g´ erer le signe.2.5. Cr´ eer deux variables temp_int et temp_dec d´ eclar´ ee en unsigned int destin´ ees ` a contenir respectivement la partie enti` ere et la partie d´ ecimale. Affecter ces deux variables avec les parties enti` ere et d´ ecimale. Que pensez-vous de la pr´ ecision de la mesure de temp´ erature ? 5. 1. 2.3 Suppl´ ement Au choix : 1. Corriger l’affichage en utilisant la fonction sprinti utilis´ ee comme suit : § ¦ sprinti (text . Vous pourrez utiliser des op´ erateurs de masque (&) et de d´ ecalage (>>. "t = %02u . 14 .3 D´ ecodage de la temp´ erature La mesure envoy´ ee par le capteur est cod´ ee comme indiqu´ e par l’extrait de la datasheet du DS1820 : Il est donc indispensable de la d´ ecoder avant de l’afficher. 6. Utiliser les fonctions de la librairie du GLCD pour r´ ealiser un affichage graphique de la temp´ erature en fonction du temps. temp_int . d´ etermin´ ee ` a partir de temp. 3 de la datasheet et le projet OneWire dans les examples ). temp_dec ). Lire en d´ etail la documentation du DS1820 pour r´ ealiser une lecture de temp´ erature avec une r´ esolution sup´ erieure ` a 9bits (voir p. Quelle est la pr´ ecision de la mesure ? 5. Quels bits contiennent le signe de la mesure ? 4.

mesure de temps et production de signaux p´ eriodiques 6.1 ´ ements de documentation El´ 15 .TP 6 Timer et interruption .

ANSELH = 0.6. TRISB = 0. INTCON = 0x20. } void main () { OPTION_REG = 0x84. 0. ANSEL = 0. INTCON = 0xA0. Que se passe-t-il ? 16 . TMR0 = 96. TMR0 = 96. clear T0IF // Assign prescaler to TMR0 // Configure AN pins as digital I/O // // // // // PORTB is output Initialize PORTB Timer0 initial value Enable TMRO interrupt Initialize cnt // Toggle PORTB LEDs // Reset cnt ¦ } ¥ 1.2 § Test de fonctionnement ¤ Saisir et tester le programme suivant : unsigned int cnt. PORTB = 0xFF. // Increment value of cnt on every interrupt // Set T0IE . cnt = 0. void interrupt () { cnt ++. while (1) if (cnt PORTB cnt = } } { == 400) { = ~ PORTB .

On souhaite maintenant connaitre la dur´ ee d’´ ex´ ecution de cette fonction en utilisant le timer TMR0. Ecrire un programme utilisant cette fonction pour afficher le r´ esultat (sur le GLCD) de la division par 10 du nombre 171. (c) ´ ecrire le programme. Modifier les bits du prescaler selon la table fournie pour allonger la p´ eriode de clignotement.890 ∗ / return Q. / ∗ Q = A ∗ 0. G´ en´ erer un signal de fr´ equence 1 KHz de rapport cyclique 1/4.2. } ¥ ´ 1. Expliciter la configuration des registres OPTION_REG et INTCON. 6.110011 ∗ / Q = ((Q >> 8) + Q) >> 3. avec l’algorithme suivant : (a) Initialisation du timer (b) Appel de la fonction (c) Lecture du timer (d) Calcul de la dur´ ee (en fonction de la fr´ equence d’horloge et du prescaler. 3. Pour cela : 2. ´ 2.3 § Mesure de dur´ ee d’´ ex´ ecution d’un morceau de code ¤ Voici une fontion que l’on souhaite tester : ¦ unsigned int div10 ( unsigned int A){ unsigned int Q. / ∗ Q = A ∗ 0.00011001100110011 ∗ / / ∗ either Q = A/10 or Q+1 = A/10 for all A < 534 . / ∗ Q = A ∗ 0. A quels endroits est-il possible de modifier le code pour allonger la p´ eriode de clignotement ? 4.11 ∗ / Q = ((Q >> 4) + Q) . 6. (b) calculer la valeur de comptage. / ∗ the quotient ∗ / Q = ((A >> 1) + A) >> 1.4 Production d’un signal p´ eriodique (a) calculer la valeur de pr´ e-division. 1. (e) Affichage de la dur´ ee mesur´ ee. G´ en´ erer un signal de fr´ equence 1 KHz sur PB0. 17 . Ecrire un programme qui mesure cette dur´ ee.

calculer les coordonn´ ees x_screen et y_screen correspondant ` a la position courante dans le GLCD. – un premier programme (` a terminer) d’interfa¸ cage : touchscreen1.TP 7 Interfa¸ cage d’un ´ ecran tactile L’objectif est d’interfacer l’´ ecran tactile pour commander l’allumage et l’extinction d’une LED.c 3.fr/fr/enseignements/geii-programmation-pic-en-c-easypic5-mikroc : – un article (en fran¸ cais) sur le fonctionnement et l’utilisation de l’´ ecran tactile .c dans un projet et compl´ eter le programme pour dans une boucle infinie. Expliquer alors le fonctionnement des fonctions GetX() et GetY() dans le programme touchscreen1. en particulier le paragraphe “principe de fonctionnement” et expliquer pourquoi seuls quatre fils sont n´ ecessaires pour interfacer l’´ ecran tactile. 18 . 2. Lire le document.c 1. afficher (sur le GLCD) les coordonn´ ees x et y acquises via les fonctions GetX() et GetY(). Placer le fichier touchscreen1.c – un second programme ` a tester (en fin de TP) : touchscreen2. A partir des coordonn´ ees x et y. Voici le sch´ ema d´ etaillant la connection de l’´ ecran au microcontrˆ oleur : Divers ressources sont r´ ecup´ erable ` a l’adresse http://pixel-shaker. – Quelles sont les valeurs min et max que peuvent prendre ces coordonn´ ees ? – Quelle est l’orientation des axes ? 4.

// Clear GLCD Glcd_Write_Text (" TOUCHPANEL EXAMPLE " .0).1).1). Ajouter alors le code n´ ecessaire dans la boucle infinie pour qu’une pression sur le “bouton 1” provoque l’extinction de la LED n ˚ 6 du PORTC.60 .16 .14 . Ajouter le code suivant en d´ ebut de la fonction main : § Glcd_Fill (0). Glcd_Box (10 .4 .0).c 19 .4 .58 .0).74 .74 . Glcd_Write_Text ("RC6 OFF" .16 . Glcd_Write_Text (" BUTTON2 " . ¤ ¦ ¥ V´ erifier que deux “boutons” sont dessin´ es.10 .3 .0 .46 . Glcd_Write_Text ("RC7 OFF" .18 .48 . et qu’un appui sur le “bouton 2” commande sont allumage. Glcd_Write_Text (" BUTTON1 " .120 .18 .1).1).3 .5.48 . // Display Buttons on GLCD: Glcd_Rectangle (8 .118 .0).14 .46 .1). T´ el´ echarger et tester le programme du fichier touchscreen2. Glcd_Rectangle (68 . 6. Glcd_Box (70 .

You're Reading a Free Preview

Download
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->