attachInterrupt()

Description :

Broches numériques avec interruptions

Le premier paramètre à attachInterrupt() est un numéro d’interruption. Normalement, vous devez utiliser digitalPinToInterrupt(pin) pour traduire la broche numérique réelle en numéro d’interruption spécifique. Par exemple, si vous vous connectez à la broche 3, utilisez digitalPinToInterrupt(3) comme premier paramètre à attachInterrupt() .

 

BOARD DIGITAL PINS USABLE FOR INTERRUPTS

Uno, Nano, Mini, other 328-based

2, 3

Uno WiFi Rev.2, Nano Every

all digital pins

Mega, Mega2560, MegaADK

2, 3, 18, 19, 20, 21 (pins 20 & 21 ne sont pas disponibles pour les interruptions alors qu’ils sont utilisés pour la communication I2C)

Micro, Leonardo, other 32u4-based

0, 1, 2, 3, 7

Zero

all digital pins, except 4

MKR Family boards

0, 1, 4, 5, 6, 7, 8, 9, A1, A2

Nano 33 IoT

2, 3, 9, 10, 11, 13, A1, A5, A7

Nano 33 BLE, Nano 33 BLE Sense

all pins

Due

all digital pins

101

all digital pins (Only pins 2, 5, 7, 8, 10, 11, 12, 13 work with CHANGE)

 

Remarques et avertissements :

Remarque
À l’intérieur de la fonction jointe, delay() cela ne fonctionnera pas et la valeur renvoyée par millis() ne sera pas incrémentée. Les données série reçues pendant la fonction peuvent être perdues. Vous devez déclarer volatile toutes les variables que vous modifiez dans la fonction jointe. Voir la section sur les ISR ci-dessous pour plus d’informations.

Utilisation des interruptions :

Les interruptions sont utiles pour faire en sorte que les choses se produisent automatiquement dans les programmes de microcontrôleur et peuvent aider à résoudre les problèmes de synchronisation. Les bonnes tâches pour l’utilisation d’une interruption peuvent inclure la lecture d’un encodeur rotatif ou la surveillance d’une entrée utilisateur.

Si vous vouliez vous assurer qu’un programme capte toujours les impulsions d’un encodeur rotatif, afin qu’il ne manque jamais une impulsion, il serait très difficile d’écrire un programme pour faire autre chose, car le programme devrait constamment interroger le capteur. lignes pour le codeur, afin de capter les impulsions lorsqu’elles se produisent. D’autres capteurs ont également une interface dynamique similaire, comme essayer de lire un capteur sonore qui essaie d’attraper un clic, ou un capteur à fente infrarouge (interrupteur photo) essayant d’attraper une goutte de pièce. Dans toutes ces situations, l’utilisation d’une interruption peut libérer le microcontrôleur pour effectuer un autre travail sans manquer l’entrée.

À propos des routines de service d’interruption :

Les ISR sont des types de fonctions spéciaux qui ont des limitations uniques que la plupart des autres fonctions n’ont pas. Un ISR ne peut pas avoir de paramètres, et ils ne devraient rien retourner.

En règle générale, un ISR doit être aussi court et rapide que possible. Si votre esquisse utilise plusieurs ISR, une seule peut s’exécuter à la fois, les autres interruptions seront exécutées après la fin de l’interruption en cours dans un ordre qui dépend de la priorité dont elles disposent. millis() s’appuie sur les interruptions pour compter, il ne s’incrémentera donc jamais à l’intérieur d’un ISR. Comme delay() nécessite des interruptions pour fonctionner, il ne fonctionnera pas s’il est appelé à l’intérieur d’un ISR. micros() fonctionne initialement mais commencera à se comporter de manière erratique après 1-2 ms. delayMicroseconds() n’utilise aucun compteur, il fonctionnera donc normalement.

Généralement, les variables globales sont utilisées pour transmettre des données entre un ISR et le programme principal. Pour vous assurer que les variables partagées entre un ISR et le programme principal sont correctement mises à jour, déclarez-les comme volatile .

Pour plus d’informations sur les interruptions, consultez les notes de Nick Gammon .

Syntaxe :

attachInterrupt(digitalPinToInterrupt(pin), ISR, mode)(recommandé)
attachInterrupt(interrupt, ISR, mode)(non recommandé)
attachInterrupt(pin, ISR, mode)(Non recommandé. De plus, cette syntaxe ne fonctionne que sur les cartes Arduino SAMD, Uno WiFi Rev2, Due et 101.)

Paramètres :

interrupt : le numéro de l’interruption. Types de données autorisés : int .
pin : le numéro de broche Arduino.
ISR : l’ISR à appeler lorsque l’interruption se produit ; cette fonction ne doit prendre aucun paramètre et ne rien renvoyer. Cette fonction est parfois appelée routine de service d’interruption.
mode : définit quand l’interruption doit être déclenchée. Quatre constantes sont prédéfinies comme valeurs valides :

  • LOW pour déclencher l’interruption chaque fois que la broche est basse,
  • CHANGER pour déclencher l’interruption chaque fois que la broche change de valeur
  • RISING pour déclencher lorsque la goupille passe de bas en haut,
  • FALLING lorsque la goupille passe de haut en bas.

Les cartes Due, Zero et MKR1000 permettent également :

  • HAUT pour déclencher l’interruption chaque fois que la broche est haute.

Retour :

Rien

Exemple de code :

const byte ledPin = 13;
const byte interruptPin = 2;
volatile byte state = LOW;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(interruptPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(interruptPin), blink, CHANGE);
}

void loop() {
  digitalWrite(ledPin, state);
}

void blink() {
  state = !state;
}

 

Numéros d’interruption

Normalement, vous devriez utiliser digitalPinToInterrupt(pin), plutôt que de placer un numéro d’interruption directement dans votre croquis. Les broches spécifiques avec des interruptions et leur mappage au numéro d’interruption varient pour chaque type de carte. L’utilisation directe des numéros d’interruption peut sembler simple, mais elle peut entraîner des problèmes de compatibilité lorsque votre croquis s’exécute sur une carte différente.

Cependant, les croquis plus anciens ont souvent des numéros d’interruption directs. Souvent, le numéro 0 (pour la broche numérique 2) ou le numéro 1 (pour la broche numérique 3) étaient utilisés. Le tableau ci-dessous montre les broches d’interruption disponibles sur différentes cartes.

Notez que dans le tableau ci-dessous, les numéros d’interruption font référence au numéro à transmettre à attachInterrupt() . Pour des raisons historiques, cette numérotation ne correspond pas toujours directement à la numérotation des interruptions sur la puce ATmega (ex. int.0 correspond à INT4 sur la puce ATmega2560).

 

CONSEIL INT.0 INT.1 INT.2 INT.3 INT.4 INT.5

Uno, Ethernet

2

3

Mega2560

2

3

21

20

19

18

Basé sur 32u4 (par exemple Leonardo, Micro)

3

2

0

1

7

 

Pour les cartes Uno WiFiRev.2, Due, Zero, MKR Family et 101, le numéro d’interruption = numéro de broche .

 


 

Source : https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/

 

Laisser un commentaire