Outils pour utilisateurs

Outils du site


start:arduino:interruptions

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
start:arduino:interruptions [2020/12/02 17:35] gerardadminstart:arduino:interruptions [2023/01/27 16:08] (Version actuelle) – modification externe 127.0.0.1
Ligne 2: Ligne 2:
  
 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é. 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é.
 +
 +
 +**Les interruptions** 
 +forment une caractéristique indispensable des processeurs modernes, puisqu’elles lui permettent de réagir à des événements internes ou externes qui surviennent sans prévenir, en faisant rediriger le flux d’exécution vers un bloc de code de gestion d’interruption. Une fois ce bloc exécuté, le programme reprend où il en était au moment de l’interruption. Dans les processeurs AVR, vous pouvez activer ou inhiber la réponse à une interruption en modifiant des bits dans les registres de contrôle. La description qui suit est spécifique au modèle ATmega168. Pour les autres modèles, vous irez d’abord consulter les tableaux de l’Annexe B, puis la documentation officielle Atmel.
 +
 +Le modèle ATmega168 propose deux entrées pour interruptions externes, INT0 et INT1. Vous pouvez les configurer pour provoquer une interruption sur un front montant, un front descendant ou un état Bas. Le registre de contrôle nommé EICRA permet de contrôler le  comportement exact. Les deux entrées INT0 et INT1 ont besoin d’une horloge d’entrées-sorties. Le mode interruption sur état Bas génère une interruption de façon répétée tant que l’entrée correspondante est maintenue à l’état Bas. 
 +
 +Les broches d’entrées-sorties de l’ATmega168 peuvent également servir de sources d’interruption. 
 +
 +Les interruptions sur changement de port portent le nom PCINT0 jusqu’à PCINT23, chacune étant associée à une des 24 broches d’entrées-sorties.
 +
 +Lorsqu’une interruption est autorisée, elle est déclenchée lorsque l’état de la broche change, même si cette broche est configurée comme sortie. C’est ce qui permet à une broche de générer une interruption sous le contrôle du logiciel lorsque le programme lui-même provoque le changement d’état de la broche (bien sûr, il faut que la détection d’interruption sur changement d’état du port soit active). Dès qu’une des broches entre PCINT0 et PCINT7 change d’état, elle déclenche  une interruption PC0. 
 +
 +Pour les broches PCINT8 à PCINT14, cela correspond à l’interruption PC1. 
 +
 +Enfin, les broches de PCINT16 à PCINT23 correspondent à l’interruption PC2. La configuration des broches qui déclenchent les interruptions en cas de changement d’état est réalisée par les registres PCMSK0, PCMSK1 et PCMSK2. Quand une interruption qui n’est pas masquée survient, le processeur va chercher la prochaine instruction à exécuter à l’adresse trouvée dans une table de vecteursen mémoire ; cette adresse contient une instruction machine de saut RJMP qui pointe vers le bloc de code incarnant la réaction à l’interruption. Une fois ce bloc exécuté, l’exécution reprend dans le programme normal, juste après l’interruption. La Figure ci-dessous montre comment la table des vecteurs d’interruption est exploitée pour rediriger le flot d’exécution vers le code de l’interruption puis revenir au programme principal.
 +
 +
 +{{ :start:arduino:interruptions.jpg?direct&400 |}}
  
 ==== Les broches d'interruptions ==== ==== Les broches d'interruptions ====
 +
  
 == Sur un Arduino Uno basé sur microcontrôleur AVR 328P == == Sur un Arduino Uno basé sur microcontrôleur AVR 328P ==
Ligne 46: Ligne 66:
  
 ^Paramètres^ remarques^  ^Paramètres^ remarques^ 
-|**interruption** |Identifiant de l'interruption. Ne doit pas  être confondu avec le numéro d'identification. 0 ou 1 pour Uno|+|**interruption** |0 ou 1 pour Uno. Identifiant de l'interruption. Ne doit pas  être confondu avec le numéro d'identification. |
 |**ISR**|Routine de service d'interruption. C'est la méthode qui sera exécutée lorsque l'interruption se produira.Appel de la fonction| |**ISR**|Routine de service d'interruption. C'est la méthode qui sera exécutée lorsque l'interruption se produira.Appel de la fonction|
 |**mode**|Provoque le déclenchement de l'interruption,  **FALLING:** Passage de l'état haut à l'état bas (détection d'un front descendent).** RASING:** Détection du front montant (Passage de l'état bas à l'état haut). **LOW:** Détection d'un passage à état bas de la broche. **CHANGE:** Lorsque la broche change d'état.  Les cartes DUE  permettent  **HIGH**.| |**mode**|Provoque le déclenchement de l'interruption,  **FALLING:** Passage de l'état haut à l'état bas (détection d'un front descendent).** RASING:** Détection du front montant (Passage de l'état bas à l'état haut). **LOW:** Détection d'un passage à état bas de la broche. **CHANGE:** Lorsque la broche change d'état.  Les cartes DUE  permettent  **HIGH**.|
Ligne 55: Ligne 75:
  
 Vous ne pouvez pas utiliser delay() ou millis() dans un ISR car ces méthodes elles-mêmes reposent sur des interruptions. Vous ne pouvez pas utiliser delay() ou millis() dans un ISR car ces méthodes elles-mêmes reposent sur des interruptions.
-Interruption sur le bouton presse+ 
 +Toute valeur modifiée à l’intérieur de la routine d’interruption devra être déclarée comme [[https://arduinogetstarted.com/fr/reference/arduino-volatile|volatile]], afin que le processeur aille chercher la valeur en mémoire et ne se fie pas à ce qui se trouve dans ses registres qui étaient gelés au moment de l’interruption.
  
  
Ligne 61: Ligne 82:
  
 == Exemple 1 BP avec Rebonds == == Exemple 1 BP avec Rebonds ==
 +Interruption sur le bouton presse
 +
 Cet exemple utilise un bouton-poussoir (commutateur tactile) connecté à la broche numérique 2 et à la masse, en utilisant une résistance de rappel interne pour que la broche 2 soit haute lorsque le bouton n'est pas enfoncé. Cet exemple utilise un bouton-poussoir (commutateur tactile) connecté à la broche numérique 2 et à la masse, en utilisant une résistance de rappel interne pour que la broche 2 soit haute lorsque le bouton n'est pas enfoncé.
  
/home/chanteri/www/fablab37110/data/attic/start/arduino/interruptions.1606926940.txt.gz · Dernière modification : 2023/01/27 16:08 (modification externe)