Bonjour. Il y a beaucoup de choses intéressantes à l'intérieur d'un microcontrôleur, en plus de la mémoire et de l'unité arithmétique. On va parler, aujourd'hui, des timers qui permettent de compter, comparer des durées et enregistrer l'instant d'un évènement. Alors, comment fonctionne un timer? Vous avez, à la base, un compteur, un compteur binaire comme on l'a déjà vu. Ce compteur doit avancer une certaine vitesse. Cette vitesse va venir d'une petite unité avec un aiguillage, ici, qui permet de choisir un signal extérieur. Ça vous permettrait de compter des évènements extérieurs. Mais en général, on utilise l'horloge interne que l'on peut prédiviser pour faire avancer ce compteur à la vitesse maximum, ou à la fréquence d'horloge divisée par huit, ou par 1024, et cetera. Donc, on trouve, dans un timer, des registres de contrôle, qu'on appelle TCCR, Timer Control Register, et comme il y a deux de ces registres huit bits, pour définir tous les bits nécessaires aux différents modes, on les appelle un et deux. Et puis, on a encore trois timers qui peuvent s'appeler A, B, C ou un, deux, trois suivant les fabriquants. Alors, le timer va compter. Si c'est un timer de huit bits, et bien, il va compter jusqu'à 256 et recommencer. Et ce qui nous intéresse avec les timers, c'est de savoir, quand ils arrivent à la valeur maximum, ils activent une bascule qui s'appelle timer overflow, TOV, et cette valeur va nous servir, à savoir, que le timer est arrivé à sa valeur maximum, et on ne va pas passer son temps à lire la valeur du compteur; on peut le faire, naturellement. Il va être relié sur le bus du microcontrôleur. Mais ce flag, sémaphore TOV, va nous permettre de prendre une décision sur quel temps on continue. Donc, ce qui se passe, c'est que on a TOV qui a, qui s'active, et là , on peut très bien décider de ne pas repartir de la valeur zéro, mais de partir d'une valeur que l'on va définir qui fait que le temps pour arriver jusqu'à l'action du TOV suivant sera plus court. Donc, on va pouvoir mesurer des durées en disant, et bien, j'aimerais avoir le prochain TOV dans tant de millisecondes. J'initialise cette valeur, et je surveille, maintenant, TOV, pour savoir quand le temps est écoulé. Alors, il faut naturellement remettre à zéro le TOV, chaque fois qu'on a préparé le cycle suivant. Ça peut se faire, éventuellement, automatiquement. Donc, chaque fabriquant de microcontrôleurs documente ce comportement et ça diffère légèrement d'un fabriquant à l'autre. Un autre fonctionnalité des timers, avec en régie supplémentaire, qui s'appelle output compare register, c'est de pouvoir comparer la valeur qui est en train d'évoluer avec une valeur fixe, et d'activer un autre flag, timer output compare en fonction de cette valeur. Donc, vous avez le timer qui augmente, et au moment où vous avez l'égalité avec le registre OCR, et bien, vous avez le signal TOC qui s'active. Le timer continue, quand il arrive à la valeur maximum, c'est le TOV qui s'active. Et typiquement, on peut imaginer une petite logique, ici, qui va activer le signal à , quand on a le TOC, le désactiver quand on a le TOV, et on vient de générer du PWM, que l'on réexpliquera plus tard. Des impulsions d'une certaine longueur qu'on peut modifier qui se répètent en fonction de bits de contrôle qui sont là , puisque parfois on peut s'intéresser au TOC tout seul, au TOV, au PWM, à d'autres fonctionnalités qu'un peu de logique va mentionner. On peut encore améliorer les choses, en mettant deux registres OCR avec deux comparateurs de bascule de type TOC, et puis permettre des générations de signaux encore plus intéressantes. Alors, une autre fonctionnalité, c'est d'avoir un registre qui va mémoriser un instant. Il peut se passer quelque chose d'intéressant sur une pin qui va photographier, dans le fond, la valeur du compteur, et on pourra savoir à quel moment on a eu une transition sur cette pin, passage de zéro à un, passage de un à zéro, changement de nouveau. C'est dans des registres de commandes que l'on pourra définir le comportement logique qu'il y a entre la pin et puis l'action de transfert. Et au moment où cette action de transfert s'effectue, et bien, vous avez une bascule TIC, timer input capture flag, qi va permettre à votre logiciel de savoir que l'évènement s'est produit et que vous pourrez aller regarder sa durée. Donc, pour mesurer une durée d'impulsion, et bien, il y a un moment donné, où mon impulsion démarre, ici. J'en mets le compteur-timer à zéro. Ce compteur-timer augmente et au moment où la pin s'active, et bien, vous mémorisez cette valeur, vous activez le flag, et vous pourrez traiter cette information. Alors voilà , dans les grandes lignes, les trois fonctionnalités de base, dans le fond, des timers. Et ce que l'on vient d'expliquer, c'est que dans le cas simple, vous avez ce flag qui s'active et que vous devez surveiller par programmation. Et naturellement, euh, surveiller sans arrêt le flag TOV est quelque chose qui prend beaucoup trop de temps dans votre programme. Donc, on va trouver un autre mécanisme. Ce mécanisme, c'est l'interruption, dont on reparlera plus en détails, et pour vous donner une première idée de l'avantage de cette technique, et bien, on va, donc, avec une petite logique et des bits supplémentaires, générer un signal à l'intérieur du processeur qui va forcer l'appel d'une procédure qui va faire le travail; on l'aurait fait dans le programme principal en surveillant ce flag TOV. Alors, les interruptions, il faut d'une part, les activer. Donc, on les veut pas toujours, et il y a une porte ET avec général interrupt enable qui va autoriser les interruptions. Elles peuvent venir de différents endroits. Donc ici, c'est le TOV que l'on va activer avec un TO interrupt enable, et si ces deux portes sont activées, au moment où le TOV passe à un, vous avez cette interruption. Alors, du point de vue programmation, vous avec un setup dans lequel il faut remplir tous ces registres qui vont définir le comportement. Donc là , la documentation du fabriquant, euh, fait plusieurs pages et il faut, euh, s'habituer à la lire et suivre l'explication, euh, qui justifie tous ces petits bits à mettre, euh, dans ces registres. Vous avez une fonction, euh, dans, dans le cas d'Arduino, elle s'écrit sei pour activer, euh, l'interruption, et la routine d'interruption est préparée aussi par Arduino et à cette forme, dans le cas des, euh, des ATMega 368, par exemple. Au moment, donc, où il y a eu l'interruption, on est rentré dans cette routine, le TOV a été automatiquement remis à zéro, et qu'est-ce qu'on fait? On va mettre dans le compteur, une valeur qui vaut 62. Ce 62 est calculé, d'aprés le pré-diviseur, d'après la fréquence du processeur pour avoir une durée de 100 microsecondes. Voilà , ça sera la durée pour retrouver le prochain TOV. Et maintenant, toutes les 100 microsecondes, et bien, on va pouvoir décider ce qu'on fait. On peut rajouter des timers, on peut rajouter des servos. On peut mettre des boucles qui ne sont pas des boucles d'attentes, qui sont des boucles de comptage pour dire, et bien, c'est pas toutes les 100 microsecondes que je veux quelque chose, c'est toutes les 1000 fois 100 microsecondes. Ce qui veut dire que tous les dixièmes de seconde, et bien, je pourrai faire quelque chose en mettant simplement un compteur, en décidant, ici, le compteur, euh, va déclencher une action toutes les quatre millisecondes, par exemple, pour agir sur un moteur, et cetera. Donc là , on sent qu'il y a une très grande efficacité de ces routines d'interruptions, et on en reparlera en détails. Au niveau d'Arduino, par exemple, vous avez trois timers : Le timer zéro qui est huit bits est utilisé pour mesurer des temps, euh, vous avez millis, vous avez micros qui est, c'est en fait, un compteur qui part de zéro, qui est, qui est mis à jour par l'interruption. Delay est bloquant, mais c'est quand même géré par un timer. Le timer un est 16 bits. Le timer deux, qu'on vient d'utiliser est huit bits. Euh, ces deux timers ont des canaux PWM, comme on les a évoqués. Mais la fonction analogWrite, euh, propose plus de timers, puisqu'en fait, chaque fois que vous avez une interruption, vous pouvez, dans la routine d'interruption, faire des tas de choses, et voire, gérer plusieurs PWM par logiciels et pas directement par la circuiterie de timers. Dans le timer deux, vous avez une fonction tone qui va bloquer le timer, puisque cette fonction tone, c'est ce qui permet de faire de la musique, de, de faire une fréquence, ou vous donner simplement, la valeur de la fréquence dans la procédure. Donc, nous avons vu comment utiliser ces timers à l'intérieur du processeur, avec la possibilité de compter des durées, avec la possibilité de comparer, pour avoir un signal répétitif, c'est le output compare. De pouvoir photographier, dans le fond, le compteur pour connaître la durée d'un, d'un évènement, et ceci implique, au niveau du processeur, de manipuler en relativement une grand quantité de bits, de flags, et de les gérer correctement en lisant une dizaine de pages de documentation. Heureusement, certains ont fait le travail pour vous et vous fournissent des librairies qui facilitent ensuite la programmation.