Quelles sont les interruptions?
Imaginez que vous cuisinez, vous avez placé de l’eau à ébullition et que vous liquéfez tout besoin et touchez soudainement la cloche de votre maison, vous interrompons, votre fonction à ce moment-là sera d’ouvrir la porte, d’assister à la personne et de fermer la porte, lorsque vous avez fini, revenez à cuisiner, mais ne revenez pas à Commencer, mais vous continuez à cuisiner à partir de l’endroit où vous avez séjourné.
Une interruption est activée, le microcontrôleur cessera de faire ce qu’il fait pour effectuer la fonction d’interruption précédemment déclarée, puis revenait là où elle avait été GAUCHE.
Une interruption peut être considérée comme un avertissement pouvant être activé à la fois par un processus spécifique du microcontrôleur (fin de conversion de l’ADC, réception des données du module EUSART, Evorde de minuterie, etc.) ou par un changement externe à celui-ci (changement dans certains Port spécifique, changement d’une broche, etc.).
Pic C compiler interrupteurs
sur l’onglet Affichage du compilateur PIC C Nous pouvons trouver une boîte qui dit « interruptions », En elle aura l’information des interruptions que notre microcontrôleur raconte. Par exemple, pour le cas de Miuva (PIC 18F4550), nous trouverons la liste suivante:
- AD: Conversion complète ADC
- BUSCOL: Collision de bus
- CCP1: capture ou comparaison dans l’unité 1
- CCP2: capture ou comparaison dans l’unité 2
- Comp: comparaison Evénement
- EEPROM: Ecriture complète
- EXT: interruption externe (RB0)
- EXT1: interruption externe (RB1)
- ext2: interruption externe (RB2)
- Lowvolt: basse tension Détecté
- oscf: échec dans le système d’oscillateur
- RB: modifications du port B (RB4: RB7)
- RDA: données reçues disponibles RS232
- RTCC: Overflow Timer0 (RTCC)
- SPP: port de retransmission parallèle écrit / lecture
- SSP: SPI / I2C Activité
- Tbe: tampon de transmission vide RS232
- Timer0: Timer0 Overflow
- Timer1: Flip de la minuterie1
- Timer2: Timer2 Overflow
- Timer3: Evorde de minuterie 3
- USB: Activité USB
La manière d’activer les interruptions est très similaire dans tous les cas, nous devons « avertir » le compilateur que la fonction à décrire sera Interruption et ajoutez ensuite la fonction comme si c’était une autre. Comme suit:
Le « xxxx » doit être remplacé par le nom de l’interruption à utiliser (nous pouvons le trouver dans la section de la vue – > interruptions), par exemple, pour activer la fonction d’interruption externe (RB0), nous devrons remplacer « ext ». Suivant comme suit:
#int_EXTvoid ext_isr(){ //Función de interrupción externa (RB0) }}
Dans notre fonction principale, nous devons activer les interruptions avec les lignes suivantes:
enable_interrupts(GLOBAL); //Habilita interrupcionesenable_interrupts(int_XXXX); //Habilita interrupción deseada
suite au cas d’interruption externe:
enable_interrupts(GLOBAL); //Habilita interrupcionesenable_interrupts(int_EXT); //Habilita interrupción externa (RB0)
Par exemple, le code suivant, dans sa fonction principale augmentera un 16- Compteur de bit et montrant sa valeur dans l’écran LCD, mais au moment de l’activation de l’interruption externe (RB0), elle investira la valeur d’une LED située sur la broche E0. Après avoir inversé la valeur du voyant reviendra au programme principal et continuera à compter sur le numéro dans lequel il était.
#include <18f4550.h> // la librería del PIC#Fuses HSPLL, NOWDT, NOPROTECT, NOLVP, NODEBUG, USBDIV, PLL2, CPUDIV1, VREGEN#use delay (clock=48M) //Seleccionamos la frecuencia de reloj de 48MHz#use standard_io(b)#use standard_io(e)#include "MLCD.c"int16 contador = 0; #int_EXTvoid ext_isr(){ output_toggle(PIN_E0);}void main(){ lcd_init(); set_tris_b(0xFF); //Puerto b como entrada set_tris_e(0x00); //Puerto e como salida output_e(0x07); //Apaga led rgb enable_interrupts(GLOBAL); //Habilita interrupciones enable_interrupts(int_EXT); //Habilita interrupcion externa while(true){ contador++; printf(lcd_putc, "Cont = %5lu", contador); }}
Pour plus d’informations à quelle heure activate chacune des interruptions différentes, il est important de lire la fiche technique.
Niveaux d’interruption
À de nombreuses occasions, nos programmes doivent effectuer plusieurs tâches et certains peuvent être plus importants que d’autres, que est pourquoi, lorsque nous travaillons avec des interruptions, nous pouvons déclarer différentes priorités pour eux, plus leur priorité la plus importante est la tâche à faire, puis si une interruption de priorité élevée est activée, quel que soit notre programme (même si elle réalise Une autre fonction d’interruption de priorité faible) va passer à la fonction correspondante, puis revenir à l’endroit où elle était.
Pour activer les niveaux de priorité dans le compilateur PIC C, il est nécessaire d’ajouter la ligne suivante au début de notre code:
#device HIGH_INTS=TRUE //Activamos niveles de prioridad
ultérieurement Il est nécessaire de spécifier laquelle des interruptions que nous voudrons configurer comme une priorité élevée, nous devrons ajouter « HIGH » après avoir déclaré que vous utiliserez une fonction d’interruption, comme suit:
#int_EXT1 HIGHvoid ext_isr(){ //Función de interrupción de alta prioridad }}
Dans le code d’échantillon suivant, nous définirons deux interruptions, à la fois externes, une activée par la broche RB1 et l’autre par la broche RB2, car elles sont en fonction de la fiche de données du microcontrôleur, les deux peuvent être configurés à la fois élevée et faible priorité. Notre code va avoir trois comptables indépendants, l’un sera augmenté dans la fonction principale, une autre lorsqu’une interruption de priorité faible est activée et que l’interruption de priorité élevée est activée. Cela servira à que l’utilisateur corrobore le fonctionnement de la Niveaux, car la valeur des 3 compteurs sera affichée dans l’écran LCD.
Lorsque des interruptions ne sont pas activées, la valeur de, si l’interruption de priorité faible est activée (RB2) cessera d’augmenter la valeur de la valeur de la valeur Compteur principal et augmentera la valeur du compteur de fonction à faible priorité jusqu’à atteindre 10000 ou jusqu’à ce que l’interruption de priorité élevée soit activée qui démarrera votre propre comptoir jusqu’à ce qu’il atteigne 10000.
On peut noter qu’il ne reste plus rien Cela peut interrompre la fonction de priorité élevée, il ne sera possible que de laisser cette fonction jusqu’à ce que le compteur atteigne la valeur définie (10000). Contrairement à la fonction de priorité basse qui peut être en pause par haut. Et contrairement à la fonction principale qui peut être pause par une priorité faible ou élevée.