Vous êtes sur la page 1sur 98

Systèmes embarqués pour IOT

Chapitre 3

Gestion des interruptions


Dr. ATTIA Brahim, brahim.attia@yahoo.fr
Maître assistant: Electronique & microélectronique

1
Plan
❑ Introduction (3-6)

❑ Qu'est-ce qu'une interruption? (7-10)

❑ Interruptions internes et externes (11-12)

❑ Cinq choses que vous devez savoir sur les interruptions Arduino (13-
19)

❑ Gestion des Interruptions (20-28)

❑ Summary of interrupts (29-33)

❑ interruptions externes INT0, INT1 (35-62)

❑ Interruptions par changement des pins (64-80) 2


Introduction exemple1

❑ J'interface un bouton-poussoir avec Arduino afin de basculer l'état de la LED, c'est-à-dire


appuyez une fois pour allumer la LED et appuyez à nouveau pour l'éteindre.

3
Introduction exemple1
This is Polling

❑ Dans ce scénario, l'Arduino continue de


vérifier l'état du bouton dans la fonction de
loop.
❑ Cette méthode de vérification est appelée
interrogation ou Polling.

❑ Le principal problème avec cette approche


est que le contrôleur est continuellement
engagé dans une activité (vérification de
l'état du bouton dans ce cas) et ne peut
effectuer aucune autre tâche.

4
Introduction
❑ Qu'est-ce que les interruptions?

✓ La plupart des µP ont des interruptions.

✓ Les interruptions vous permettent de répondre à des événements externes, tout en faisant
autre chose.

✓ Supposons que vous soyez chez vous en attendant que la nouvelle carte FPGA, que vous
avez commandée il y a quelques jours, arrive dans votre boîte aux lettres.

✓ Vous êtes très excité alors vous vérifiez votre boîte aux lettres toutes les dix minutes pour
voir si le tableau est arrivé.

✓ Cette procédure s'appelle le sondage (polling) , et nous avons beaucoup utilisé cette
technique dans nos projets.

✓ Mais que se passerait-il si nous avions dit au courrier de sonner à la porte à son arrivée?

✓ De cette façon, nous sommes libres de faire tout ce que nous voulons et au moment où la
carte FPGA arrive à la boîte aux lettres, nous sommes avertis et nous pouvons l'utiliser
immédiatement.
5
✓ Cet exemple explique exactement comment une interruption fait agir avec un processeur.
Introduction
❑ Le programme arduino est en cours d'exécution et exécute certaines fonctions.

❑ Cependant, lorsqu'une interruption se produit, le programme principal cesse de s'exécuter et


une autre fonction est appelée.

❑ Une fois cette fonction terminée, le processeur revient au programme principal et reprend son
exécution à partir du point où il a été arrêté.

❑ La fonction que le processeur exécute lorsqu'une interruption se produit est l'ISR, la routine de
service d'interruption (Interrupt Service Routine).

❑ Les interruptions peuvent provenir de diverses sources.

❑ Nous allons découvrir les interruptions matérielles qui sont déclenchées par un changement
d'état sur l'une des broches numériques.

❑ En d'autres termes, une interruption peut être déclenchée lorsqu'une broche numérique passe
de LOW à HIGH ou de HIGH à LOW.

6
Qu'est-ce qu'une interruption?
❑ L'interruption est un mécanisme par lequel le processeur est informé d'arrêter l'exécution
actuelle des instructions, d'exécuter un événement ou un processus spécial, puis de revenir à
l'exécution d'origine.

Main program
Interrupt Service routine
(ISR)

7
Qu'est-ce qu'une interruption?
❑ Le principal avantage des interruptions dans Arduino (ou tout microcontrôleur ou processeur
sur cette note) est que le processeur n'a pas à interroger en permanence les appareils pour
savoir s'ils ont besoin d'attention.

❑ L'appareil lui-même «interrompt» le processeur chaque fois qu'un service est requis jusqu'à ce
que le processeur puisse effectuer d'autres tâches.

❑ Si vous reprenez l'exemple du bouton, à l'origine, le contrôleur vérifiait en permanence l'état


du bouton.

❑ Mais en introduisant le concept d'interruptions dans cette situation, le contrôleur peut faire ce
qu'il veut (je veux dire autre chose que vérifier l'état du bouton, selon votre code) et chaque
fois que le bouton est enfoncé, il arrêtera automatiquement l'exécution en cours et met toute
son attention sur l'événement de pression de bouton.

❑ Lors de l'interruption, j'ai dit que le processeur exécute un processus spécial et que ce
processus spécial n'est rien d'autre qu'un ensemble d'instructions appelé Routine de service
d'interruption.

❑ La structure d'une routine de service d'interruption ou ISR est similaire à celle de toute
fonction d'annulation définie par l'utilisateur.
8
Qu'est-ce qu'une interruption?
❑ Une interruption, comme son nom l’indique, consiste à interrompre momentanément le
programme que l’Arduino exécute pour qu’il effectue un autre travail.

❑ Quand cet autre travail est terminé, l’Arduino retourne à l’exécution du programme et reprend
à l’endroit exact où il l’avait laissé.

❑ Cet autre travail s’appelle le programme d’interruption ou la routine d’interruption ou encore


une ISR pour Interrupt Service Routine en anglais.

❑ Il est très important que les ISR aient un temps d’exécution le plus court possible.

❑ On ne fera donc aucun calcul compliqué et aucun appel à des fonctions longues comme un
affichage sur un écran LCD :

❑ une bonne pratique consiste à s’en servir pour stocker une valeur dans une variable (déclarée «
volatile »).

❑ L’exécution de l’action àproprement parler se fera dans votre routine principale (loop()).

9
Qu'est-ce qu'une interruption?

❑ Il existe plusieurs sources d’interruption, on dit également vecteur d’interruption, sur l’AVR
328 qui équipe l’Arduino Uno, 26 au total.

❑ Nous n’allons pas toutes les passer en revue.

❑ Nous allons seulement nous concentrer sur celles que nous pouvons utiliser dans nos sketchs.

❑ Il s’agit des 5 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 (elles sont générées
par des signaux externes).

❑ Les interruptions liées au timers, qui permettent de compter le temps de manière précise, sont
appelées interruptions des timers internes (elles sont générées par des signaux internes).

10
Interruptions internes et externes
❑ Certains évènements peuvent intervenir à n’importe quel instant et doivent être gérés sans
attendre.

❑ Il est évident que de faire constamment une batterie de tests pour voir si tel ou tel évènement
s’est produit n’est pas performant du tout.

❑ Les interruptions sont la solution à ce problème.

❑ En effet, dès qu’un évènement se produit, si l’interruption est correctement configurée, le


microcontrôleur arrête immédiatement son exécution pour exécuter une autre portion de code
gérant cet évènement.

❑ Dès que cette portion de code a fini d’être exécutée, le microcontrôleur retourne à son
programme principal, à l’endroit où il l’avait quitté.

❑ Les interruptions possibles sont de deux types :


externe : lorsqu’une des pattes passe dans un certain état ou tant que la patte est dans un état
défini
interne : par exemple lorsque qu’un compteur dépasse sa valeur maximale, lorsqu’un transfert
via USART est terminé.

11
Interruptions internes et externes
❑ Plusieurs choses sont à faire pour configurer et utiliser les interruptions :

1. Pour les interruptions internes, configurer le registre correspondant pour déclencher


l’interruption; par exemple pour déclencher une interruption sur un Overflow du Timer/Counter0,
on configure le registre TIMSK en mettant le bit no 0, TOIE0, à 1.

2. Pour les interruptions externes, ce sont les registres EICRA, EICRB, EIMSK et EIFR qu’il
faut configurer pour qu’un certain état sur une ou plusieurs des pattes INT0 à INT7 déclenche
une interruption.

3. Il faut ensuite dire au microcontrôleur ce qu’il doit ex écuter. Pour cela, les premiers blocs
de mémoire sont alloués à un Reset and Interrupt Vector. à chaque type d’interruption est
associé une adresse dans ce Vecteur où le développeur met une instruction ”jmp LABEL”,
LABEL étant l’adresse de la mémoire où se trouve le code à exécuter.

4. Ensuite, on programme le code qui doit être exécuté en le mettant à l’adresse LABEL définie
ci-dessus.

5. Il reste à activer la gestion des interruptions `a l’aide de la commande assembleur sei(). La


gestion des interruptions peut être désactivée à l’aide de la commande assembleur cli().
A noter que le retour au programme principal se fait via la commande assembleur reti et non
via ret comme pour un retour depuis une sous-fonction classique.
12
Cinq choses que vous devez savoir sur les interruptions Arduino

Règles d’écriture d’une routine d’interruption:

1) Gardez les interruptions rapides

2) Fonctionnalités de temps et interruptions

3) N'utilisez pas la bibliothèque série à l'intérieur des interruptions

4) Variables volatiles

5) paramètres d’interruption et valeur renvoyée

13
Cinq choses que vous devez savoir sur les interruptions Arduino
1) Gardez les interruptions rapides

❑ Comme vous pouvez le deviner, vous devez rendre la fonction d'interruption aussi rapide que
possible, car elle arrête l'exécution principale de votre programme.

❑ Vous ne pouvez pas effectuer de calculs lourds.

❑ En outre, une seule interruption peut être traitée à la fois.

❑ Ce que je vous recommande de faire, c'est de ne changer les variables d'état que dans les
fonctions d'interruption.

❑ Dans la boucle principale (), vous vérifiez ces variables d'état et effectuez tout calcul ou action
requis.

❑ Supposons que vous souhaitiez déplacer un moteur et que cette action soit déclenchée par une
interruption.

❑ Dans ce cas, vous pouvez avoir une variable nommée «shouldMoveMotor» que vous
définissez sur «true» dans la fonction d'interruption.
❑ Dans votre programme principal, vous vérifiez l'état du «shouldMoveMotor».
❑ Quand c'est vrai, vous commencez à déplacer le moteur. 14
Cinq choses que vous devez savoir sur les interruptions Arduino
1) Gardez les interruptions rapides
exemple2

❑ Et vous pouvez faire exactement la même chose pour un calcul lourd, par exemple si le calcul
prend plus de quelques microsecondes à compléter.
❑ Si vous ne maintenez pas les interruptions rapidement, vous risquez de manquer des
échéances importantes dans votre code.
❑ Pour un robot mobile à 2 roues, cela peut rendre le mouvement du moteur saccadé.

❑ Pour la communication entre les appareils, vous risquez de manquer certaines données, etc.
15
Cinq choses que vous devez savoir sur les interruptions Arduino
2) Fonctionnalités de temps et interruptions
❑ Une règle de base: n'utilisez pas les fonctionnalités de temps dans vos interruptions.

❑ Voici plus de détails sur les 4 principales fonctions de l'heure:

millis():cela retournera le temps passé depuis le démarrage du programme Arduino, en


millisecondes.
Cette fonction s'appuie sur d'autres interruptions pour compter, et comme vous êtes à l'intérieur
d'une interruption, d'autres interruptions ne sont pas en cours d'exécution. Ainsi, si vous utilisez
millis (), vous obtiendrez la dernière valeur stockée, qui sera correcte, mais à l’intérieur de la
fonction d’interruption, la valeur millis () n’augmentera jamais.
delay():celui-ci ne fonctionnera tout simplement pas, car il repose également sur des
interruptions. De plus, même si c'était possible, vous ne devriez pas l'utiliser car vous savez
maintenant que vous devez maintenir les interruptions très rapidement.
micros():cette fonction est la même que millis (), mais renvoie l'heure en microsecondes.
Cependant, contrairement à millis (), micros () fonctionnera au début d'une interruption. Mais
après 1 ou 2 millisecondes, le comportement ne sera pas précis et vous pouvez avoir une dérive
permanente chaque fois que vous utilisez micros () par la suite. Encore une fois, le conseil est le
même: faites vos interruptions courtes et rapides!
delayMicroseconds():celui-ci fonctionnera comme d’habitude, mais… ne l’utilisez pas. Comme
vous l'avez vu précédemment, il y a trop de choses qui peuvent mal tourner si vous restez trop
longtemps dans une interruption. 16
Cinq choses que vous devez savoir sur les interruptions Arduino
3) N'utilisez pas la bibliothèque série à l'intérieur des interruptions
❑ La bibliothèque série est très utile pour déboguer et communiquer entre votre carte Arduino et
une autre carte ou appareil.
❑ Mais ce n’est pas une solution idéale pour les fonctions d’interruption.

❑ Lorsque vous êtes à l'intérieur d'une interruption, les données série reçues peuvent être
perdues.
❑ Ce n’est donc pas une bonne idée d’utiliser les fonctionnalités de lecture de Serial.

❑ De plus, si vous faites une interruption trop longue et que vous lisez ensuite à partir de Serial
dans votre code principal, vous avez peut-être encore perdu certaines parties des données.

❑ Vous pouvez utiliser Serial.print () dans une interruption pour le débogage, par exemple si
vous n'êtes pas sûr du moment où l'interruption est déclenchée.

❑ Mais il a aussi sa propre source de problèmes.

❑ La meilleure façon d'imprimer quelque chose à partir d'une interruption est simplement de
définir un drapeau à l'intérieur de l'interruption, et d'interroger ce drapeau dans le programme
principal loop ().
❑ Lorsque l'indicateur est activé, vous imprimez quelque chose et désactivez l'indicateur. Cela
vous évitera d'éventuels maux de tête. 17
Cinq choses que vous devez savoir sur les interruptions Arduino
4) Variables volatiles
❑ Si vous modifiez une variable à l'intérieur d'une interruption, vous devez déclarer cette
variable comme volatile.

❑ Le compilateur fait beaucoup de choses pour optimiser le code et la vitesse du programme.

❑ C'est une bonne chose, mais ici, nous devons lui dire de «ralentir» l'optimisation.

❑ Par exemple, si le compilateur voit une déclaration de variable, mais que la variable n'est
utilisée nulle part dans le code (à l'exception des interruptions), il peut supprimer cette
variable.
❑ Avec une variable volatile, vous êtes sûr que cela ne se produira pas, la variable sera quand
même stockée.
❑ De plus, lorsque vous utilisez volatile, il indique au contrôleur de recharger la variable chaque
fois qu’elle est référencée.

❑ Parfois, le compilateur utilise des copies de variables pour aller plus vite.

❑ Ici, vous voulez vous assurer que chaque fois que vous accédez / modifiez la variable, que ce
soit dans le programme principal ou à l'intérieur d'une interruption, vous obtenez la variable
réelle et non une copie.
❑ Notez que seules les variables utilisées à l'intérieur et à l'extérieur d'une interruption doivent
18
être déclarées comme volatiles. Vous ne voulez pas ralentir inutilement votre code.
Cinq choses que vous devez savoir sur les interruptions Arduino
5) paramètres d’interruption et valeur renvoyée

❑ Une fonction d'interruption ne peut accepter aucun paramètre et ne renvoie aucune valeur.

❑ Fondamentalement, si vous deviez écrire un prototype pour une interruption, ce serait quelque
chose comme void interruptFunction () ;.

❑ Ainsi, la seule façon de partager des données avec le programme principal consiste à utiliser
des variables volatiles globales.

❑ Dans une interruption, vous pouvez également obtenir et définir des données à partir de
broches matérielles, tant que vous gardez le programme court.

❑ Par exemple, utiliser digitalRead () ou digitalWrite () peut être acceptable si vous n'en abusez
pas.

19
Gestion des Interruptions

❑ La gestion des interruptions paraît souvent difficile et pourtant ce n’est pas plus compliquer
que de gérer une interface SPI par exemple.

❑ Afin d’éviter les boucles d’attente sans fin et les risques de blocage, il est assez simple de
mettre en œuvre les interruptions du microcontrôleur qui dispose d’un grand nombre de
possibilité d’activation.

❑ En premier lever le drapeau d’autorisation d’interruption général dans SREG (instruction


SEI) et il faut donner au périphérique concerné la possibilité d’interrompre provisoirement le
programme principal en réglant les bits d’interruption dans les registres respectifs.

❑ Chaque interruption va provoquer un saut de programme à une adresse bien précise


correspondant à votre programme de gestion de l’interruption que vous avez écrit (voir le
tableau décrit plus loin).

❑ Utiliser l’instruction RETI pour effectuer la fin de l’interruption et provoqué le retour au


programme principal.

20
Gestion des Interruptions
Status Register: SREG
7 0

I T H S V N Z C

1 1 1 1 1 1 1 1

Bit 7 – I: Global Interrupt Enable


bitSET (SREG,7)
Bit 6 – T: Copy Storage

Bit 5 – H: Half Carry Flag


bitClear (SRG,7)
Bit 4 – S: Sign Flag, S = N ㊉ V

Bit 3 – V: Two’s Complement Overflow Flag

Bit 2 – N: Negative Flag

Bit 1 – Z: Zero Flag Bit 0 – C: Carry Flag 21


Gestion des Interruptions

❑ Sauvegarder impérativement vos registres de travail, surtout SREG, dans la pile ou en


mémoire, car dans le programme d’interruption, la valeur de ce registre à de très grande
chance de changer et au retour de l’interruption vous pouvez avoir de drôle de surprise.

❑ Pour sauvegarder un registre, il faut le mettre sur la pile avec l’instruction PUSH, au début du
programme d’interruption, puis le replacer à l’aide de l’instruction POP en fin de programme
avant RETI.

❑ Si une seconde interruption intervient pendant le traitement de la première, le programme la


traitera aussitôt fini la première (au retour sur RETI).

❑ Attention : les interruptions peuvent bloquer l’UC si une boucle infinie a été écrite par erreur,
vérifier le système de bouclage dans le programme de gestion des interruptions, il doit se
terminer obligatoirement par une sortie RETI quelles que soient les conditions testées dans la
gestion des interruptions.

22
Gestion des Interruptions : Vecteurs d’interruptions
❑ Les vecteurs d’interruptions sont en fait les adresses de correspondant des programmes de
gestion des interruptions proprement dit classé par ordre décroissant d’important.

23
Gestion des Interruptions : Vecteurs d’interruptions
❑ Voici une liste des interruptions, par ordre de priorité, pour Atmega328:

1 Reset
2 External Interrupt Request 0 (pin D2) INT0_vect
3 External Interrupt Request 1 (pin D3) INT1_vect
4 Pin Change Interrupt Request 0 (pins D8 to D13) PCINT0_vect
5 Pin Change Interrupt Request 1 (pins A0 to A5) PCINT1_vect
6 Pin Change Interrupt Request 2 (pins D0 to D7) PCINT2_vect
7 Watchdog Time-out Interrupt WDT_vect
8 Timer/Counter2 Compare Match A TIMER2_COMPA_vect
9 Timer/Counter2 Compare Match B TIMER2_COMPB_vect
10 Timer/Counter2 Overflow TIMER2_OVF_vect
11 Timer/Counter1 Capture Event TIMER1_CAPT_vect
12 Timer/Counter1 Compare Match A TIMER1_COMPA_vect
13 Timer/Counter1 Compare Match B TIMER1_COMPB_vect
14 Timer/Counter1 Overflow TIMER1_OVF_vect
24
Gestion des Interruptions : Vecteurs d’interruptions

15 Timer/Counter0 Compare Match A TIMER0_COMPA_vect


16 Timer/Counter0 Compare Match B TIMER0_COMPB_vect
17 Timer/Counter0 Overflow TIMER0_OVF_vect
18 SPI SerialTransfer Complete SPI_STC_vect
19 USART Rx Complete USART_RX_vect
20 USART, Data Register Empty USART_UDRE_vect
21 USART, Tx Complete USART_TX_vect
22 ADC Conversion Complete ADC_vect
23 EEPROM Ready EE_READY_vect
24 Analog Comparator ANALOG_COMP_vect
25 2-Wire Serial Interface (I2C) TWI_vect
26 Store Program Memory Ready SPM_READY_vect

❑ Les noms internes (que vous pouvez utiliser pour configurer les rappels ISR) se trouvent dans
la 3éme colonne.
❑ Si vous avez mal orthographié le nom du vecteur d'interruption, même en obtenant
simplement une mauvaise mise en majuscule (chose facile à faire), la routine d'interruption
25 ne
sera pas appelée et vous n'obtiendrez pas d'erreur de compilation.
Gestion des Interruptions : Vecteurs d’interruptions
❑ Les principales raisons pour lesquelles vous pouvez utiliser des interruptions sont:
✓ Pour détecter les changements de broches (par exemple, encodeurs rotatifs,
pressions sur des boutons)

✓ Watchdog timer : Horloge de surveillance (par exemple, si rien ne se passe après 8


secondes, interrompez-moi)

✓ Interruptions du Timer (minuterie):utilisées pour comparer / déborder des minuteries

✓ Transferts de données SPI

✓ Transferts de données I2C

✓ Transferts de données USART

✓ Conversions ADC (analogique vers numérique)

✓ EEPROM prête à l'emploi

✓ Mémoire flash prête


❑ Les transferts de données peuvent être utilisés pour laisser un programme faire autre chose
26
pendant que les données sont envoyées ou reçues sur le port série, le port SPI ou le port I2C.
Gestion des Interruptions

MCUCR (MCU Control Register)

27
Summary of interrupts
Wake the processor
❑ External interrupts, pin-change interrupts, and the watchdog timer interrupt , peut également
être utilisé pour réveiller (Wake Up) le processeur.

❑ Cela peut être très pratique, car en mode veille, le processeur peut être configuré pour utiliser
beaucoup moins d'énergie (par exemple, environ 10 µA).

❑ Une interruption sur un front montant, descendant ou sur un niveau bas peut être utilisée pour
réveiller un gadget (par exemple, si vous appuyez sur un bouton), ou une interruption de
Watch Dog (l'horloge de surveillance) peut le réveiller périodiquement (par exemple, pour
vérifier l'heure ou la température)

❑ Pin-Change interrupts pourrait être utilisé pour réveiller le processeur si une touche est
enfoncée sur un clavier, ou similaire.

❑ Le processeur peut également être réveillé par une interruption du Timer (par exemple, une
temporisation atteignant une certaine valeur, ou débordement) et certains autres événements,
tels qu'un message I2C entrant.

28
Summary of interrupts
Enabling/disabling interrupts
❑ L'interruption «reset» ne peut pas être désactivée.

❑ Cependant, les autres interruptions peuvent être temporairement désactivées en effaçant


(remise à zéro) le drapeau (Flag) d'interruption.
Enable interrupts
You can enable interrupts with the function call « interrupts » or « sei » like this:
Interrupts(); // or …..
Sei(); // set interrupts flag
bitSet(SREG,7);
SREG |= 0x80;

Disable interrupts
If you need to disable interrupts you can « clear » the interrupt flag like this:
noInterrupts(); // or …..
cli(); // Clear interrupts flag
bitClear(SREG,7);
SREG &= 0x7f;

29
Summary of interrupts
Why disable interrupts?
❑ Il peut y avoir des morceaux de code critiques en termes de temps que vous ne voulez pas
interrompre, par exemple par une interruption du Timer.

❑ De même, si les champs multi-octets sont mis à jour par un ISR, vous devrez peut-être
désactiver les interruptions afin d'obtenir les données «atomiquement».

❑ Sinon, un octet peut être mis à jour par l'ISR pendant que vous lisez l'autre.

For example:
noInterrupts ();
long myCounter = isrCounter; // get value set by ISR
interrupts ();

❑ La désactivation temporaire des interruptions garantit que isrCounter (un compteur défini
dans un ISR) ne change pas pendant que nous obtenons sa valeur.

30
Summary of interrupts
Why disable interrupts?
❑ Attention: si vous n'êtes pas sûr que les interruptions sont déjà activées ou non, vous devez
enregistrer l'état actuel et le restaurer par la suite.

❑ Par exemple, le code de la fonction millis () fait ceci:

unsigned long millis() {


unsigned long m;
uint8_t oldSREG = SREG;
// disable interrupts while we read timer0_millis or we might get an
// inconsistent value (e.g. in the middle of a write to timer0_millis)
cli();
m = timer0_millis;
SREG = oldSREG;
return m; }

❑ Notez que les lignes en gras sauvegardent le SREG actuel (registre d'état) qui comprend le
Flag (l'indicateur) d'interruption.

❑ Après avoir obtenu la valeur du Timer (4 octets), nous remettons le registre d'état (SREG) tel
qu'il était.
31
Summary of interrupts
Why disable interrupts?

Des astuces (Tips)

Noms de fonction
Les fonctions cli / sei et le registre SREG sont spécifiques aux processeurs AVR.

Si vous utilisez d'autres processeurs tels que ceux ARM, les fonctions peuvent être
légèrement différentes.

Disabling globally vs disabling one interrupt


Si vous utilisez cli (), vous désactivez toutes les interruptions (y compris les
interruptions du Timer, les interruptions série, etc.).

Cependant, si vous souhaitez simplement désactiver une interruption particulière, vous


devez effacer le FLAG (l'indicateur) d'activation d'interruption pour cette source
d'interruption particulière.

Par exemple, pour les interruptions externes, appelez detachInterrupt ().

32
Interrupts();
noInterrupts();
attachInterrupts();
detachInterrupts();
Sei();
Cli();
digitalPinToInterrupt (pin);

33
Partie1 : interruptions externes
INT0
INT1

34
Les Pines d’interruptions externes
❑ Avec la plupart des cartes Arduino, nous ne pouvons utiliser que certaines broches comme
interruptions.

❑ Les interruptions sont désignées par un numéro d'identification qui correspond à une broche
numérique particulière.

❑ Ainsi, l'interruption 0 avec une carte Arduino UNO correspond à la broche numérique 2.

❑ L'arduino UNO, l'arduino Nano et l'arduino pro mini ne prennent en charge que deux
interruptions externes, sur les broches numériques 2 et 3.

❑ L'arduino MEGA prend en charge 6 interruptions externes et la puce ESP8266 peut prendre en
charge 16 interruptions externes.

Interrupt Pins
Board INT0 INT1 INT2 INT3 INT4 INT5 …. INT15
UNO Pin 2 Pin 3
MEGA Pin 2 Pin 3 Pin 21 Pin 20 Pin 19 Pin 18
ESP82 GPIO 0 GPIO 1 GPIO 2 GPIO 3 GPIO 4 GPIO 5 ……. GPIO
66 15
35
exemple3
❑ Les interruptions externes INT0 et INT1
✓ Les modes de déclenchement sont le reflet direct des capacités du matériel et à ce titre
permettent la meilleure réactivité.

✓ Ayez tout de même à l’esprit 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.

✓ Une seconde fonction, detachInterrupt(...) permet de déconnecter l’ISR de la source


d’interruption.

✓ Son prototype est le suivant où numero est le numéro d’interruption, 0 ou 1 sur un Arduino
Uno. :
Un exemple : changement d’état d’une LED (broche 13, non indiquée sur le schéma ci-dessous
mais à rajouter) commandé par un interrupteur (broche 2, INT0)

36
attachInterrupt(0, buttonPressed,RISING)

✓ The first argument is the interrupt ID, so if we are using an Arduino UNO, the interrupt 0
corresponds to digital pin2.(INT 0 = Pin 2)

✓ The next argument is the function that is going to be executed when the interrupt is
triggered.(ISR name)

✓ In other words, this is the ISR function.

✓ In this example, we name the ISR buttonPressed.

✓ The Last argument tells the arduino what triggers the interrupt.

✓ RISING means that an interrupt will be triggered when the state of digital Pin 2 goes from
LOW to HIGH.

✓ We can also use the word FALLING which means that an interrupt will be triggerd when the
state of the Pin goes from HIGH to LOW.

✓ Another option is to use the word Change which will trigger an interrupt when ever a change
in the state of the pin occurs.
37
❑ Les interruptions externes INT0 et INT1

✓ Ces deux interruptions sont les plus faciles à utiliser.

✓ INT0 correspond à la broche 2 des Arduino a base d’AVR et INT1 correspond à la broche 3.

✓ 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(...).

✓ Cette fonction prend 3 arguments : le numéro d’interruption externe, la fonction à appeler


quand l’interruption survient et enfin la condition selon laquelle l’interruption survient.

✓ Son prototype est le suivant :


numéro: est le numéro d’interruption concernée. Il s’agira de 0 ou 1 sur un Arduino Uno, ce qui
correspond respectivement aux broches 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

38
Mode: indique ce qui va provoquer l’interruption.

✓ Les valeurs possibles pour mode sont :

LOW : le pin est à un état bas (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)

RISING : l’interruption est déclenchée quand la broche concernée passe de LOW à HIGH

FALLING : l’interruption est déclenchée quand la broche concernée passe de HIGH à LOW

CHANGE : le pin change d’état (passage de LOW à HIGH ou bien de HIGH à LOW)

39
digitalPinToInterrupt(Pin) function

❑ Pour simplifier la conversion des nombres de vecteurs d'interruption en numéros de broche,


vous pouvez appeler la fonction digitalPinToInterrupt, en passant un numéro de broche.

❑ Il renvoie le numéro d'interruption approprié, ou NOT_AN_INTERRUPT (-1).

❑ Par exemple, sur UNO, la broche D2 de la carte est l'interruption 0 (INT0_vect de la table
d’interruptions).

❑ Ainsi les deux lignes ont le même effet:

attachInterrupt(0,switchPressed,CHANGE); // that is, for pin D2

attachInterrupt(digitalPinToInterrupt (2) ,switchPressed, CHANGE);

❑ Cependant, le second est plus facile à lire et plus portable pour différents types d'arduino.

40
Exemple de bouton avec interruption exemple4

❑ Maintenant, revisitons l'exemple de bouton précédent en attachant Interruption à la broche du


bouton.

❑ Ce qui suit est le nouveau code avec interruption de bouton.

41
Exemple de bouton avec interruption exemple5

❑ Dans le code ci-dessus, le bouton est connecté à la broche 2 (INT0) d'Arduino et une
interruption est attachée par rapport à cette broche sur un événement de CHANGEMENT de
la valeur de la broche du bouton et déclenchant un ISR nommé button_ISR.

❑ Une note importante à propos de ce code est que même si Interrupt est implémenté ici, ce ne
sont toujours pas les meilleures exécutions possibles.

❑ Ce qui suit est un code plus approprié avec interruption et il considère même le bouton anti-
rebond.

42
Le même exemple peut être utilisé par le capteur pir exemple6
❑ Voyons maintenant comment utiliser une interruption sur une broche numérique de l'arduino
avec un exemple.

❑ Nous allons construire un projet simple dans lequel, chaque fois que nous appuierons sur le
bouton, une interruption sera déclenchée et l'ISR changera l'état de la LED.

❑ Nous devons connecter la LED à la broche numérique 13 et le bouton à la broche numérique 2


qui prend en charge les interruptions matérielles.
❑ Pour configurer une broche numérique comme une broche d’interruption externe, nous devons
utilisez la fonction attachInterrup().

43
Le même exemple sans interruption exemple7

44
Basculement d’une LED exemple8

45
Capteur PIR exemple9

❑ Dans cet exemple, nous utiliserons un capteur PIR pour déclencher une
interruption.

❑ Le capteur PIR fonctionne comme suit.

❑ Il n'a que trois broches: VCC, GND, sortie.

❑ Lorsque le capteur détecte un mouvement, la broche de signal passe de LOW à HIGH et reste
allumée pendant 10 secondes.

❑ S'il ne détecte aucun mouvement au cours de cette période de 10 secondes, il revient à LOW.

❑ Dans cet exemple, nous voulons utiliser des interruptions pour allumer la LED lorsqu'un
mouvement est détecté, et l'éteindre à nouveau lorsque le signal du capteur devient BAS.

HIGH
10sec
LOW

movement
46
Capteur PIR exemple9

47
exemple10

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

49
exemple12

50
exemple12

51
exemple13

52
exemple13

53
exemple14

54
exemple15

❑ Le câblage suivant d'un Arduino Uno est donné.


❑ Écrivez un programme (également connu sous le nom de croquis) qui allume le voyant lorsque
le bouton est relâché après avoir été enfoncé (le voyant ne doit commencer à s'allumer que
lorsque le bouton est relâché).
❑ La LED doit alors s'allumer jusqu'à ce que le bouton soit à nouveau enfoncé puis relâché
(encore une fois, la LED ne doit s'éteindre que lorsque le bouton est relâché).
❑ L'évaluation du bouton doit être effectuée à l'aide d'une fonction d'interruption (numéro
d'interruption: 0).

55
Interruptions INT0 et INT1
❑ 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.

✓ Choix niveau bas : l'interruption dure aussi longtemps que le niveau est maintenu à l'état bas.

✓ Choix front : La configuration sur un front nécessite la prise en compte de l'horloge.

✓ Ce mode ne peut pas servir à réveiller un micro, car en mode veille, l'horloge est arrêtée sauf
pour le mode « idle » ou l'horloge est maintenue.

Remarque :
❑ Micro réveillé par une interruption sur le niveau :
✓ Le niveau devra être maintenu suffisamment longtemps pour laisser au micro le temps
d'intercepter l'interruption.

✓ Si ce n'est pas le cas le micro sortira quand même du mode veille mais les interruptions ne
seront pas générée.

✓ Pour le réglage du temps de réveil voir page 26 de la spécification technique de


56
l'ATMega328p le réglage des « fuses ».
External Interrupt Control Register A
❑ Le registre de contrôle d'interruption externe A contient des bits de contrôle pour le contrôle
de détection d'interruption.

Bits 3:2 – ISC1n: Interrupt Sense Control 1 [n = 1:0]


❑ L'interruption externe 1 est activée par la broche externe INT1 si l'indicateur I SREG et le
masque d'interruption correspondant sont définis (bit set).

❑ Le niveau et les fronts sur la broche INT1 externe qui activent l'interruption sont définis dans
le tableau.

❑ La valeur sur la broche INT1 est échantillonnée avant la détection des fronts.

❑ Si l'interruption de front ou à basculement est sélectionnée, les impulsions qui durent plus
d'une période d'horloge généreront une interruption.

❑ Il n'est pas garanti que des impulsions plus courtes génèrent une interruption.

❑ Si l'interruption de niveau bas est sélectionnée, le niveau bas doit être maintenu jusqu'à 57
l'achèvement de l'instruction en cours d'exécution pour générer une interruption.
External Interrupt Control Register A
❑ Le registre de contrôle d'interruption externe A contient des bits de contrôle pour le contrôle
de détection d'interruption.

Bits 1:0 – ISC0n: Interrupt Sense Control 0 [n = 1:0]

❑ L'interruption externe 0 est activée par la broche externe INT0 si l'indicateur I du registre
SREG et le masque d'interruption correspondant sont définis (bit set).

❑ Le niveau et les fronts sur la broche INT0 externe qui activent l'interruption sont définis dans
le tableau ci-dessous.

❑ La valeur sur la broche INT0 est échantillonnée avant la détection des fronts.

❑ Si l'interruption de front ou du basculement (change) est sélectionnée, les impulsions qui


durent plus d'une période d'horloge généreront une interruption.

❑ Il n'est pas garanti que des impulsions plus courtes génèrent une interruption.

❑ Si l'interruption de niveau bas est sélectionnée, le niveau bas doit être maintenu jusqu'à 58
l'achèvement de l'instruction en cours d'exécution pour générer une interruption.
External Interrupt Mask Register
bitSet(EIMSK,1)
bitSet(EIMSK,0)

Bit 1 – INT1: External Interrupt Request 1 Enable

❑ Lorsque le bit INT1 est mis à 1 et le bit I dans le registre d'état (SREG) est activé,
l'interruption de broche externe est activée.

❑ Les bits 1/0 du contrôle de détection d'interruption1 (ISC11 et ISC10) dans le registre de
contrôle d'interruption externe A (EICRA) définissent si l'interruption externe est activée sur
front montant et / ou descendant de la broche INT1 ou du niveau détecté.

❑ L'activité sur la broche provoquera une demande d'interruption même si INT1 est configuré
comme sortie.

❑ L'interruption correspondante de la demande d'interruption externe 1 est exécutée à partir du


vecteur d'interruption INT1.

59
External Interrupt Mask Register

Bit 0 – INT0: External Interrupt Request 0 Enable

❑ Lorsque le bit INT0 est mis à 1 et le bit I dans le registre d'état (SREG) est activé,
l'interruption de broche externe est activée.

❑ Les bits 1/0 du contrôle de détection d'interruption 0 (ISC01 et ISC00) dans le registre de
contrôle d'interruption externe A (EICRA) définissent si l'interruption externe est activée sur
front montant et / ou descendant de la broche INT0 ou du niveau détecté.

❑ L'activité sur la broche provoquera une demande d'interruption même si INT0 est configuré
comme sortie.

❑ L'interruption correspondante de la demande d'interruption externe 0 est exécutée à partir du


vecteur d'interruption INT0.

60
External Interrupt Flag Register: EIFR
Bit 1 – INTF1: External Interrupt Flag 1
❑ Lorsqu'un front ou un changement de logique sur la broche INT1 déclenche une demande
d'interruption, INTF1 sera activé (mis à 1).
❑ Si le bit I dans SREG et le bit INT1 dans EIMSK sont à 1, la MCU sautera au vecteur
d'interruption correspondant.
❑ Le drapeau est effacé ( à 0) lorsque le programme d'interruption est exécuté.

❑ Alternativement, l'indicateur peut être effacé en écrivant «1» dessus.

❑ Cet indicateur est toujours effacé lorsque INT1 est configuré comme une interruption de
niveau.
Bit 0 – INTF0: External Interrupt Flag 0
❑ Lorsqu'un front ou un changement de logique sur la broche INT0 déclenche une demande
d'interruption, INTF0 sera défini.

❑ Si le bit I dans SREG et le bit INT0 dans EIMSK sont à 1, la MCU sautera au vecteur
d'interruption correspondant.

❑ Le drapeau est effacé lorsque le programme d'interruption est exécuté.

❑ Alternativement, l'indicateur peut être effacé en écrivant «1» dessus.


❑ Cet indicateur est toujours effacé lorsque INT0 est configuré comme une interruption de
61
niveau.
Arduino External Pin Interrupts exemple16

bitClear(DDRD,2)

Digitalwrite(pin,high)

bitSet(EICRA,0)
bitSet(EIMSK,0) bitClear(EICRA,1)

bitSet(PORTD,2)

62
0 0 0 0 0 0 0 1

0 0 0 0 0 1 0 0

1 1 1 1 1 0 1 1

63
Es soll ein Programm realisiert werden, das eine erste LED permanent mit einer
Frequenz von 0,5 Hz blinken lässt und in dem gleichzeitig ein Taster abgefragt
wird. Sobald der Taster betätigt wird, soll 5 Sekunden gewartet werden und
dann eine zweite LED für 0,5 Sekunden kurz aufleuchten. Das Blinken der ersten
LED soll dabei nicht unterbrochen werden.

64
exemple16.a

65
exemple16.b

66
exemple16.b

67
68
exemple17

69
Exemple17.a

70
Exemple17.b

71
Exemple17.c

72
Exemple18.a

73
Exemple18.b

74
75
76
Partie2 : Pin Change Interrupt

77
Généralités sur les interruptions
❑ Les interruptions « Externes » sont déclenchées par les pins INT0, INT1 ou une quelconque
des pins PCINT 0 à 23.

❑ Les interruptions restent fonctionnelles même si les pins INT0, INT1 ou PCINT 0 à 23 sont
configurées en sortie.

❑ L'interruption PCI2 se déclenche si une quelconque des pins PCINT23-16 change d 'état.

❑ L'interruption PCI1 se déclenche si une quelconque des pins PCINT14-8 change d 'état.

❑ L'interruption PCI0 se déclenche si une quelconque des pins PCINT7-0 change d 'état.

❑ Les registres PCMSK2, PCMSK1 et PCMSK0 contrôlent quelle broche est à l'origine du
changement d'état.

❑ Les changements d'état sur les broches PCINT0-23 sont détectés de manière asynchrone.

❑ Ceci implique que ces interruptions sont capable de réveiller le micro qui aurait été mis en
veille.

78
MCUCR (MCU Control Register)

79
Pin Change Interrupt Control Register : PCICR
Bit 2 – PCIE2: Pin Change Interrupt Enable 2
❑ Lorsque le bit PCIE2 est mise à 1 et que le bit I du registre d'état (SREG) est mise à 1,
l'interruption de changement du port 2 (pin change interrupt 2) est activée.

❑ Tout changement sur une broche PCINT [23:16] (qui est activée) provoquera une interruption.

❑ L'interruption correspondante de la demande d'interruption de changement de broche est


exécutée à partir du vecteur d'interruption PCI2.

❑ Les broches PCINT [23:16] sont activées individuellement par le registre PCMSK2.

80
Pin Change Interrupt Control Register : PCICR
Bit 1 – PCIE1: Pin Change Interrupt Enable 1

❑ Lorsque le bit PCIE1 est mise à 1 et que le bit I du registre d'état (SREG) est mise à 1,
l'interruption de changement du port (pin change interrupt 1) est activée.

❑ Tout changement sur une broche PCINT [14 : 8] (qui est activée) provoquera une interruption.
❑ L'interruption correspondante de la demande d'interruption de changement de broche est
exécutée à partir du vecteur d'interruption PCI1.

❑ Les broches PCINT [14:8] sont activées individuellement par le registre PCMSK1.

81
Pin Change Interrupt Control Register : PCICR
Bit 0 – PCIE0: Pin Change Interrupt Enable 0

❑ Lorsque le bit PCIE0 est mise à 1 et que le bit I du registre d'état (SREG) est mise à 1,
l'interruption de changement du port 0 (pin change interrupt 0) est activée.

❑ Tout changement sur une broche PCINT [7 : 0] (qui est activée) provoquera une interruption.
❑ L'interruption correspondante de la demande d'interruption de changement de broche est
exécutée à partir du vecteur d'interruption PCI0.

❑ Les broches PCINT [7:0] sont activées individuellement par le registre PCMSK0.

82
Pin Change Interrupt Flag Register : PCIFR

Bit 2 – PCIF2: Pin Change Interrupt Flag 2

❑ Lorsqu'un changement de niveau logique sur une broche PCINT [23: 16] déclenche une
demande d'interruption, PCIF2 est positionné à 1.

❑ If the I-bit in SREG and the PCIE2 bit in PCICR are set, the MCU will jump to the
corresponding Interrupt Vector.

❑ Le drapeau est effacé (remis à 0) lorsque le programme d'interruption est exécuté.


❑ Alternativement, l'indicateur peut être effacé en écrivant «1» dessus.

83
Pin Change Interrupt Flag Register : PCIFR

Bit 1 – PCIF1: Pin Change Interrupt Flag 1

❑ Lorsqu'un changement de niveau logique sur une broche PCINT [14:8] déclenche une
demande d'interruption, PCIF1 est positionné à 1.

❑ If the I-bit in SREG and the PCIE1 bit in PCICR are set, the MCU will jump to the
corresponding Interrupt Vector.

❑ Le drapeau est effacé (remis à 0) lorsque le programme d'interruption est exécuté.


❑ Alternativement, l'indicateur peut être effacé en écrivant «1» dessus.

84
Pin Change Interrupt Flag Register : PCIFR

Bit 0 – PCIF0: Pin Change Interrupt Flag 0

❑ Lorsqu'un changement de niveau logique sur une broche PCINT [7: 0] déclenche une
demande d'interruption, PCIF0 est positionné à 1.

❑ If the I-bit in SREG and the PCIE0 bit in PCICR are set, the MCU will jump to the
corresponding Interrupt Vector.

❑ Le drapeau est effacé (remis à 0) lorsque le programme d'interruption est exécuté.


❑ Alternativement, l'indicateur peut être effacé en écrivant «1» dessus.

85
Pin Change Mask Register 2: PCMSK2

Bits 0, 1, 2, 3, 4, 5, 6, 7 – PCINT16, PCINT17, PCINT18, PCINT19, PCINT20, PCINT21,


PCINT22,PCINT23: Pin Change Enable Mask

❑ Each PCINT[23:16]-bit selects whether pin change interrupt is enabled on the corresponding
I/O pin.

❑ If PCINT[23:16] is set and the PCIE2 bit in PCICR is set, pin change interrupt is enabled on
the corresponding I/O pin.

❑ If PCINT[23:16] is cleared, pin change interrupt on the corresponding I/O pin is disabled.

86
Pin Change Mask Register 1 : PCMSK1

Bits 0, 1, 2, 3, 4, 5, 6 – PCINT8, PCINT9, PCINT10, PCINT11, PCINT12, PCINT13,


PCINT14 : Pin Change Enable Mask

❑ Each PCINT[15:8]-bit selects whether pin change interrupt is enabled on the corresponding
I/O pin.

❑ If PCINT[15:8] is set and the PCIE1 bit in PCICR is set, pin change interrupt is enabled on the
corresponding I/O pin.

❑ If PCINT[15:8] is cleared, pin change interrupt on the corresponding I/O pin is disabled.

87
Pin Change Mask Register 0 : PCMSK0

Bits 7:0 – PCINTn: Pin Change Enable Mask [n = 7:0]


❑ Each PCINT[7:0] bit selects whether pin change interrupt is enabled on the corresponding I/O
pin.

❑ If PCINT[7:0] is set and the PCIE0 bit in PCICR is set, pin change interrupt is enabled on the
corresponding I/O pin.

❑ If PCINT[7:0] is cleared, pin change interrupt on the corresponding I/O pin is disabled.

88
❑ Dés qu'une interruption de déclenche elle met automatiquement le bit I à 0 bloquant ainsi la
possibilité d'avoir plusieurs interruptions simultanées.

❑ L'instruction RETI repositionne le bit I à 1 permettant ainsi la prise en compte des


interruptions immédiatement suivantes.

❑ Le bit I peut être directement positionné à 1 avec sei() et à 0 avec cli() reti() = return from
interrupt
❑ Les bits suivant sont cités pour mémoire, ils ne concernent pas les interruptions.

89
Arduino Pin Change Interrupts
There are three steps to using Pin change Interrupts.
1) Turn on Pin Change interrupts.
2) Chose which pins to interrupt on
3) Write an ISR for those pins.

Turn on Pin Change interrupts.


PCICR |= 0b00000001; // turn on port b
PCICR |= 0b00000010; // turn on port c
PCICR |= 0b00000100; // turn on port d
PCICR |= 0b00000111; // turn on port all ports

90
Arduino Pin Change Interrupts

Chose which pins to interrupt on


PCMSK0 |= 0b00000001; //turn on pin PB0, which is PCINT0, physical pin 14
PCMSK1 |= 0b00010000; //turn on pin PC4, which is PCINT12, physical pin 27
PCMSK2 |= 0b10000001; //turn on pins PD0 & PD7, which is PCINT16 & PCINT23

Write the ISR


ISR (PCINT0_vect) { } //port B, PCINT0 – PCINT7
ISR (PCINT1_vect) { } //port C, PCINT8 – PCINT14
ISR (PCINT2_vect) { } //port D, PCINT16 – PCINT23

91
Arduino Pin Change Interrupts exemple19

92
Arduino Pin Change Interrupts exemple20

93
❑ 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.

❑ Quelques limitations

✓ Lorsque vous utilisez une interruption, tout le programme se met en « pause » et la fonction
appelée dans l’interruption prend le relais.

✓ Ainsi, les fonctions de temps « delay() », « millis() » seront également stoppée.

✓ Veillez à bien faire attention dans vos programmes pour ne pas avoir de mauvaise surprise
94 !
❑ Que se passe-t-il si plusieurs interruptions surviennent en même temps ?

✓ 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é.

✓ L’ordre de priorité est donné dans la table ci-dessous.

✓ La source d’interruption située la plus en haut de la table est la plus prioritaire.

95
Les registres d’Interruption General Interrupt Control Register
❑ Quatre registres d’interruption existent dans l’ATMEGA,
Registre GICR (General Interrupt Control Register)

❑ Le registre GICR contrôle l’activation des interruptions externes et le déplacement de la table


des vecteurs d’interruption dans la mémoire.

❑ Le registre GIFR permet de connaître l’auteur de l’interruption INTx.

✓ Les deux premier bit (0 & 1) sont réservés à des applications spéciales et complexe du
microcontrôleur qui ne seront pas détaillé ici.
✓ Les bits 2, 3 et 4 ne sont pas utilisés (lu à 0).

INT1, INT0: External Interrupt Request 1 ou 0 Enable


Si ce bit est mis à 1 l’interruption externe est activée.
Les bits ISC11 et ISC10 dans le registre de contrôle MCUCR définit si le déclenchement se fait
sur un front montant ou descendant, même si le port est configuré en sortie.

INT2: External Interrupt Request 2 Enable


Si ce bit est mis à 1 l’interruption externe est activée.
Le bit ISC2 dans le registre de contrôle MCUCSR définit si le déclenchement se fait sur un96front
montant ou descendant, même si le port est configuré en sortie.
Les registres d’Interruption General Interrupt Control Register

IVSEL Interrupt Vector Select:


Quand ce bit est à 0, les vecteurs d’interruption sont placés au début de la mémoire FLASH.
Quand ce bit est mis à 1, les vecteurs d’interruption sont déplacés au début de la section du «
Boot Loader » de la mémoire FLASH.
Attention : ne pas modifier ce bit dans votre programme, il doit rester à 0.

IVCE Interrupt Vector Change Enable


Le bit IVCE doit être écrit à 1 pour permettre le changement du bit IVSEL, c’est une protection
pour éviter de bloquer le microcontrôleur.
IVCE est remis à 0 par le système quatre cycles d’horloge après ça modification ou quand
IVSEL est écrit.
Attention : ne pas modifier ce bit dans votre programme, il doit rester à 0.

97
Registre GIFR (General Interrupt Flag Register)
Le registre GIFR indique l’état des interruptions externes broche PD2 (INT0), PD3 (INT1) et
PB2v(INT2).

Les cinq premiers bits (0 à 4) ne sont pas utilisés (lu à 0).

INTF1, INTF0: External Interrupt Flag 1 ou 0

✓ Quand un changement d’état apparaît sur la broche INT1 (ou INT0) il déclenche une
interruption et INTF1 (ou INTF0) est mis à 1 si le bit dans SREG et le bit INT1 (ou INT0)
dans GICR est à un, le MCU sautera au vecteur d’interruption.

✓ Le drapeau est remis à 0 quand la routine d’interruption est exécutée. le bit peut être remis à 0
par le programme avant la fin de la routine d’interruption.

✓ Ce drapeau est toujours remis à 0 quand INT1 (ou INT0) est configuré en entrée
d’interruption.

98

Vous aimerez peut-être aussi