Comment faire une action à intervalle régulier ?

NIVEAU 2

Objectifs

  • Mettre en oeuvre un timer matériel dans le cadre d’une interruption
  • Créer des routines d’interruption

Pré-requis

Timer matériel

Tic, toc, tic, toc.. Voilà un Ticker ou timer matériel !

Principe de fonctionnement

Basé sur l’horloge interne de la carte de développement, ce module permet de générer une interruption à intervalle de temps donné. Pour cela, il utilise un composant de l’électronique numérique séquentielle : un compteur.

A chaque front montant d’un signal d’horloge, le compteur s’incrémente d’un pas de 1 entre 0 et une valeur limite \(N-1\). A chaque passage par \(N-1\), une interruption est générée sur le microcontroleur (voir tutoriel Faire une action instantanément lors d’un évènement externe) et le compteur se réinitialise à 0. Il recommence à compter.

Ainsi, en connaissant parfaitement la période d’application de l’horloge, on peut en déduire le temps qui s’est écoulé entre l’instant où le compteur valait 0 et le moment où il arrive à \(N-1\) : \(\Delta{}T = N \cdot T_H\).

Déclaration

L’ensemble des classes et des fonctions permettant de réaliser des opérations avec les modules du microcontroleur se trouvent dans la bibliothèque “mbed.h (ou “mbed-os.h“). Il est donc indispensable d’avoir au préalable inclut cette bibliothèque :

#include "mbed.h"

La première étape est la déclaration au compilateur de cet timer matériel. Il faut la placer après la déclaration des ressources externes (bibliothèques) et avant toute définition de fonction (voir tutoriel Tester ma première application sur Nucléo – Code d’exemple /* Déclaration des entrées/sorties */).

Ticker toggle_led_ticker; // Déclaration du ticker

Dans ce code, il y a deux notions importantes :

  • Ticker‘, la classe qui définit les objets de type timer matériel
  • toggle_led_ticker‘, le nom de la variable qui va être associée à cet objet

Routine d’interruption

Ce type d’objet génère ce qu’on appelle une interruption, c’est à dire un arrêt des instructions en cours d’exécution puis un déroutement vers un bloc d’instructions à exécuter à intervalle régulier. On appelle ce bloc d’instructions une routine d’interruption. Cette routine est une fonction spécifique qu’il faut déclarer et définir dans le code.

Par exemple, on peut déclarer le fonction suivante :

void toggle_led(void);    // Déclaration de la fonction d'interruption du ticker

void toggle_led() {       // Fonction d'interruption du ticker
    led1 = !led1;
}

Elle ne sera appelée nulle part dans le code. Elle sera exécutée lors d’un événement provoqué par le débordement du timer matériel associé.

Paramètrage du timer matériel

Enfin, il est nécessaire d’initialiser ce ticker. Cette initialisation permet d’attacher la routine d’interruption à laquelle il faut faire appel en cas de débordement du timer et également la période de répétition de cet événement (i.e. les paramètres temporels du timer matériel : fréquence d’horloge, valeur de N… pour avoir la meilleure approximation de la valeur souhaitée).

Pour cela il faut utiliser la fonction attach().
Dans l’exemple ci-dessous on associe la fonction toggle_led() au ticker toggle_led_ticker avec interruption chaque seconde.

toggle_led_ticker.attach(&toggle_led, 1);

Exemple

Voilà ci-dessous le code complet résultant des différentes parties de la description :

#include "mbed.h"

Ticker toggle_led_ticker; // Déclaration du ticker
DigitalOut led1(LED1);    // Déclaration de la sortie numérique
void toggle_led(void);    // Déclaration de la fonction d'interruption du ticker

int main() {
    // Initialisation du ticker attaché à la fonction (toggle_led) et l'intervalle de temps (en s)
    toggle_led_ticker.attach(&toggle_led, 1);
    while (1) {
        // Boucle Infinie
    }
}

void toggle_led() {       // Fonction d'interruption du ticker
    led1 = !led1;
}

On remarque dans ce code que la boucle infinie est vide. Elle est cependant essentielle pour limiter l’exécution d’une zone de la mémoire programme qui ne nous appartient pas…

Tutoriel lié

MInE Prototyper Prototyper avec Nucleo et MBED

Nucléo – Faire une action à intervalle régulier