TD4: Timers et ordonnancement

Prise en main d'un timer

Dans cette partie, nous allons démarrer le TIMER1 et afficher ses valeurs. Vous pourrez notamment vous aider de la section 15.11 de la Datasheet de l'ATmega328P.

Paramétrez le timer de manière à ce que sa valeur plafond (TOP) soit de 0xFFFF. Vous utiliserez le mode de fonctionnement Normal avec un pescaler à 1024

Quelle est la fréquence de débordement du timer ?

À l'aide de votre implémentation de la communication série, affichez la valeur du timer TCNT1. Vérifiez que les valeurs que vous obtenez correspondent bien à la fréquence de débordement prévue.

Implémentation de la system_clock()

Toujours à l'aide du timer TIMER1, nous allons implémenter une fonction uint32_t system_clock() qui retourne le nombre de millisecondes écoulées depuis le démarrage du microcontrôleur.

L'objectif sera d'atteindre une fréquence de déborde de 1000Hz, soit une période de 1ms. Nous utiliserons le mode CTC afin de pouvoir régler la valeur du plafond.

Déterminez le prescaler et la valeur du plafond à utiliser pour obtenir une fréquence de débordement de 1000Hz.

Activez une interruption sur le débordement du timer. Indice: vous utiliserez le vecteur d'interruption TIMER1_COMPA_vect.

Implémentez la fonction system_clock(). Vous utiliserez une variable globale system_clock_ms qui sera incrémentée à chaque débordement du timer.

Testez votre implémentation en affichant la valeur de system_clock() à l'aide de la communication série.

Ordonancement coopératif

En suivant le principe de l'ordonancement coopératif, créez un firmware qui réalise simultanément les deux tâches suivantes:

  • Fais clignoter la LED de la carte à une fréquence de 1Hz,
  • Demande à l'utilisateur de saisir un message et lui renvoie lorsqu'il appuie sur la touche entrée.

Vous pourrez vous aider de l'exemple donné en cours pour le clignotement de la LED, et implémenter echo_init() et echo_tick() pour réaliser une tâche d'écho sur le même modèle.

Correction