Les interruptions sur Arduino

Introduction
Les interruptions (interrupts en anglais) sont extrêmement utiles mais aussi l'un des éléments du microprocesseur le plus craint.
Les interruptions vous permettent de faire fonctionner votre programme normalement alors que ce dernier reste capable de répondre à des événements asynchrones (impromptus) en provenance du monde extérieur.

Sur de nombreuses plateformes, l'implémentation des interruptions peut paraître assez confuse mais sur Arduino c'est tâche est vraiment simple!

Interruption et déparasitage matériel
Cet article se focalise sur le traitement logiciel des interruptions.
Par contre l'utilisation des interruptions nécessite impérativement l'utilisation d'une entrée déparasitée matériellement (ex: bouton poussoir déparasité matériellement).
Pour plus d'information à ce sujet, reportez vous à l'article "Boutons, contacts et déparasitage matériel".

 
Notes:
  • Si l'entrée n'est pas déparasité matériellement l'interruption sera appelée plusieurs fois (une fois par parasite).
  • Il n'est pas possible de déparasiter l'entrée de façon logicielle parce qu'il est interdit d'utiliser l'instruction delay() dans une interruption.
Circuit de déparasitage matériel:
Plus d'information sur ce circuit dans
l'article "Boutons, contacts et déparasitage matériel"

Une métaphore pour comprendre les interruptions
Une interruption peut-être considérée comme un signal d'alerte qu'il faut traiter immédiatement quelque soit la tâche en cours d'exécution.
C'est exactement ce que vous faites lorsque vous travaillez et que le signal d'incendie retenti.
S'en suit alors une période d'analyse (prise en charge par l'interruption elle même... en fait, vous avez déjà interrompu votre tâche):
  • J'arrête la machine
  • Y a t'il le feux ou pas?
L'analyse débouche sur un traitement adéquat:
  1. C'est un test d'alarme DONC je retourne travailler.
  2. C'est encore Jo qui joue avec l'alarme DONC j'en prends note (c'est la 4ieme fois ce mois-ci, à la 5ième je le licencie) et je retourne travailler.
  3. Il y a vraiment le feu DONC je quitte les lieux.
Notez les points suivants:
  • Le point 2 ci-dessus démontre clairement qu'une interruption peut servir a compter un évènement. Elles sont d'ailleurs souvent utilisées à cette fin.
  • Une interruption peut prendre une action de protection immédiate (dans notre exemple il s'agit de l'arrêt de la machinerie avant une quelconque phase d'analyse).
Principe de mise en place d'une interruption 
Pour résumé la programmation des interruptions sur Arduino:
  1. On demande à Arduino d'écouter une broche d'interruption.
    Il y en a deux broches configurable comme interruption, une sur la Pin 2 (int 0) ou la Pin 3 (int 1).
  2. Le programme Arduino associe la pin d'interruption avec une fonction de traitement.
  3. Lorsque qu'un signal arrive sur la pin d'interruption, Arduino interrompt le programme exécuté et appelle la fonction de traitement de l'interruption.
  4. Quand la fonction de traitement de l''interruption est terminée, Arduino reprend et poursuit l'exécution du programme.
Les 4 types de déclencheurs d'interruption
Comme précisé juste avant, on demande à Arduino d'écouter une des broches d'interruption pour déclencher l'appel à une fonction de traitement d'interruption.
Ce qu'il faut savoir c'est qu'il existe quatre modes/types de déclenchement d'interruption.
Le mode de déclenchement indique précisément à Arduino quelle variation de signal doit être détectée sur la broche d'interruption.
La fonction de traitement ne sera appelée que lorsque la variation demandée est détectée sur la broche d'interruption.

Les graphes suivants présentes les différents modes d'interruptions en représentant, dans le temps, l'évolution de la tension sur la broche d'interruption ainsi que la réponse d'Arduino.
Dans les graphiques suivant, la flèche bleue indique le déclenchement de l'interruption.
Flèche indiquant
l'appel de la fonction
de traitement
d'interruption.








Rising
L'un des deux modes les plus utilisés. Rising indique que la fonction d'interruption est appelée à chaque fois que le signal passe de BAS vers HAUT (LOW to HIGH).
Déclenchement d'interruption en mode Rising


Falling
Le deuxième mode le plus utilisé. Falling indique que la fonction d'interruption est appelée à chaque fois que le signal passe de HAUT vers BAS (HIGH to LOW). Falling est forcement le complément de Rising.
Déclenchement d'interruption en mode Falling



Change
Combine le mode Rising et Falling. En conséquence, la fonction d'interruption est appelée à chaque fois que le signal change (de Haut vers Bas ou de Bas vers Haut).
Déclenchement d'interruption en mode change


Low
Ce mode est probablement le moins utilisé car il représente peu d'intérêt.
Dans le cas du mode LOW, la fonction d'interruption est appelée cycliquement aussi longtemps que le signal d'interruption est bas (LOW).
Déclenchement d'interruption en mode LOW

 
Les broches d'interruptions
Il existe deux broches d'interruption sur Arduino:
  • Int 0 sur la Pin 2
  • Int 1 sur la Pin 3
Coder une interruption
Pour illustrer l'utilisation des interruptions, l'exemple suivant utilise un LED raccordée sur la pin 11.
Cette LED est commandée en PWM et sa luminosité dépend de la valeur de la variable valeur.
La variable valeur est incrémentée de 15 à chaque fois que l'on presse le bouton poussoir raccordé sur la pin 2 (pour l'interruption 0).
Le bouton poussoir est raccordé à l'aide du schéma présenté en haut de l'article (cfr déparasitage matériel). 

Dans le cadre de cet exemple, presser le bouton poussoir (et le relâcher) déclenche l'interruption matérielle int 0.
Chaque traitement de l'interruption incrémente la valeur de la variable valeur.
Enfin, le seul job de la boucle principale (fonction loop) est d'appliquer la valeur PWM sur la sortie de la LED (soit la valeur de la variable valeur).

En conséquence, la Led s'illumine un peu plus à chaque pression du bouton.

Source: InterruptDemo.pde

//  Démonstration d'usage d'une interruption sur Arduino.
//  
//
//  Auteur: Meurisse D.
//             http://arduino103.blogspot.com
//             http://www.MCHobby.be
//
//  Voir Article:
//     Les interruptions sur Arduino
//     http://arduino103.blogspot.com/2012/02/les-interruptions-sur-arduino.html
//
//  Déparasitage matériel:
//     Boutons, contacts et déparasitage matériel 
//     http://arduino103.blogspot.com/2011/12/boutons-contacts-et-deparatisage.html
//
//  License: CC-BY-SA
//
int buttonInt = 0; //  Interruption 0 (Arduino Pin 2) avec déparasitage matériel
int ledPin = 11;   // LED en PWM sur pin 11

// "valeur" contient la valeur PWM appliquée à la LED.
// ABSOLUMENT LIRE LA NOTE SUR LES VARIABLES VOLATILES 
// dans l'article
volatile int valeur = 0; 

void setup() {
  pinMode( ledPin, OUTPUT );
  
  // Attacher l'interruption
  attachInterrupt( buttonInt, FaireIncrement, RISING );
}

void FaireIncrement() {
  valeur = valeur + 15;
  if( valeur > 255 ) {
     valeur = 0;
  }
}

void loop() {
  analogWrite( ledPin, valeur );
  delay( 100 );
}

Les variables volatiles
Dans cet exemple, l'usage du mot clé est essentiel.
En effet, il informe le compilateur que la variable valeur est susceptible de changer à n'importe quel moment de l'exécution.
En conséquence, le compilateur n'optimise pas le programme autour de la variable.
Par exemple, l'une des optimisations possibles du compilateur se trouve dans la fonction loop(). Comme de toute évidence rien ne vient changer la valeur de valeur dans loop(), le compilateur pourrait optimiser le code et changer la variable valeur par sa valeur apparemment fixe (c'est-à-dire 0).
Hors, nous savons que la fonction "FaireIncrement" peut changer cette valeur par l'intermédiaire de l'activation de l'interruption. Nous, nous le savons... mais pas le compilateur!
C'est la raison d'être du mot clé volatile. Il informe le compilateur d'une telle éventualité.
Du coup, le compilateur ne fait plus d'optimisation pour la variable et va relire sa valeur à chaque fois. Cela coûte du temps machine et ralenti sensiblement l'exécution du programme... donc, ne pas abuser de volatile.

Ressources:
Vous pouvez trouver plein d'informatino sur les techniques de déparasitages sur http://www.ganssle.com/debouncing.htm


Aucun commentaire