arduino
Les interruptions
Recherche…
Syntaxe
digitalPinToInterrupt (broche); // convertit un identifiant de broche en identifiant d'interruption, à utiliser avec
attachInterrupt()
etdetachInterrupt()
.attachInterrupt (digitalPinToInterrupt (pin), ISR, mode); // conseillé
attachInterrupt (interruption, ISR, mode); // non recommandé
detachInterrupt (digitalPinToInterrupt (pin));
detachInterrupt (interruption);
noInterrupts (); // désactive les interruptions
interruptions (); // réactiver les interruptions après l'
noInterrupts()
denoInterrupts()
.
Paramètres
Paramètre | Remarques |
---|---|
interrompre | Identifiant de l'interruption. Ne pas être confondu avec le numéro d'identification. |
ISR | Routine de service d'interruption. C'est la méthode qui sera exécutée lorsque l'interruption se produira. |
mode | Qu'est-ce qui devrait déclencher l'interruption? Un de bas, changer, se lever ou tomber. Les commissions sont également autorisées. |
Remarques
Les routines de service d'interruption (ISR) doivent être aussi courtes que possible, car elles mettent en pause l'exécution du programme principal et peuvent donc vider le code en fonction du temps. Généralement, cela signifie que dans l'ISR, vous définissez un drapeau et sortez, et dans la boucle du programme principal, vous vérifiez le drapeau et faites ce que ce drapeau est censé faire.
Vous ne pouvez pas utiliser delay()
ou millis()
dans un ISR car ces méthodes elles-mêmes reposent sur des interruptions.
Interruption sur le bouton presse
Cet exemple utilise un bouton-poussoir (commutateur tactile) connecté à la broche numérique 2 et à la masse, en utilisant une résistance de rappel interne pour que la broche 2 soit haute lorsque le bouton n'est pas enfoncé.
const int LED_PIN = 13;
const int INTERRUPT_PIN = 2;
volatile bool ledState = LOW;
void setup() {
pinMode(LED_PIN, OUTPUT);
pinMode(INTERRUPT_PIN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN), myISR, FALLING); // trigger when button pressed, but not when released.
}
void loop() {
digitalWrite(LED_PIN, ledState);
}
void myISR() {
ledState = !ledState;
// note: LOW == false == 0, HIGH == true == 1, so inverting the boolean is the same as switching between LOW and HIGH.
}
Un exemple avec cet exemple simple est que les boutons-poussoirs ont tendance à rebondir, ce qui signifie que le circuit s’ouvre et se ferme plus d’une fois avant de s’établir dans l’état final fermé ou ouvert. Cet exemple ne prend pas cela en compte. Par conséquent, il suffit parfois d'appuyer sur le bouton pour basculer le voyant plusieurs fois, au lieu d'une fois.