Retour Suite
sylvainmahe.site LE SITE de Sylvain Mahé contact@sylvainmahe.site
Article : Sylvain Mahé contact@sylvainmahe.site Les interruptions avec InterruptRead.h Les interruptions permettent d'interrompre le déroulement normal d'un programme afin d'effectuer une tâche à un moment précis, puis de continuer l'exécution du programme là où il s'était arrêté. La classe InterruptRead.h permet de détecter un front montant et/ou descendant (passage de 0V à +5V ou inversement) sur les broches du microcontrôleur concernées par les interruptions. Ports des automates programmables concernés par les interruptions : Automate programmable MODULABLE 20 :
- Port 3 (PD2)
- Port 4 (PD3)

Automate programmable MODULABLE 32 :
- Port 3 (PB2)
- Port 11 (PD2)
- Port 12 (PD3)
L'utilité d'un tel système est de pouvoir déceler un changement d'état d'un port du microcontrôleur au moment même où il se produit. Il n'est alors plus nécessaire d'attendre une lecture de l'état du port concerné au sein même d'une boucle de vérification, comme c'est le cas avec la classe GpioRead.h (cette dernière solution produisant une latence suivant la vitesse d'exécution totale de votre boucle de calcul). Grâce à ce système, il vous est par exemple possible de quantifier et de mesurer précisément la périodicité d'un phénomène physique externe qui changerait spontanément d'état (dans les limites techniques imposées par la programmation et le microcontrôleur bien entendu). Exemple d'utilisation de InterruptRead.h : #include <InterruptRead.h> void myEvent() { //un front montant a été détecté sur le port 3 } int main() { InterruptRead myInterrupt = InterruptRead (3); myInterrupt.start (myEvent, true, false); while (true) { } return 0; } Dans cet exemple, un objet myInterrupt de type InterruptRead est déclaré, en paramètre est indiqué d'utiliser le port numéro 3 de l'automate programmable en entrée, puis afin de démarrer la lecture du port concerné, cet objet myInterrupt appelle la fonction start prenant plusieurs paramètres :
- Le 1er paramètre myEvent est le nom de la fonction déclarée en amont qui va servir à exécuter du code quand l'interruption interviendra.
- Le 2ème paramètre true permet de détecter les fronts montants sur le port.
- Le 3ème paramètre false indique de ne pas détecter les fronts descendants sur le port.
Même si vous n'avez pas besoin d'exécuter des instructions dans la boucle while, cette dernière reste importante car elle permet au microcontrôleur de continuer l'exécution du code (soit l'écoute des interruptions). Dans le cas contraire, l'exécution terminerait après return 0;, et le microcontrôleur s'arrêterait là de sorte que plus aucune interruption ne pourrait être exécutée ! Cette classe dispose également d'une fonction stop qui permet de stopper la lecture des fronts montants et/ou descendants sur le port concerné. Récapitulatif des fonctions de cette classe : InterruptRead (const unsigned char PIN); void start (void functionJump(), const bool RISING, const bool FALLING); void stop(); Mesure de la périodicité d'un phénomène : La spontanéité du principe même des interruptions (quelques cycles d'horloges tout au plus) permet de mesurer avec une relative précision (pour le microcontrôleur utilisé) un phénomène périodique, avec quelques restrictions cependant : La durée de la période doit être supérieure au temps d'exécution des fonctions mises en œuvre dans le programme (nous ne sommes pas en matériel pur, mais bien en logiciel). Exemple de mesure d'un phénomène périodique : #include <InterruptRead.h> #include <Period.h> Period _myPeriod = Period(); void myEvent() { _myPeriod.state(); } int main() { InterruptRead myInterrupt = InterruptRead (3); myInterrupt.start (myEvent, true, false); while (true) { //_myPeriod.s est la période mesurée en secondes //_myPeriod.ms est la période mesurée en millisecondes //_myPeriod.us est la période mesurée en microsecondes } return 0; } Dans cet exemple j'utilise la classe Period.h qui est dédiée à ce type de tâche bien spécifique, mais il est tout à fait possible de programmer cela avec la classe Timer.h, qui via une simple soustraction du temps écoulé courant par rapport au temps écoulé précédent remplirait la même fonction. Period.h offre l'avantage d'avoir ce principe intégré dans son fonctionnement ce qui simplifie la programmation. Ce programme pourrait être associé à un capteur à effet Hall connecté au port 3 de l'automate programmable, ce qui permettrait par exemple de mesurer la période de rotation d'un moteur électrique ou thermique (et d'en déduire le nombre de tours par minute). De nombreuses applications et montages sont possibles avec les interruptions, pour ne citer encore qu'un exemple, c'est avec ce principe que je détecte la fermeture du tube sur mon compteur Geiger, ce qui permet ensuite d'extrapoler et d'estimer la radioactivité en rapport au temps écoulé...