Utilisation d'un timer

Icône de l'outil pédagogique Les Timers...

Pour compter le temps ou des événements, les micro-contrôleurs disposent de blocs spécialisés, des timers. Un timer est constitué d'un compteur dont on peut ajuster l'horloge, lire la valeur et écrire la valeur. Les timers sont capables de générer des interruptions mais nous ne verrons pas cet aspect là dans ce cours.

Nous allons donner un exemple d'utilisation du Timer0 du PIC18F4550. Pour programmer ce timer, nous nous servirons de la bibliothèque standard fournie avec le compilateur C. Il faudra donc inclure le fichier timers.h avec le code suivant :

#include <timers.h>

La fonction qui permet d'initialiser le timer est OpenTimer0.

Cette fonction est documentée dans MPLAB C18 Libraries Documentation chapitre 2.9


Exemple d'initialisation du timer0 :

OpenTimer0( TIMER_INT_OFF & // désactive les interruptions

T0_16BIT & // configure sur 16 bits

T0_SOURCE_INT & // utilise l'horloge interne

T0_PS_1_256 // divise l'horloge par 256

);

Dans nos exemples, nous désactiverons toujours les interruptions. Nous utiliserons toujours le timer sur 16 bits (comptage de 0 à 65535) car sur 8 bits, le comptage est plus limité (0 à 255). Nous utiliserons l'horloge interne et alors, dans ce cas, le timer reçoit une horloge à 12 MHz pour notre carte électronique. Enfin, nous choisirons le diviseur d'horloge (prescale value) en fonction du temps à compter. Pour le timer0, les valeurs possibles sont 1, 2, 4, 8, 16, 32, 64, 128 ou 256.

Quand le timer est initialisé, il compte continuellement. Il faut donc pouvoir fixer sa valeur à un instant particulier dans le programme, par exemple pour pouvoir le mettre à 0. Pour cela, nous utiliserons la fonction WriteTimer0.

Pour mettre le timer à 0, il suffit d'écrire :

WriteTimer0(0);

Pour lire le timer, la fonction ReadTimer0 retourne la valeur. On peut ainsi effectuer une boucle pour attendre qu'un certain temps se soit écoulé. Avec la configuration précédente, le timer compte à 12 MHz divisé par 256, c'est-à-dire à 46875 Hz. En partant de 0, une seconde sera écoulée quand il atteindra 46875. Pour attendre une seconde, on écrira :

while (ReadTimer0() < 46875);

De la même manière, pour attendre une demi seconde, il faudra atteindre 23438. On écrira :

while (ReadTimer0() < 23438);

 

Pour faire clignoter la led raccordée sur A6 à la fréquence de 1 Hz (éteinte pendant 0,5 s et allumée pendant 0,5 s), on peut écrire le programme suivant :

#include <p18f4550.h>

#include <timers.h>

void main(void)

{

// initialisation

TRISA &= 0xBF; // A6 en sortie

OpenTimer0(
TIMER_INT_OFF & // désactive les interruptions
T0_16BIT & // configure sur 16 bits
T0_SOURCE_INT & // utilise l'horloge interne

T0_PS_1_256 // divise l'horloge par 256
);

 

// boucle infinie

while (1) {

// on répète infiniment
WriteTimer0(0); // mise à 0 du timer
while (ReadTimer0() < 23438); // attente 0,5 s
PORTA |= 0x40; // on éclaire la LED
WriteTimer0(0); // mise à 0 du timer
while (ReadTimer0() < 23438); // attente 0,5 s
PORTA &= 0xBF; // on éteint la LED

}

}

Attention, si le temps écoulé ne semble pas correspondre exactement, la simulation n'est peut-être pas parfaitement en temps réel en fonction des performances de votre ordinateur.

Le temps écoulé en simulation pour le micro-contrôleur est indiqué en bas à gauche de la fenêtre du simulateur.