- Matériaux nécessaires:
- Que sont les interruptions et où les utiliser:
- Schéma de circuit et explication:
- Simulation des interruptions dans le microcontrôleur PIC:
- Explication du code:
- Fonctionnement des interruptions PIC16F877A:
Dans ce didacticiel, nous allons apprendre comment utiliser une interruption externe dans le microcontrôleur PIC et pourquoi / où nous en aurons besoin. Ceci fait partie de la séquence des tutoriels PIC dans lesquels nous avons commencé à apprendre les microcontrôleurs PIC à partir de zéro; par conséquent, ce didacticiel suppose que vous savez comment programmer un MCU PIC à l'aide de MPLABX et comment interfacer un écran LCD avec PIC. Sinon, veuillez revenir à leurs liens respectifs et les lire, car je vais sauter la plupart des informations qui y étaient déjà couvertes.
Matériaux nécessaires:
- Carte de performance PIC16F877A
- Écran LCD 16x2
- Bouton poussoir
- Connexion des fils
- Planche à pain
- PicKit 3
Que sont les interruptions et où les utiliser:
Avant d'entrer dans la programmation des interruptions du microcontrôleur PIC, comprenons ce qu'est réellement une interruption et où nous aurions besoin de les utiliser. De plus, il existe de nombreux types d'interruptions dans Microcontroller et PIC16F877A en a environ 15. Ne les confondons pas tous dans notre tête pour le moment.
Alors! qu'est-ce qu'une interruption dans les microcontrôleurs?
Comme nous le savons tous, les microcontrôleurs sont utilisés pour effectuer un ensemble d'activations prédéfinies (programmées) qui déclenchent les sorties nécessaires en fonction de l'entrée. Mais, pendant que votre microcontrôleur est occupé à exécuter un morceau de code, il peut y avoir une situation d'urgence où un autre morceau de votre code nécessite une attention immédiate. Cet autre morceau de code qui nécessite une attention immédiate doit être traité comme une interruption.
Par exemple: considérons que vous jouez à votre jeu préféré sur votre mobile et que le contrôleur (hypothèse) à l'intérieur de votre téléphone est occupé à lancer tous les graphiques nécessaires pour que vous puissiez profiter du jeu. Mais, soudain, votre petite amie appelle votre numéro. Maintenant, la pire chose qui puisse arriver est que votre contrôleur mobile néglige l'appel de votre petite amie puisque vous êtes occupé à jouer à un jeu. Pour empêcher ce cauchemar de se produire, nous utilisons quelque chose appelé interruptions.
Ces interruptions seront toujours une liste active pour que certaines actions particulières se produisent et lorsqu'elles se produisent, elles exécutent un morceau de code, puis reviennent à la fonction normale. Ce morceau de code est appelé la routine de service d'interruption (ISR). Un projet pratique dans lequel l'interruption est obligatoire est «Circuit de compteur de vitesse et d'odomètre numérique utilisant un microcontrôleur PIC»
Dans les microcontrôleurs, il existe deux principaux types d'interruptions. Ce sont l'interruption externe et l'interruption interne. Les interruptions internes se produisent à l'intérieur du microntrôleur pour effectuer une tâche, par exemple les interruptions de minuterie, les interruptions ADC, etc. Ces interruptions sont déclenchées par le logiciel pour terminer l'opération de minuterie ou l'opération ADC respectivement.
L'interruption externe est celle qui peut être déclenchée par l'utilisateur. Dans ce programme, nous allons apprendre à utiliser une interruption externe en utilisant un bouton poussoir pour déclencher une interruption. Nous utiliserons un écran LCD pour afficher les nombres incrémentés de 0 à 1000 et lorsqu'une interruption est déclenchée, nous devons en informer à partir de l' ISR de routine de service d'interruption, puis continuer à incrémenter les nombres.
Schéma de circuit et explication:
Le schéma de circuit pour l'utilisation des interruptions PIC16F877 est donné dans l'image ci-dessus. Vous devez simplement connecter l'écran LCD au PIC comme nous l'avons fait dans le tutoriel d'interfaçage LCD.
Maintenant, pour connecter la broche d'interruption, nous devrions regarder la fiche technique pour savoir quelle broche du PIC est utilisée pour l'interruption externe. Dans notre cas, dans PIC16F877A, la 33 ème broche RBO / INT est utilisée pour l'interruption externe. Vous ne pouvez utiliser aucune autre broche que cette broche. La connexion des broches pour ce schéma de circuit est indiquée dans le tableau ci-dessous.
S.Non: |
Code PIN |
Nom de la broche |
Connecté à |
1 |
21 |
RD2 |
RS de l'écran LCD |
2 |
22 |
RD3 |
E de l'écran LCD |
3 |
27 |
RD4 |
D4 de l'écran LCD |
4 |
28 |
RD5 |
D5 de l'écran LCD |
5 |
29 |
RD6 |
D6 de l'écran LCD |
6 |
30 |
RD7 |
D7 de l'écran LCD |
sept |
33 |
RBO / INT |
Bouton poussoir |
Nous avons activé des résistances de rappel internes sur le PORT B, nous pouvons donc connecter directement la broche RB0 à la terre via un bouton poussoir. Ainsi, chaque fois que cette broche devient BAS, une interruption sera déclenchée.
Les connexions peuvent être effectuées sur une planche à pain comme indiqué ci-dessous.
Si vous avez suivi nos tutoriels, vous devriez vous être familiarisé avec cette carte Perf que j'ai utilisée ici. Sinon, vous n'avez pas besoin d'y penser beaucoup, il vous suffit de suivre le schéma du circuit et vous obtiendrez le bon fonctionnement.
Simulation des interruptions dans le microcontrôleur PIC:
La simulation de ce projet est réalisée à l'aide de Proteus.
Lorsque vous simulez le projet, vous devriez voir une séquence de nombres incrémentée sur l'écran LCD. Cela se produit à l'intérieur de la boucle principale et chaque fois que le bouton-poussoir est enfoncé, l'écran LCD doit afficher qu'il est entré dans ISR. Vous pouvez apporter vos modifications au code et essayer de le tester ici.
Explication du code:
Le code complet de ce projet se trouve à la fin de ce tutoriel. Cependant, le programme est divisé en morceaux importants et expliqué ci-dessous pour votre meilleure compréhension.
Comme tous les programmes, nous devons commencer le code en définissant la configuration des broches pour les broches que nous utilisons dans notre programme. Ici aussi, nous devons définir que nous utilisons RB0 / INT comme broche d'interruption externe et non comme broche d'entrée ou de sortie. La ligne de code ci-dessous active la résistance de rappel interne sur le port B en faisant du 7ème bit la valeur 0.
OPTION_REG = 0b00000000;
Ensuite, nous activons les interruptions globales / périphériques et déclarons que nous utilisons RB0 comme broche d'interruption externe.
GIE = 1; // Activer l'interruption globale PEIE = 1; // Activer l'interruption périphérique INTE = 1; // Activer RB0 comme broche d'interruption externe
Une fois que la broche RB0 est définie comme une broche d'interruption externe, chaque fois qu'elle devient basse, l'indicateur d'interruption externe INTF deviendra 1 et le code à l'intérieur de la fonction d'interruption vide sera exécuté puisque le programme de service d'interruption (ISR) sera appelé.
void interruption ISR_example () {if (INTF == 1) // Interruption externe détectée {Lcd_Clear (); Lcd_Set_Cursor (1,1); Lcd_Print_String ("Entré ISR"); INTF = 0; // efface le drapeau d'interruption une fois terminé __delay_ms (2000); Lcd_Clear (); }}
Comme vous pouvez le voir, j'ai nommé la fonction d'interruption ISR_example. Vous pouvez le nommer selon votre souhait. Dans la fonction d'interruption, nous vérifierons si l'indicateur INTF est haut et effectuerons les actions nécessaires. Il est très important d' effacer l'indicateur d'interruption une fois que vous avez terminé la routine. Alors seulement, le programme retournera à la fonction principale d'annulation. Cette compensation doit être effectuée par un logiciel utilisant la ligne
INTF = 0; // efface le drapeau d'interruption après en avoir terminé avec lui
À l'intérieur de la fonction principale, nous incrémentons simplement un nombre toutes les 500 ms et l'afficherons sur l'écran LCD. Nous n'avons pas de ligne spécifique pour vérifier l'état de la broche RB0. L'interruption restera toujours active et chaque fois que le bouton-poussoir est enfoncé, elle sautera hors du vide principal et exécutera les lignes dans l'ISR.
Lcd_Set_Cursor (2,1); Lcd_Print_String ("Boucle principale intérieure"); Lcd_Set_Cursor (1,1); Lcd_Print_String ("Numéro:"); Lcd_Print_Char (ch1 + '0'); Lcd_Print_Char (ch2 + '0'); Lcd_Print_Char (ch3 + '0'); Lcd_Print_Char (ch4 + '0'); __delay_ms (500); nombre ++;
Fonctionnement des interruptions PIC16F877A:
Une fois que vous avez compris comment fonctionne l'interruption, vous pouvez l'essayer sur le matériel et le contourner. Ce programme donné ici est un exemple très basique d'interruption externe où il change simplement l'affichage de l'écran LCD lorsqu'une interruption est détectée.
Le fonctionnement complet du projet peut être trouvé dans la vidéo ci-dessous.J'espère que vous avez compris les interruptions et où / comment les utiliser. Si vous avez des doutes, vous pouvez me joindre via les forums ou via la section commentaires.