Professional Documents
Culture Documents
1. Principe de fonctionnement
Rôle : Réaliser une temporisation
Elément essentiel : Compteur qui s'incrémente à chaque front montant du signal qui lui est appliqué
-Lorsque le compteur dépasse la valeur maximale qu'il peut contenir (par exemple : 256 pour un
compteur sur 8 bits), un drapeau (flag en anglais) se lève.
-Ce drapeau a pour but d'indiquer au programme que le compteur a débordé (c'est à dire qu'il a fini de
compter). De la même manière que pour la boite aux lettres, c'est au programme de rebaisser le drapeau
pour recommencer un cycle de comptage (ça ne se fait pas tout seul !).
2. Méthodes de configuration
Un Timer doit pouvoir compter un temps défini par le programme (par exemple 1ms, 10ms, 50ms,
etc.). Pour cela, 2 paramètres peuvent être modifiés :
_ La fréquence du signal applique au compteur : Le compteur s'incrémentera ainsi plus ou moins vite.
_ Le nombre d'impulsions à compter : Le drapeau se lève toujours lorsqu'il y a débordement, on peut
donc faire partir le compteur d'une valeur non nulle pour réduire le temps de comptage.
Modification de la fréquence du signal applique au compteur : le pré-diviseur (prescaler en anglais)
Exemple : pour compter 4 fois moins vite
Modification du nombre d'impulsions à compter
_ Si le compteur démarre à 0, il mettra beaucoup de temps à atteindre sa valeur maximale.
_ Pour réduire le temps de comptage, on peut donc charger une valeur initiale non nulle dans le
compteur.
_ Exemple : Valeur initiale égale à 250
Calcul du temps mis par le Timer pour faire lever son drapeau :
- Il faut également faire démarrer le compteur avec la valeur la plus petite possible pour qu'il
compte le nombre d'impulsion le plus grand : valeur initiale = 0.
Code-source 3
unsigned short cnt; // Définir la variable cnt
void interrupt()
{
cnt++ ; // Interruption cause l’incrémentation par 1 de la variable cnt
PIR1.TMR1IF = 0; // Remise à 0 bit TMR1IF
TMR1H = 0x80;
TMR1L = 0x00; // Valeurs initiales du TMR1H and TMR1L
}
void main()
{
ANSEL = 0; // Broches E/S sont configure en numériques
ANSELH = 0;
PORTB = 0xF0; // Initialisation de PORTB
TRISB = 0; // PORTB est configuré en sortie
T1CON = 1; // Remise à 1 du TMR1
PIR1.TMR1IF = 0; // Remise à 0 du TMR1IF
TMR1H = 0x80; // Initialisation du TMR1
TMR1L = 0x00;
PIE1.TMR1IE = 1; //Activer l’interruption en cas de débordement du TMR1
cnt = 0; // Remis à 0 la variable cnt
INTCON = 0xC0; // Activer interruption (bits GIE et PEIE)
do
{ // Boucle sans fin
if (cnt == 76)
{
PORTB = ~PORTB; //Bits du PORTB sont inversés après 76 d’interruptions
cnt = 0; // Initialisation de la variable cnt
}
}
while (1);
}