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 principal à l’endroit exact où il l’avait été laissé.Cet autre travail s’appelle le programme d’interruption.


Il est très important que le programme d’interruption ait 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 :

    • les interruptions matérielles : par exemple, une interruption liée au changement de la tension présente sur une broche numérique (appelée aussi interruption externe) ;
    • les interruptions logicielles  qui sont déclenchées par des instructions spéciales du processeur.


Exemple : Avec l'interruption matérielle, il est inutile de surveiller en permanence l'état d'une broche d'entrée sur laquelle vous avez raccordé un bouton poussoir. Lorsqu’un changement d'état est détecté, le programme d'interruption est exécutée. 


Pour l'ESP32, toutes les broches du GPIO peuvent être utilisées en interruption, à l'exception de GPIO 6 à GPIO 11.



 On peut choisir le mode de détection de l’interruption :

    • LOW : Déclenche l’interruption dès que le signal est à 0V
    • HIGH : Déclenche l’interruption dès que le signal est à 3.3V
    • RISING : Déclenche l’interruption sur front montant
    • FALLING : Déclenche l’interruption sur front descendant
    • CHANGE : Déclenche l’interruption dès que le signal change d'état de 0->-3.3V ou de 3.3V --> 0V




Exemple 1 de programme d'interruption avec l'ESP32


A chaque action sur le bouton poussoir (front montant), la LED change d'état même si le programme principal est occupé à une autre tâche.





ESP32  Micropython programme avec interruption sur front montant de la broche GPIO26


from machine import Pin
from time import *

led = Pin(25, Pin.OUT)
bp = Pin(26, Pin.IN)

# Le programme d'interruption
def fct_interruption(pin):
    print("Appui sur BP detecté")
    if led.value()==1:
        led.value(0)
    else:
        led.value(1)

# Spécifie la fonction à appeler lorsqu'une interruption externe survient
bp.irq(trigger = Pin.IRQ_RISING, handler = fct_interruption)

# Le programme principal
while True:
    sleep(5)
     


bp.irq(trigger=Pin.IRQ_RISING, handler = fct_interruption)

Spécifie la fonction à appeler lorsqu'une interruption externe survient.  La fonction fct_interruption   serra appelée chaque fois qu'un front montant est détecté sur le bouton poussoir bp (GPIO26)



Exemple 2 de programme d'interruption avec l'ESP32


Fonctionnement identique à l'exemple 1 mais avec un temps d’exécution le plus court possible dans la fonction fct_interruption




ESP32  Micropython programme avec interruption sur front montant de la broche GPIO26


from machine import Pin

impulsion = False
etat_led = False

led = Pin(25, Pin.OUT)
bp = Pin(26, Pin.IN)

# Le programme d'interruption 
def fct_interruption(pin):
    global impulsion
    impulsion = True

# Spécifie la fonction à appeler lorsqu'une interruption externe survient 
bp.irq(trigger = Pin.IRQ_RISING, handler = fct_interruption)

# Le programme principal 
while True:
    if impulsion:
        print("Appui sur BP detecte")
        if led.value()==1:
            led.value(0)
        else:
            led.value(1)
        impulsion = False
     



impulsion = True

La variable impulsion de type booléen passe à True quand on lance le programme d'interruption (fonction fct_interruption ) et repasse à False quand il est terminé.

Cette variable est utilisée dans le programme principal pour allumer ou éteindre la Led, afficher du texte sur la console. 

Cela permet d'avoir un temps d’exécution le plus court possible dans la fonction fct_interruption































Créé avec HelpNDoc Personal Edition: Générateur de documentation et EPub facile