attachInterrupt() / Interruptions avec Arduino.

Une interruption, en langage de programmation, est un signal qui stoppe l’activité du processeur afin d’exécuter une fonction différente. L’interruption peut commencer due à un signal externe, notamment appuyer sur un bouton; ou interne, tel qu’ un temporisateur ou un signal de software. Une fois l’interruption activée, elle pause le processeur et réalise une nouvelle fonction, connue comme routine d’interruption du service (ISR, en anglais). Dès que l’ ISR est achevé, le programme reprend l’activité qu’il était en train de réaliser avant l’interruption.

Syntaxe

attachInterrupt(pin, ISR, mode)

On peut voir trois paramètres reliés à cette fonction:

  • Pin -> indique le pin que nous allons utiliser comme interruption. Arduino Uno présente deux pins pour cela, le 2 et le 3. Si on va utiliser le pin 2, on doit configurer 0 et si nous allons utiliser le pin 3, on configurera 1. En plus si nous voulons indiquer le nombre du pin directement, on doit utiliser la fonction digitalPinToInterrupt(pin). Cette dernière fonction nous renvoie, par elle même, le nombre du pin.
CarteINT
0
INT
1
INT
2
INT
3
INT
4
INT
5
UNO23
Nano23
Mini pro23
Mega2321201918
DUE
Leonardo32017
  • ISR -> c’est la fonction à laquelle nous appelons quand on fait une interruption. Cette fonction n’admet pas de paramètres ni renvoie de valeurs. IMPORTANT: pour pouvoir modifier une variable externe à cette fonction, on doit la configurer ou déclarer comme volatile. Cela indique que la variable doit être révisée toujours avant de l’utiliser, puisque elle peut avoir été modifiée autrement que par le flux normal du programme.
  • Mode -> sert à définir la forme de la fonction ISR, quand est-ce que se produira l’interruption:
    • LOW -> l’ISR s’exécute quand la valeur du pin est 0.
    • CHANGE -> s’exécute quand le pin change de valeur: de 0 à 1 ou de 1 à 0.
    • RISING -> s’exécuter quand la valeur du pin change de 0 à 1.
    • FALLING -> s’exécute quand la valeur du pin change de 1 à 0.
    • HIGH -> (seulement pour DUE) s’exécute quand le pin est 1.

Exemple

Avec le code suivant nous allons programmer un conteur d’interruptions. À chaque interruption on actualisera la valeur du conteur y on la montrera à travers du moniteur série.

Schéma:

Schéma des connexions pour créer un code avec la fonction attachInterrupt()
Connexion

Code:

int interruption = 0;
volatile int numInterrupt = 0;

void setup() {
  Serial.begin(9600);  
  attachInterrupt(interruption, fonctionInterruption, FALLING);
}

void loop() {
  while(true){
      Serial.print(".");
      delay(250);
  }  
}

void fonctionInterruption() {
  Serial.print("Interruption numéro ");
  Serial.println(numInterrupt);
  numInterrupt++;
}

Activant le moniteur série, chaque fois que nous appuierons sur le bouton le code contera une interruption.

Le moniteur série comptabilise les interruptions chaque fois qu'on appuie sur le bouton.
Le moniteur série comptabilise les interruptions chaque fois qu’on appuie sur le bouton.