Informatique Industrielle : TP 6 – Microcontrôleur Interruption externe et Buzzer
Télécharger PDFTP6 – Microcontrôleurs : Interruption externe et Buzzer
1. Objectifs
Produire des sons et mélodies simples grâce au buzzer intégré sur la carte EasyPic.
Mettre en œuvre les interruptions externes INT0, INT1 et INT2 sur le port B.
2. Le Buzzer
Le buzzer peut être connecté sur les broches RE1 ou RC2 du microcontrôleur.
Repérez sur la carte le jumper J21 et placez-le pour relier le buzzer au port RE1. Positionnez également le jumper J17 sur la position Vcc.
Pour le faire fonctionner, utilisez le module sound de la bibliothèque MikroC avec deux fonctions principales : Sound_Init et Sound_Play.
La fonction Sound_Play permet de définir la fréquence du son, mais pas son volume (le rapport cyclique de la modulation PWM).
3. Interruptions sur le port B
Le port B est un port 8 bits (RB0 à RB7). Deux types d’interruptions sont associés à ce port : les interruptions externes (INT0, INT1, INT2) et les interruptions sur changement d’état (IOC0 à IOC3).
Les broches RB0, RB1 et RB2 peuvent être configurées en interruptions externes, tandis que les broches RB4 à RB7 supportent les interruptions sur changement.
Les interruptions sur changement se déclenchent à la fois sur front montant et descendant, contrairement aux interruptions externes qui peuvent être configurées pour se déclencher sur front montant ou descendant (bit INTEDGx du registre INTCON2).
Les interruptions externes sont traitées individuellement, alors que les IOC sont gérées globalement via une routine commune. Pour identifier la broche responsable, vérifiez les bits dans la routine d’interruption.
À part INT0, toujours prioritaire, les autres interruptions peuvent être configurées en haute ou basse priorité. Les registres clés sont INTCON, INTCON2 et INTCON3.
4. Génération de notes (exo1.c)
Accordez une guitare en générant les notes des 6 cordes à l’aide d’un buzzer et de 6 boutons poussoirs (RD0 à RD5). Utilisez les fréquences suivantes :
- 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ère corde (RD0) : Mi (5) = 1320 Hz
Pour chaque note, créez une routine séparée selon le modèle :
void Mi3() {
Sound_Play(330, 1000); // Fréquence = 330 Hz, durée = 1000 ms
}
Dans le programme principal, utilisez une boucle while(1) pour tester l’état des boutons poussoirs et lancer la note correspondante.
Exemple :
if (Button(&PORTD,5,1,1)) // RD5 joue le Mi(3)
Mi3();
while (RD5_bit); // Attente tant que le bouton est appuyé
N’oubliez pas d’initialiser les ports (registres ANSELx, TRISx) et le buzzer :
Sound_Init(&PORTE, 1);
Testez le programme en décommentant les lignes while RD(...) pour observer le changement.
5. Composition de mélodies (exo2.c)
Jouez deux mélodies composées chacune de 3 sons différents, en basculant entre elles via un bouton poussoir.
Première mélodie
Tonalités : 659 Hz, 698 Hz et 784 Hz.
Créez 3 routines (Tone1, Tone2, Tone3) pour générer ces sons pendant 250 ms chacune.
void Melody1() {
// Joue la mélodie "Yellow house"
Tone1();
Tone2();
Tone3();
Tone3();
Tone1();
Tone2();
Tone3();
Tone3();
Tone1();
Tone2();
Tone3();
Tone1();
Tone2();
Tone3();
Tone3();
Tone1();
Tone2();
Tone3();
Tone3();
Tone3();
Tone2();
Tone2();
Tone1();
}
Seconde mélodie
Tonalités : 880 Hz, 1046 Hz et 1318 Hz.
Créez 3 routines (ToneA, ToneC, ToneE) pour générer ces sons pendant 50 ms chacune.
void Melody2() {
unsigned short i;
for (i = 9; i > 0; i--) {
ToneA();
ToneC();
ToneE();
}
}
Dans le programme principal, utilisez une boucle while(1) pour détecter l’état du bouton poussoir RD0. Si RD0 est activé, basculez entre les mélodies en utilisant un paramètre de type int (valeur 1 ou 2).
6. Composition de mélodies avec interruption (exo3.c)
Reprenez l’exercice précédent en utilisant l’interruption INT0 (broche RB0 du port B) pour basculer entre les mélodies.
Déclarez un flag de type bit (0 ou 1) pour alterner les mélodies.
Observez que le basculement se produit maintenant même avec une brève impulsion sur le bouton poussoir, contrairement à la méthode précédente utilisant Button.
FAQ
1. Pourquoi utiliser une interruption plutôt que la fonction Button pour basculer entre les mélodies ?
Une interruption permet de réagir instantanément à un changement d’état du bouton, sans nécessiter de boucle de scrutation dans le programme principal. Cela évite des retards et améliore la réactivité du système.
2. Comment configurer une interruption externe sur le port B ?
Il faut activer les bits INT0IE, INT1IE et INT2IE dans les registres INTCON et INTCON3, définir le front (montant ou descendant) via INTCON2, et activer le bit GIE pour autoriser les interruptions globales.
3. Comment vérifier quelle broche a déclenché une interruption IOC ?
Dans la routine d’interruption, vérifiez les bits du registre RBIF (dans INTCON) et utilisez les fonctions PORTB ou RBx_bit pour identifier la broche responsable.