Exécution de deux tâches en parallèle : utilisation d'un timer

Vous allez maintenant utiliser l'un des timers du micro-contrôleur pour faire clignoter les 2 LEDs en parallèle.

Placez-vous dans le répertoire exo2 et commencez par écrire le code de la fonction task_led_red qui fait clignoter la LED rouge toute les 200 ms (i.e., la LED est allumée pendant 200 ms, puis éteinte pendant 200 ms). Cette fonction est appelée dans la boucle de la fonction main. Testez le bon fonctionnement.

Afin de faire clignoter la LED jaune toutes les 400 ms en parallèle (i.e., le LED est allumée pendant 400 ms, puis éteinte pendant 400 ms), nous allons utiliser un timer. À chaque cycle de l'horloge, un compteur est incrémenté et il est comparé à la valeur se trouvant dans un registre (registre OCR1A dans notre cas). Si ils sont égaux, une interruption est générée. Le programme est alors dérouté pour exécuter la fonction correspondante et le compteur est réinitialisé. Les fonctions d'interruptions, dans le cas d'un micro-contrôleur AVR et de l'utilisation de avr-gcc sont nommées ISR et prennent en paramètre le vecteur d'interruption correspondant (TIMER1_COMPA_vect dans notre cas). Le timer est initialisé avec un prescaler de 1024, cela signifie que le compteur est incrémenté tous les 1024 cycles. L'arduino est cadencé à 16 MHz. Vous pouvez donc déterminer la valeur du nombre pour initialiser le registre OCR1A) afin que la fonction d'interruption soit appelée toutes les 400 ms. Cette fonction réalisera ainsi le changement d'état de la LED jaune. Pour activer les interruptions vous devez appeler la fonction sei(). Pour désactiver les interruptions, la fonction est cli().

Réalisez et testez le programme.

Grâce à l'utilisation du timer, vous avez pu réaliser ainsi deux tâches qui s'exécutent en parallèle.

thomas 2013-11-21