Vous êtes sur la page 1sur 9

Youssef Lahmadi

Prosit n°6 : Interrompez-moi !

A/ Rôles :
Animateur : Victor
Secrétaire : Kaci
Gestionnaire : Emré
Scribe : Adrien

B/ Mots-clés :
● ALU
● Librairie software
● interruption
● Protocole de communication STI
● Horloge RTC
● Port série
● Port analogique

C/ Contexte :
Capable de récupérer les données des capteurs mais on arrive pas à identifier le
changement de mode

D/ Problèmes :
● Comment gérer le passage entre les différents modes ?
● Comment interrompre l'acquisition de données pour changer de mode ?
● Comment gérer le temps de pression du bouton ?

E/ Contraintes :
● Se baser sur le code donné
● Le microcontrôleur à une seule ALU

F/ Livrable :
● Faire un programme gérant les interruptions
● Un modèle du circuit (Tinkercad ou physique)

G/ Généralisation :
Interruption des microcontrôleurs

H/ Pistes de solutions et hypothèses :


● Gérer le multitasking
● Le branchement donné est à modifier
● Changer la structure du programme
Youssef Lahmadi

● Utiliser les interruptions pour détecter si le bouton est pressée


● Utiliser la librairie softwareserial

I/ Plan d’actions :
I. Définition des mots-clés
II. Ressources :
a. interruptions
b. Registres
III. Etudier le circuit
IV. Analyser comprendre et modifier les différents programmes fournis
V. Validation des hypothèses
VI. Conclusion
Définition des mots clés  :
● Librairie software : : En informatique, une bibliothèque logicielle est une collection
de routines, qui peuvent être déjà compilées et prêtes à être utilisées par des
programmes.
● Interruption : Action d'interrompre ; état de ce qui est interrompu. Arrêt, coupure,
suspension
● Protocole de communication STI :
● Horloge RTC : Une horloge en temps réel (RTC) est une horloge d'ordinateur,
généralement sous la forme d'un circuit intégré qui est uniquement conçu pour
garder l'heure.
● Port série : En informatique, un port série est une interface de communication
série à travers laquelle les informations sont transférées dans ou hors de
manière séquentielle, un bit à la fois.
● Port analogique : : Port sur le côté du Arduino, permet de recevoir le signal
analogique en numérique.

Analyse des ressources  :

Caractéristique Arduino  :

 Microcontrôleur : Micropuce ATmega328P [7]
 Tension de fonctionnement : 5 volts
 Tension d'entrée : 7 à 20 volts
 Broches d'E/S numériques : 14 (dont 6 peuvent fournir une sortie PWM)
 Broches PWM : 6 (Broche n°3, 5, 6, 9, 10 et 11) [9]
 UART : 1
 I2C : 1
 IPS : 1
 Broches d'entrée analogique : 6
 Courant CC par broche d'E/S : 20 mA
 Courant CC pour broche 3,3 V : 50 mA
 Mémoire Flash : 32 Ko dont 0,5 Ko utilisé par le bootloader
 SRAM : 2 Ko
 EEPROM : 1 Ko
 Vitesse d'horloge : 16 MHz
Youssef Lahmadi

 Longueur : 68,6 mm
 Largeur : 53,4 mm
 Poids : 25g
 En-tête ICSP : Oui
 Sources d'alimentation : prise d'alimentation CC et port USB

Lorsque on souhaite modifier la luminosité d'une LED ou encore pour changer les couleurs


d'une LED, il est nécessaire d'avoir une variation de la tension. Cette variation de la
tension est réalisable avec certaines sorties digitales appelés broche PWM

Les ISR  :
Signifie « Interrupt Service Routine ». Un ISR (également appelé gestionnaire
d’interruptions) est un logiciel processus invoqué par une demande d'interruption
d'un matériel dispositif.
Il gère la demande et l'envoie à la CPU, interrompant l'actif processus. Une fois l’ISR
terminé, le processus reprend.
Un exemple de base d'un ISR est une routine qui gère clavier événements, tels que
l'appui ou le relâchement d'une touche. Chaque fois que vous appuyez sur une touche,
l’ISR traite le contribution. Par exemple, si vous maintenez la touche de direction droite
enfoncée dans un fichier texte, l'ISR signalera à la CPU que la touche de direction droite
est enfoncée. La CPU envoie cette information à la personne active traitement de
texte ou un programme d’édition de texte, qui déplacera le curseur à droite. Lorsque
vous relâchez la clé, l'ISR gère l'événement "clé en haut". Ceci interrompt le précédent
état "touche enfoncée", qui indique au programme d'arrêter de déplacer le curseur.

Les interruptions :
L’Arduino exécute son programme en séquence, instruction par instruction, dans l’ordre.
Certaines instructions permettent de rompre cet ordre :
Les instructions conditionnelles comme le  if
... else  
ou les instructions de boucle comme le  for(...) .
Mais l’Arduino reste sur ses rails et respecte les instructions qui lui sont données.
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.
Il existe plusieurs sources d’interruption, on dit également vecteur d’interruption, sur
l’AVR ATmega 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
Youssef Lahmadi

externes. Les interruptions liées au timers, des compteurs internes à l’Arduino qui
permettent de compter le temps de manière précise sont également intéressantes et feront
l’objet d’un autre article.
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.
Plusieurs interruptions dans le 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.

Les interruptions INT0 et INT1  :


Ces deux interruptions sont les plus faciles à utiliser. INT0 correspond à la broche 2 des
Arduino a base d’AVR ATmega 328 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 :

Où  numéro  est le numéro de l’interruption externe. Il s’agira de 0 ou 1 sur un Arduino


Uno/Nano, ce qui correspond respectivement aux broches 2 et 3. Sur un Arduino Mega, les
numéros 0 à 5 seront possibles et correspondent, dans l’ordre, aux broches 21, 20, 19, 18, 2
et 3.
Mais on préférera l’appeler en utilisant la fonction
d’aide  digitalPinToInterrupt  qui prend comme argument le numéro de
broche et renvoie le numéro d’interruption. Ceci permet de ne pas avoir à se référer à la
documentation pour retrouver à quelle broche correspond une interruption. L’appel
de  attachInterrupt  devient donc :
Youssef Lahmadi

Détaillons ses arguments.


broche est la broche correspondant à l’interruption externe. C’est à dire 2 ou 3 sur un
Arduino Uno/Nano et 2, 3, 18, 19, 20 et 21 sur un Arduino Mega.
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,
comme ceci :  void maRoutine() { ... } .

Mode indique ce qui va provoquer l’interruption. Les valeurs possibles pour mode sont :


 LOW : l’interruption est déclenchée quand la broche concernée est LOW. 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. Pendant ce temps,  loop()  ne sera pas exécuté.
 CHANGE : l’interruption est déclenchée quand la broche concernée change d’état,
c’est à dire passe de LOW à HIGH ou bien de HIGH à LOW. Il s’agit d’un
événement.
 RISING : l’interruption est déclenchée quand la broche concernée passe de LOW à
HIGH. Il s’agit également d’un événement.
 FALLING : l’interruption est déclenchée quand la broche concernée passe de HIGH
à LOW. Il s’agit encore d’un événement.
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.
Supposons que l’on veuille provoquer l’exécution de la routine
d’interruption  maRoutine  lorsque le signal sur la broche 2 passe
de  HIGH  à  LOW .  maRoutine  est définie comme suit :

O
n appellera  attachInterrupt  de la manière suivante :

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


de la source d’interruption. Son prototype est le suivant :
Youssef Lahmadi

Où  numero  est le numéro d’interruption, 0 ou 1 sur un Arduino Uno, 0 à 5 sur un Arduino
Mega.
Ici aussi, il est préférable d’utiliser  digitalPinToInterrupt  pour se
dispenser d’avoir à se rappeler de la correspondance broche → numéro d’interruption. Il est
donc recommandé d’appeler  detachInterrupt  de la manière suivante :

Les interruptions externes PCINT0, PCINT1 et PCINT2   :


Ces interruptions externes offrent moins de possibilités que celles que nous avons vues au
paragraphe précédent.
Tout d’abord, les 3 sources PCINT0, PCINT1 et PCINT2 sont partagées par plusieurs
broches. PCINT0 correspond aux interruptions externes sur les broches 8 à 13, PCINT1 aux
interruptions externes sur les broches A0 à A5 et PCINT3 aux interruptions externes sur les
broches 0 à 7. On peut noter que les broches 2 et 3 sont donc partagées entre PCINT3 et
INT0 et INT1. On ne peut donc à la fois bénéficier de INT0 et INT1 et des interruptions
PCINT3 sur les broches 2 et 3
Comme la même ISR est exécutée pour toutes les broches qui partagent sa source
d’interruption, la discrimination de la broche qui a engendré l’interruption, ou des broches en
cas de changements simultanés, doit être faite dans la routine d’interruption.
Ensuite, la richesse des modes de déclenchement de INT0 et INT1 n’existent pas pour les
sources PCINTx. Le seul mode est l’interruption sur changement d’état, LOW vers HIGH et
HIGH vers LOW. Par conséquent si seul l’un des changements d’état intéresse le
programme, il faut également discriminer en allant lire l’état de la broche qui a déclenché
l’interruption.
Heureusement il existe une bibliothèque qui gère toutes ces situations et qui permet, d’une
part, de retrouver une souplesse et une richesse comparable à celle de INT0 et INT1 et,
d’autre part, de masquer la complexité du matériel.
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 à 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  :
La bibliothèque fournit les fonctions :
Youssef Lahmadi

On voit que alors que les


fonctions  attachInterrupt  et  detachInterrupt  relatives à INT0 et
INT1 prennent comme premier argument le numéro de
l’interruption,  PCintPort::attachInterrupt  et  PCintPort::de
tachInterrupt  prennent comme premier argument le numéro ou l’identifiant de la
broche. Les autres arguments sont identiques.
Et

où l’unique argument est la broche.


Un exemple est fourni dans le programme ci-dessous où les broches auxquelles les ISR
sont attachées sont A1, A2, A3 et A4. Une exploration plus détaillée de cette bibliothèque
fera l’objet d’un futur article.
Un exemple d’utilisation des interruptions PCINTx est la surveillance d’un grand nombre de
pédales qui sont fréquemment mises en œuvre par des ILS. Voici par exemple un
programme test qui gère 4 ILS. Les ILS sont connectés sur les entrées A1 à A4
programmées en entrées numériques avec pull-up. Voici une implantation sur breadboard
de ce montage très simple.
Youssef Lahmadi

Livrable  :

J’ai créé un bascule qui permet de passer le flag a 0 quand il est à 1 et l’inverse . C’est cette
fonction qui fait l ’interruption . Dans le void loop on appelle l’acquisition et également l’allumage
de la LED si le bouton est appuyé5 secondes

Validation des hypothèses  :


● Gérer le multitasking
Youssef Lahmadi

● Le branchement donné est à modifier


● Changer la structure du programme
● Utiliser les interruptions pour détecter si le bouton est pressée
● Utiliser la librairie softwareserial

Vous aimerez peut-être aussi