Une interruption, comme son nom l’indique, consiste à interrompre momentanément le programme principal exécuté pour effectuer un autre travail.


Quand cet autre travail est terminé, on retourne à l’exécution du programme à l’endroit exact où il l’avait été laissé. Cet autre travail s’appelle le programme d’interruption ou ISR Interrupt Service Routine en anglais.


Il est très important que le programme d’interruption aie un temps d’exécution le plus court possible. On ne fera donc aucun calcul compliqué et aucun appel à des fonctions longues.


Il existe plusieurs sources d’interruption.  L’AVR 328 qui équipe l’Arduino Uno en comporte 26 au total comme :

    • des interruptions liées au changement de la tension présente sur une broche numérique qui sont donc ce que l’on appelle des interruptions externes ;
    • des interruptions liées au timers, des compteurs internes à l’Arduino qui permettent de compter le temps de manière précise.



Les interruptions externes INT0 et INT1


Pour accrocher une routine d’interruption à un état ou un changement d’état de l’une de ces broches on va utiliser la fonction :


attachInterrupt(numéro, ISR, mode);


Détail des arguments :

    • numéro est le numéro d’interruption concernée.
      • 0 ou 1 sur un Arduino Uno, ce qui correspond respectivement aux broches 2 et 3.
      • 0 à 5 sur un Arduino Mega ce qui correspond, dans l’ordre, aux broches 21, 20, 19, 18, 2 et 3.
    • ISR est la routine d’interruption qui sera appelée lorsque l’interruption surviendra. Cette routine d’interruption est une fonction qui ne renvoie rien et qui ne prend aucun argument, comme ceci : void maRoutine() { ... }.
    • mode indique ce qui va provoquer l’interruption :
      • LOW : l’interruption est déclenchée quand la broche concernée est LOW. Comme il s’agit d’un état et non d’un événement, l’interruption sera déclenchée tant que la broche est LOW. Par conséquent, dès que l’ISR aura terminé son exécution, elle la recommencera. Pendant ce temps, loop() ne sera pas exécuté.
      • CHANGE : l’interruption est déclenchée quand la broche concernée change d’état, c’est à dire passe de LOW à HIGH ou bien de HIGH à LOW. Il s’agit d’un événement.
      • RISING : l’interruption est déclenchée quand la broche concernée passe de LOW à HIGH. Il s’agit également d’un événement.
      • FALLING : l’interruption est déclenchée quand la broche concernée passe de HIGH à LOW. Il s’agit encore d’un événement.



Exemple de programme : comptage des impulsions d'un bouton poussoir relié à D2 malgré une tempo de 5s dans le programme principal


int boutonPin  = 2 ;

int ledPin = 3 ;

int compteur = 0 ;


//  Pour qu'on puisse changer la valeur d'une variable depuis une fonction de

//  gestion d'interruption, il faut que la variable soit déclaré "volatile"


volatile boolean changed = false;




void setup() { 

  Serial.begin (9600);

  pinMode(boutonPin, INPUT);

  pinMode(ledPin,OUTPUT);

  // Attacher notre fonction ISR, detection de front descendant (5v vers 0v)

  attachInterrupt(0, doContact, FALLING);

} 


void loop() {

  if ( changed ) {

    changed = false;

    Serial.print("Ha ! Action sur le BP ");

    Serial.print(compteur);

    Serial.println(" fois");

    // on allume la LED pendant 1 seconde

    digitalWrite(ledPin,HIGH);

    delay(1000);

    digitalWrite(ledPin,LOW);

    }

  delay(5000);

}



void doContact() {

  changed = true;

  compteur++;

}


 






























Créé avec HelpNDoc Personal Edition: Sites web iPhone faciles