Académique Documents
Professionnel Documents
Culture Documents
Chapitre 3
1
Plan
❑ Introduction (3-6)
❑ Cinq choses que vous devez savoir sur les interruptions Arduino (13-
19)
3
Introduction exemple1
This is Polling
4
Introduction
❑ Qu'est-ce que les 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.
❑ 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).
❑ 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.
❑ 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é.
❑ 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 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.
❑ 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é.
11
Interruptions internes et externes
❑ Plusieurs choses sont à faire pour configurer et utiliser les interruptions :
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.
4) Variables volatiles
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.
❑ 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.
❑ 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.
❑ 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.
❑ 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.
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
❑ 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.
❑ 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
❑ 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)
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.
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.
❑ 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?
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.
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.
✓ 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)
✓ 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
✓ 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(...).
38
Mode: indique ce qui va provoquer l’interruption.
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
❑ Par exemple, sur UNO, la broche D2 de la carte est l'interruption 0 (INT0_vect de la table
d’interruptions).
❑ Cependant, le second est plus facile à lire et plus portable pour différents types d'arduino.
40
Exemple de bouton avec interruption exemple4
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.
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.
❑ 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
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.
✓ Choix niveau bas : l'interruption dure aussi longtemps que le niveau est maintenu à l'état bas.
✓ 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.
❑ 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.
❑ 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.
❑ 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)
❑ 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.
59
External Interrupt Mask Register
❑ 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.
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é.
❑ 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.
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.
❑ 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
❑ 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.
83
Pin Change Interrupt Flag Register : PCIFR
❑ 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.
84
Pin Change Interrupt Flag Register : PCIFR
❑ 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.
85
Pin Change Mask Register 2: PCMSK2
❑ 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
❑ 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
❑ 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.
❑ 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.
90
Arduino Pin Change Interrupts
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 ?
✓ 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.
❑ 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.
✓ 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 ?
✓ Par exemple, les interruptions externes sont plus prioritaires que les interruptions des Timers.
95
Les registres d’Interruption General Interrupt Control Register
❑ Quatre registres d’interruption existent dans l’ATMEGA,
Registre GICR (General Interrupt Control Register)
✓ 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).
97
Registre GIFR (General Interrupt Flag Register)
Le registre GIFR indique l’état des interruptions externes broche PD2 (INT0), PD3 (INT1) et
PB2v(INT2).
✓ 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