Informatique Industrielle : TP 6 – Microcontrôleur Interruption externe et Buzzer
Télécharger PDFObtenir le pack complet des cours, TDs, TPs et projets sur Informatique Industrielle : Microprocesseur & Microcontrôleur!
Vous souhaitez maîtriser les microprocesseurs et Microcontrôleurs ? Ne cherchez plus, nous avons le pack parfait pour vous.

Accédez à une collection complète des supports de cours, des travaux dirigés (TD) corrigés, des travaux pratiques (TP) et des projets.
Obtenir le pack maintenantTP6 Microcontrôleurs Page 1/5 TP 6 – Microcontrôleur Interruption externe et Buzzer
TAYARI LASSAAD MAITRE TECHNOLOGUE ISET GABESe-mail :
site web :
LEAII41 Année 2014/2015 TP6 Microcontrôleurs Page 2/5 1. Objectifs Produire des sons et mélodies simples grâce au buzzer intégré sur la carte EasyPic7. Mise en œuvre des interruptions externes INT0, INT1 et INT2 sur le portB. 2. Le Buzzer Comme le montre le schéma de câblage représenté ci-après, le Buzzer peut être connecté sur les broches RE1 ou RC2 du microcontrôleur : Repérez sur la carte le jumper J21 et le placer de telle sorte que le buzzer soit relié au port RE1, comme indiqué sur le schéma. Positionnez également le jumper J17 sur la position Vcc. Pour faire fonctionner le buzzer, vous utiliserez le module sound de la bibliothèque de MikroC. Seule 2 fonctions existent, une fonction Init et une fonction Play. Cette dernière permet seulement de renseigner la fréquence du son, mais pas son volume (rapport cyclique de la modulation PWM). 3. Interruptions sur le port B Le port B est un port 8 bits (RB
0 à RB7 ). Deux types d'interruptions sont attachés à ce port, les interruptions externes (external interruption) ou celles sur changement (Interruption On change ou IOC). Les broches RB
0 à RB
2 peuvent être configurées en interruptions externes tandis que les broches RB
4 à RB
7 peuvent l'être sur changement. RB
0 INT0RB 1 INT1 RB
2 INT2 RB
4 IOC0 RB
5 IOC1 RB
6 IOC2 RB
7 IOC3 External Interrupt Interrupt-on-change pins
TP6 Microcontrôleurs Page 3/5 Dès lors qu'une interruption sur changement aura été validée, elle se produira à la fois sur front montant et sur front descendant. Ce n'est pas le cas d'une interruption externe qui peut se déclencher soit sur front montant, soit sur front descendant. Il convient donc le spécifier (bit INTEDGx du registre INTCON2). D'autre part, les interruptions externes sont traitées individuellement tandis que les IOC sont gérées globalement. Cela signifie que lorsqu'une interruption de type IOC est générée, une routine commune d'interruption est lancée. Pour savoir quelle broche est responsable de l'interruption, il faudra rechercher l'information à l'intérieur de la routine. A part l'interruption INT0 qui est toujours prioritaire, toutes les autres peuvent être configurées en haute ou basse priorité. Les 3 registres qui nous intéressent ici sont les registres INTCON, INTCON2 et INTCON3. Contenu des registres INTCON, INTCON2 et INTCON3 -
INT0 bits INT0IE et INT0IF du registre INTCON, bit INTDG0 du registre INTCON2 - INT1 bits INT1IP, INT1IE et INT1IF du registre INTCON3, bit INTDG1 du registre INTCON2 -
INT2 bits INT2IP, INT2IE et INT2IF du registre INTCON3, bit INTDG2 du registre INTCON2 -
IOC0, IOC1, IOC2 et IOC3 bits RBIE et RBIF du registre INTCON, bit RBIP du registre INTCON2. Avec : IE = Interrupt Enable IP = Interrupt Priority IF = Interrupt Flag Et bien entendu, il faudra également configurer, comme pour toute interruption, les bits IPEN, GIE/GIEH et PEIE/GIEL... Le programme d’interruption sera placé en dehors du programme principal dans une routine appelée interrupt (en anglais Interrupt Service Routine ou ISR) : void interrupt()// Interrupt routine {
// coder ici les actions à effectuer
} Remarque : la fonction button de la librairie MikroC ne met pas en œuvre une interruption. Pour preuve, il faut scruter dans le programme principal la valeur du bit associé au bouton poussoir. Ce n’est pas le cas avec une interruption, elle se déclenchera automatiquement et lancera la procédure spécifiée dans la routine interrupt. TP6 Microcontrôleurs Page 4/5 4. Génération de notes (exo1.c) Dans cette partie, on vous propose de générer une série de notes afin d’accorder une guitare. L’accord d’une guitare peut être réalisé à l’aide d’un diapason qui émet un LA (440 Hz). Cette note correspond à la 5
ème corde d’une guitare jouée à vide. Pour accorder votre guitare, vous avez bien entendu besoin de générer les notes des 6 cordes (entre parenthèses après la note : l’octave) : 6
ème corde (RD5 ) : Mi (3) = 330 Hz 5
ème corde (RD4 ) : La (3) = 440 Hz 4
ème corde (RD3 ) : Ré (4) = 588 Hz 3
ème corde (RD2 ) : Sol (4) = 830 Hz 2
ème corde (RD1 ) : Si (4) = 988 Hz 1
ème corde (RD0 ) : Mi (5) = 1320 Hz Pour passer d’une note à l’autre, vous utiliserez 6 boutons poussoirs du port D, de RD
0 à RD5 . Ne pas oublier de valider les pull-down des broches 0 à 5 du port D.
Pour chaque note, vous écrirez une procédure séparée selon le modèle suivant : void Mi3() { Sound_Play(330, 1000); // Fréquence = 330Hz, durée = 1000 ms
} Dans le programme principal, vous ferez tourner une boucle infinie while(1) à l’intérieure de laquelle vous testerez quel bouton poussoir est actif (faire un test if). Selon le bouton, vous lancerez la procédure requise, par exemple : if (Button(&PORTD,5,1,1)) // RD5 joue le Mi(3) Mi3(); while (RD5_bit) ; // Attente tant que le bouton est appuyé Ne pas oublier d’initialiser correctement les ports (registres ANSELx, TRISx etc) ainsi que le buzzer : Sound_Init(&PORTE, 1); Après avoir testé le programme, réessayer en commentant les lignes « while RD(... ». 5. Composition de mélodies (exo2.c) Maintenant que vous savez produire des notes, vous allez pouvoir jouer 2 mélodies, composées l’une et l’autre de 3 sons différents. L’idée ici est de basculer d’une mélodie à l’autre en appuyant sur un bouton poussoir. Pour l’instant, vous utiliserez la fonction Button de la bibliothèque MikroC mais dans le prochain exercice, vous passerez par une interruption (INT0). Commençons par la première mélodie : Elle est composée de 3 tonalités à 659, 698 et 784 Hz. Créez 3 routines permettant de générer ces 3 sons pour une durée de 250 ms, vous les appellerez respectivement Tone1, Tone2 et Tone3. Recopiez ensuite la procédure suivante : void Melody1() {
// Joue la mélodie "Yellow house" Tone1(); Tone2(); Tone3(); Tone3(); Tone1(); Tone2(); Tone3(); Tone3(); Tone1(); Tone2(); Tone3(); Tone1(); Tone2(); Tone3(); Tone3(); TP6 Microcontrôleurs Page 5/5 Tone1(); Tone2(); Tone3(); Tone3(); Tone3(); Tone2(); Tone2(); Tone1();
} Seconde mélodie Elle est composée de 3 tonalités à 880, 1046 et 1318 Hz. Créez 3 routines permettant de générer ces 3 sons pour une durée de 50 ms, vous les appellerez respectivement ToneA, ToneC et ToneE. Recopiez ensuite la procédure suivante : void Melody2() { unsigned short i; for (i = 9; i > 0; i--) { ToneA(); ToneC(); ToneE();
} }
Dans le programme principal, vous ferez tourner une boucle infinie while(1) à l’intérieure de laquelle vous testerez l’état du bouton poussoir RD0 . S’il est activé, la mélodie doit changer (utilisez un paramètre qui vaudra 1 ou 2 selon la mélodie à jouer, n’oublier pas de le déclarer – format int – et de l’initialiser !). Si tout se passe bien, vous aurez remarqué que la mélodie ne bascule que si vous maintenez suffisamment longtemps votre doigt sur le bouton poussoir (en particulier s’agissant de la mélodie n°1). On comprend bien que la fonction Button ne génère pas une interruption, sinon une brève impulsion sur le bouton poussoir aurait dû la déclencher. 6. Composition de mélodies avec interruption (exo3.c) L’utilisation de la fonction Button et de l’utilisation du bouton poussoir sur le port D
0 n’est pas satisfaisante. Reprenez l’exercice précédent mais utiliser l’interruption INT0 (broche 0 du port B) pour basculer d’une mélodie à l’autre. Aidez vous du paragraphe 3. Déclarer ici in flag de type bit qui vaudra 0 ou 1 selon la mélodie (ce n'est pas une obligation, l'idée est de tester un autre type de variable). Que se passe-t-il maintenant lorsque vous appuyez brièvement sur le bouton poussoir? En quoi cette façon de procéder (i.e via une interruption) est-elle différente de la précédente? BON COURAGE