Académique Documents
Professionnel Documents
Culture Documents
Que se passe-t-il si une nouvelle interruption survient alors que l’ISR déclenchée par la
précédente n’est pas terminée ?
Une ISR n’est pas interrompue par une nouvelle interruption. La nouvelle interruption ne sera
prise en compte que lorsque l’ISR en cours se terminera.
Le corollaire est qu’il ne faut pas appeler de fonctions qui se mettent en attente d’une
interruption à partir d’une ISR. Comme l’interruption attendue ne peut pas déclencher une
nouvelle ISR, la fonction attendra indéfiniment et tout le système se bloquera. C’est ce que
l’on appelle un deadlock.
Les fonctions de Serial qui permettent d’afficher, via la ligne série et l’USB dans le moniteur
série font exactement cela. Leur appel à partir d’une ISR est donc interdit.
Les Interruptions ont chacune une priorité. Par exemple, les interruptions externes sont plus
prioritaires que les interruptions des Timers. L’Arduino exécutera les ISR dans leur ordre de
priorité.
Source Rôle
INT0 Interruption externe sur la broche 2
INT1 Interruption externe sur la broche 3
PCIE0 Interruption externe sur les broches 8 à 13
PCIE1 Interruption externe sur les broches A0 à A5
PCIE2 Interruption externe sur les broches 0 à 7
Relation entre broches et les interruptions pour ATMega 328P
Les interruptions externes PCIE0, PCIE1 et PCIE2 offrent moins de possibilités que INT0, INT1
Registres généraux nécessaires en cas d’interruption:
La gestion des interruptions peut nécessiter de connaitre deux registres généraux MCUCR
(MCU Control Register)
Les bits dont la valeur est repérée par un tiret - sont des bits réservés, leur valeur doit
toujours être égale à 0.
SREG (Avr Status Register)
Les interruptions INT0 & INT1 disposent chacune de leur propre vecteur d'interruption
et peuvent être déclenchées sur un front montant, descendant, un niveau bas ou un
basculement de niveau.
La configuration s'effectue dans le registre EICRA.
INT1 (INT0) :
Conditions :
• INT1(ou INT0) est mis a 1.
• Le mode de déclenchement est défini dans EICRA.
Actions :
Une interruption correspondante au External Interrupt Request 1 est exécuté à partir
du vecteur d’interruption INT1 (ou INT0)
EIFR (External Interrupt Flag Register)
INTF1 (INTF0)
Conditions :
• EIMSK bit INT1(ou INT0) = 1
• le choix du mode de déclenchement est fait sur un front ou un changement de niveau
Action :
• Quand une demande d'interruption apparait sur la broche sélectionnée, le micro se
branche sur le vecteur d'interruption correspondant.
• Le drapeau est remis à 0 à la fin de la routine d'interruption.
Remarque : Contrairement aux interruptions int0 et int1, il n'est pas possible de choisir le
mode de déclenchement, le seul mode disponible est sur basculement de niveau.
PCIFR (Pin Change Flag Register)
PCIFx est mis a 1, si PCIEx de PCICR =1 le micro se branche sur le vecteur d'interruption
corespondant. Le drapeau est remis à 0 à la sortie de la routine d'interruption.
PCMSKx (Pin change Mask Register x)
2) Configurer en C/Arduino l’IT Pin Change
sur le Port C (si changement sur PC6 ou void setup( )
PC3) et le Port D (si changement sur PD5 {
ou PD2) avec appel des 2 ISR.
numéro est le numero d’interruption concernée. Il s’agira de 0 ou 1 sur un Arduino Uno, ce qui
correspond respectivement aux broches 2 et 3.
Sur un Arduino Mega, les numeros 0 a 5 seront possibles et correspondent, 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 renvoit rien et qui ne prend aucun argument.
mode indique ce qui va provoquer l’interruption. Les valeurs possibles pour mode sont :
LOW : l’interruption est declenchee quand la broche concernee est LOW.
CHANGE : l’interruption est declenchee quand la broche concernee change d’etat
RISING : l’interruption est declenchee quand la broche concernée passe de
LOW a HIGH.
FALLING : l’interruption est declenchee quand la broche concernee passe de
HIGH a LOW.
Les modes de déclenchement sont le reflet direct des capacités du matériel et à ce titre
permettent la meilleure réactivité. Il faut savoir qu’il s’écoule presque 3μs entre le
déclenchement de l’interruption et l’exécution de la première instruction de l’ISR.
detachInterrupt(numero);
Il faut toutefois garder à l’esprit que, comparé aux interruptions INT0 et INT1, l’usage des
interruptions PCINTx conduira à une exécution plus fréquente de l’ISR et a une réactivité
moindre puisque la bibliothèque prendra du temps pour déterminer la broche source et le
type de changement avant d’appeler votre fonction. On privilégiera donc les premières. Le
corollaire est que la fonction que vous écrivez n’est pas directement une ISR mais une
fonction appelée par l’ISR. En effet, il n’y a que 3 ISR, une pour chacune des trois sources
PCINT0, PCINT1 et PCINT2, mais vous pouvez définir autant de fonctions qu’il y a de
broches grâce à la bibliothèque la bibliothèque PinChangeInt.
Exemple
void setup()
{
pinMode(pin, OUTPUT);
attachInterrupt(0, blink, CHANGE); // attache l'interruption externe n°0 à la fonction blink
}
void loop()
{
digitalWrite(pin, state); // la LED reflète l'état de la variable
}
Quand une interruption est appelée, les autres interruptions sont automatiquement
désactivées par le µcontrôleur
Les opérations de lecture/écriture sur des variables de plus de 8 bits doivent être
protégées en désactivant les interruptions.
Exemple :
unsigned long c;
cli();
c = PulseCounts;
sei();