Arduino - Interruptions

Les interruptions arrêtent le travail actuel d'Arduino de sorte que d'autres travaux peuvent être effectués.

Supposons que vous soyez assis à la maison et que vous discutiez avec quelqu'un. Soudain, le téléphone sonne. Vous arrêtez de discuter et décrochez le téléphone pour parler à l'appelant. Lorsque vous avez terminé votre conversation téléphonique, vous recommencez à discuter avec la personne avant que le téléphone ne sonne.

De même, vous pouvez considérer la routine principale comme le fait de discuter avec quelqu'un, la sonnerie du téléphone vous oblige à arrêter de bavarder. La routine de service d'interruption est le processus de conversation téléphonique. Lorsque la conversation téléphonique se termine, vous revenez à votre routine principale de chat. Cet exemple explique exactement comment une interruption fait agir un processeur.

Le programme principal est en cours d'exécution et exécute certaines fonctions dans un circuit. Cependant, lorsqu'une interruption se produit, le programme principal s'arrête pendant qu'une autre routine est exécutée. Lorsque cette routine se termine, le processeur revient à la routine principale.

Caractéristiques importantes

Voici quelques caractéristiques importantes concernant les interruptions -

  • Les interruptions peuvent provenir de diverses sources. Dans ce cas, nous utilisons une interruption matérielle qui est déclenchée par un changement d'état sur l'une des broches numériques.

  • La plupart des conceptions Arduino ont deux interruptions matérielles (appelées «interruption0» et «interruption1») câblées aux broches d'E / S numériques 2 et 3, respectivement.

  • L'Arduino Mega dispose de six interruptions matérielles, y compris les interruptions supplémentaires («interruption2» à «interruption5») sur les broches 21, 20, 19 et 18.

  • Vous pouvez définir une routine à l'aide d'une fonction spéciale appelée «Routine de service d'interruption» (généralement appelée ISR).

  • Vous pouvez définir la routine et spécifier les conditions sur le front montant, le front descendant ou les deux. Dans ces conditions spécifiques, l'interruption serait desservie.

  • Il est possible d'exécuter cette fonction automatiquement, à chaque fois qu'un événement se produit sur une broche d'entrée.

Types d'interruptions

Il existe deux types d'interruptions -

  • Hardware Interrupts - Ils se produisent en réponse à un événement externe, tel qu'une broche d'interruption externe qui passe au niveau haut ou bas.

  • Software Interrupts- Ils surviennent en réponse à une instruction envoyée dans le logiciel. Le seul type d'interruption pris en charge par le «langage Arduino» est la fonction attachInterrupt ().

Utilisation des interruptions dans Arduino

Les interruptions sont très utiles dans les programmes Arduino car elles aident à résoudre les problèmes de synchronisation. Une bonne application d'une interruption consiste à lire un encodeur rotatif ou à observer une entrée utilisateur. En règle générale, un ISR doit être aussi court et rapide que possible. Si votre esquisse utilise plusieurs ISR, un seul peut être exécuté à la fois. D'autres interruptions seront exécutées après la fin de celle en cours dans un ordre qui dépend de la priorité qu'elles ont.

En règle générale, les variables globales sont utilisées pour transmettre des données entre un ISR et le programme principal. Pour vous assurer que les variables partagées entre un ISR et le programme principal sont correctement mises à jour, déclarez-les comme volatiles.

Syntaxe de l'instruction attachInterrupt

attachInterrupt(digitalPinToInterrupt(pin),ISR,mode);//recommended for arduino board
attachInterrupt(pin, ISR, mode) ; //recommended Arduino Due, Zero only
//argument pin: the pin number
//argument ISR: the ISR to call when the interrupt occurs; 
   //this function must take no parameters and return nothing. 
   //This function is sometimes referred to as an interrupt service routine.
//argument mode: defines when the interrupt should be triggered.

Les trois constantes suivantes sont prédéfinies comme valeurs valides -

  • LOW pour déclencher l'interruption chaque fois que la broche est basse.

  • CHANGE pour déclencher l'interruption chaque fois que la broche change de valeur.

  • FALLING chaque fois que la broche passe de haut en bas.

Example

int pin = 2; //define interrupt pin to 2
volatile int state = LOW; // To make sure variables shared between an ISR
//the main program are updated correctly,declare them as volatile.

void setup() {
   pinMode(13, OUTPUT); //set pin 13 as output
   attachInterrupt(digitalPinToInterrupt(pin), blink, CHANGE);
   //interrupt at pin 2 blink ISR when pin to change the value
} 
void loop() { 
   digitalWrite(13, state); //pin 13 equal the state value
} 

void blink() { 
   //ISR function
   state = !state; //toggle the state when the interrupt occurs
}