Ordinateurs

Comment utiliser les interruptions dans les microcontrôleurs Pic et dsPic

L’auteur a terminé son projet d’ingénierie de dernière année avec les microcontrôleurs dsPic, acquérant ainsi une connaissance approfondie de ces dispositifs.

Les interruptions constituent l’épine dorsale de la méthodologie de codage dans les microcontrôleurs et leur pleine compréhension est essentielle pour les programmeurs désireux de créer des codes de niveau expert. Ce tutoriel donne toutes les informations essentielles dont les programmeurs Pic ont besoin pour commencer à utiliser les interruptions dans leurs codes et applications de microcontrôleur.

Les codes de microcontrôleur de la série dsPic30f ainsi que l’IDE de développement MplabX de Microchip sont utilisés pour démontrer ce didacticiel ici, mais la même méthodologie est applicable sur tous les microcontrôleurs Pic ainsi que sur les microcontrôleurs d’autres fabricants.

Il est conseillé aux utilisateurs de consulter les fiches techniques pertinentes pour connaître les noms exacts des registres et des bits.

Qu’est-ce qu’une interruption dans un microcontrôleur ?

L’interruption peut généralement être définie comme une fonction qui est déclenchée lors de l’apparition d’un événement prédéfini lié en dur dans un microcontrôleur et non au moyen d’un appel de fonction normal.

Cette fonction est généralement appelée une routine de service d’interruption.

Toutes les interruptions ont leur unicité :

  1. vecteur d’interruption.
  2. Événement lié en dur prédéfini.
  3. Bits d’activation d’interruption dans le registre d’activation d’interruption.
  4. Bits d’indicateur d’interruption dans le registre d’indicateur d’interruption.
  5. priorité d’interruption.
A lire aussi :  Variables de tableau croisé : Comment créer un tableau de contingence dans Microsoft Excel

Vecteur d’interruption

Toutes les interruptions sont définies par un vecteur d’interruption qui est unique à cette interruption uniquement.

Événement lié en dur

Le vecteur d’interruption est ensuite lié en dur à l’occurrence d’un événement prédéfini dans un micro contrôleur pour :

  • Réception de données dans le tampon de données UART.
  • Réception de données sur le bus CAN.
  • Comparez la correspondance des valeurs de registre PWM.
  • Achèvement de la conversion ADC.
  • Beaucoup plus selon le type, la famille et le modèle du microcontrôleur.

Un tableau donné à la fin de cet article répertorie quelques exemples de ces événements déclencheurs d’interruption liés en dur.

Bit d’activation d’interruption

Ce bit est utilisé pour activer l’interruption. Une interruption est activée si ce bit est mis à un et désactivée si ce bot est mis à zéro.

Bit d’indicateur d’interruption

Chaque fois qu’un événement lié à l’interruption se produit, le drapeau d’interruption est coché. Si l’interruption est 0, alors l’interruption se déclenche. Si l’indicateur d’interruption n’est pas défini sur zéro, l’interruption ne se déclenchera pas.

Faites défiler pour continuer

Priorité d’interruption

Lorsque plusieurs interruptions doivent être codées, il faut décider laquelle sera servie en premier si un événement déclencheur se produit pour les deux. Un bit de priorité d’interruption dans le registre de contrôle de priorité d’interruption spécifie la priorité de son interruption respective. L’interruption avec la priorité la plus élevée, c’est-à-dire six, est servie en premier.

Comment fonctionnent les interruptions dans les microcontrôleurs ?

Les interruptions se déclenchent lorsque l’un des événements auxquels elles sont liées en dur, par exemple ceux expliqués ci-dessus, se produit. Ils fonctionnent dans l’ordre suivant :

  1. L’événement lié à une interruption se produit.
  2. Le contrôleur prend connaissance de l’occurrence de cet événement et vérifie l’indicateur d’interruption.
  3. Si un événement déclencheur pour plus d’une interruption est reçu, la priorité d’interruption est vérifiée.
  4. Si le drapeau d’interruption est effacé, il est automatiquement défini et le compteur de programme se déplace vers le vecteur d’interruption respectif avec la priorité la plus élevée dans le code.
  5. Le code dans la fonction d’interruption respective commence à s’exécuter à partir du dessous du vecteur d’interruption.
  6. Une fois l’exécution de la routine de service d’interruption terminée, un indicateur d’interruption est effacé lors de la sortie de la routine.
  7. Le programme du microcontrôleur reprend à partir du même endroit d’où il a sauté pour entrer dans la routine de service d’interruption.
  8. L’interruption s’exécute à nouveau si l’événement se reproduit.
A lire aussi :  Comment devenir un Data Scientist en 5 étapes (même sans expérience de codage)

Procédure générale et code pour appeler une interruption

Une interruption peut être initialisée en suivant ces étapes :

1) Définissez le bit d’activation d’interruption

Le bit d’activation d’interruption pour l’interruption respective doit d’abord être activé à partir du registre d’activation d’interruption afin que l’interruption soit activée et que l’occurrence de l’événement lié en dur respectif soit activée pour déclencher l’interruption.

2) Définir le bit de priorité d’interruption

Si plusieurs interruptions doivent être utilisées dans un code, des priorités peuvent leur être attribuées en fonction de leur importance dans l’application à l’aide des bits de priorité d’interruption dans le registre de contrôle de priorité d’interruption.

void Interrupt_Init( void )
{
    IEC2bits.PWMIE = 1;
    IPC2bits.PWMIP = 1;  
}

//This function enables the PWM Interrupt enable bit in the Interrupt Enable Control 2 register.
//This function may be called in the main body before while(1) loop by way of normal function call.
// It is better to use an interrupt initialization function if multiple interrupts are to be enabled.
// However it is not necessary to use this function as the command may also be directly written in the main function.
// Interrupt priority is set to 1 (lowest).

3) Choisissez le vecteur d’interruption respectif

Choisissez le vecteur d’interruption respectif et placez-le dans l’en-tête de la fonction d’interruption ou interrompre la routine de service. Le code ci-dessous montre comment créer une routine de service d’interruption à partir du vecteur d’interruption.

Une liste de vecteurs d’interruption est également donnée dans cet article pour référence.

void __attribute__((interrupt, auto_psv)) _PWMInterrupt( void )               
{
    //your code here
    IFS2bits.PWMIF = 0;
}

// The tag "_PWMInterrupt" is the distinctive interrupt vector in this function.
// Replacing this with another interrupt vector will also change the type of interrupt.

4) Coder l’opération souhaitée

L’opération souhaitée peut être codée dans la fonction d’interruption.

A lire aussi :  Une introduction à la domotique Insteon

5) Effacer le drapeau d’interruption lors de la sortie de la fonction

Lors de la sortie de l’interruption, le drapeau d’interruption respectif doit être effacé afin que l’interruption puisse être déclenchée à nouveau.

Types d’interruptions

Il peut y avoir jusqu’à 50 types d’interruptions dans les microcontrôleurs, allant des interruptions I2C, des interruptions SPI, des interruptions d’encodeur en quadrature et des interruptions de minuterie selon le type, la famille et le modèle.

Certaines des interruptions trouvées dans les microcontrôleurs pic sont données dans le tableau ci-dessous pour améliorer la compréhension.

Tableau de référence pour les vecteurs d’interruption et les événements déclencheurs d’interruption.

Interrupt NameInterrupt VectorTrigger Stimulus

Interruption PWM

_PWMInterrupt

PWM compare la correspondance entre le registre de base de temps et le registre de comptage.

Interruption ADC

_ADCInterrupt

Conversion ADC terminée

Interruption de réception UART

_U2RXInterrupt

Réception de données dans le registre de réception UART

Interruption de transmission UART

_U2TXInterrupt

Chargement des données dans le registre de transmission UART

Interruption de défaut

_FLTAInterrupt

Changement de niveau logique sur la broche FLT

Interruption externe

_INT3Interruption

Changement de niveau logique sur les broches Int0/1

Interruption basse tension

_LVDInterrupt

Détection de basse tension

Cet article est exact et fidèle au meilleur de la connaissance de l’auteur. Le contenu est uniquement à des fins d’information ou de divertissement et ne remplace pas un conseil personnel ou un conseil professionnel en matière commerciale, financière, juridique ou technique.

© 2018 StormsHalted

Bouton retour en haut de la page