Vous êtes sur la page 1sur 34

Les Timers

1
Principe de fonctionnement
Rle : Raliser une temporisation
lment essentiel : Compteur qui s'incrmente
chaque front montant du signal qui lui est
appliqu :

2
Principe de fonctionnement
Lorsque le compteur dpasse la valeur
maximale qu'il peut contenir (par exemple : 256
pour un compteur sur 8 bits), un drapeau (flag
en anglais) se lve.

253 254 255 0

3
Principe de fonctionnement

Ce drapeau a pour but d'indiquer au


programme que le compteur a dbord (c'est
dire qu'il a fini de compter).
De la mme manire que pour la bote aux
lettres, c'est au programme de rebaisser le
drapeau pour recommencer un cycle de
comptage (a ne se fait pas tout seul !).

R-initialisation du drapeau

4
Mthodes de configuration
Un Timer doit pouvoir compter un temps dfini
par le programme (par exemple 1ms, 10ms,
50ms, etc).
Pour cela, 2 paramtres peuvent tre modifis :
La frquence du signal appliqu au compteur
Le compteur s'incrmentera ainsi plus ou moins vite.
Le nombre d'impulsions compter
Le drapeau se lve toujours lorsqu'il y a dbordement,
on peut donc faire partir le compteur d'une valeur
non nulle pour rduire le temps de comptage.

5
Mthodes de configuration
Modification de la frquence du signal appliqu
au compteur : le pr-diviseur (prescaler en
anglais)
Exemple : pour compter 4 fois moins vite

6
Mthodes de configuration
Modification du nombre d'impulsions compter
Si le compteur dmarre 0, il mettra beaucoup
de temps atteindre sa valeur maximale.
Pour rduire le temps de comptage, on peut
donc charger une valeur initiale non nulle
dans le compteur.
Exemple : Valeur initiale gale 250
Chargement du compteur une valeur initiale de 250

250 251 252 253 254 255 0

6 impulsions
7
Les Timers du PIC 16F887
Composition gnrale d'un Timer sur un
microcontrleur PIC :

Calcul du temps mis par le Timer pour faire


lever son drapeau :

T =T quartz Valeur du pr-compteur fixe Valeur du pr-compteur rglable Nombre d'impulsions compter

8
Les Timers du PIC 16F887
Les Timers sont internes au microcontrleur.
Le 16F887 en compte 3 :
Timer0 et Timer2 sur 8 bits
Timer1 sur 16 bits

9
Le Timer0 du 16F887
Composition du Timer0
Le pr-diviseur peut prendre une valeur parmi la
liste suivante : 1, 2, 4, 8, 16, 32, 64, 128 ou
256
La valeur initiale peut prendre n'importe quelle
valeur entire comprise entre 0 et 255.

10
Le Timer0 du 16F887
Calcul du temps maximum :
Pour que le drapeau se lve le plus tard possible, il faut
que la frquence du signal appliqu au compteur soit
la plus faible possible. Il faut donc configurer le
pr-diviseur le plus grand : 256
Il faut galement faire dmarrer le compteur avec la
valeur la plus petite possible pour qu'il compte le
nombre d'impulsion le plus grand : valeur initiale = 0

T MAX =T quartz Valeur du pr-compteur fixe Valeur du pr-compteur rglable max Nombre d'impulsions compter max

1
T MAX = 6
4256( 2560)=65,536 ms
4.10

11
Le Timer0 du 16F887
Calcul d'un temps de 10 ms :
3 1 X = valeur du pr-compteur
T =10.10 = 6
4 X Y
4.10 avec Y = valeur compter= 256 - valeur initiale

X Y Y arrondi Valeur initiale


soit X Y =10000 (256 Y arrondi)
1 10 000 Impossible
Pr-diviseur = 64 2 5 000 Impossible
Valeur compter = 156 4 2 500 Impossible
Soit valeur initiale = 100
8 1 250 Impossible
16 625 Impossible
32 312,5 Impossible
64156= 9984 64 156,25 156 256 156 = 100
12878= 9984 128 78 ,125 78 256 78 = 178
256 39=9984 256 39,0625 39 256 39 = 217
12
Le Timer0 du 16F887

13
Le Timer0 du 16F887
Registre de configuration du Timer0 : OPTION_REG
/RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0
? ? ? ? ? ? ? ?

14
Le Timer0 du 16F887
Registre de configuration du Timer0 : OPTION_REG
/RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0
X (1) X (0) 0 X (0) 0 1 0 1

Pr-diviseur = 64

Si pr-diviseur 1:1 alors PSA = 0


15
Le Timer0 du 16F887
Registres associs au Timer0 :
TMR0 : c'est le registre de comptage. C'est donc dans ce registre que nous
allons rentrer la valeur de dpart de notre compteur.
INTCON seuls les bits 7, 6, 5 et 2 sont utiles pour le Timer 0 (ce sont les seuls
non griss). Dans ce chapitre, nous ne nous intresserons qu'au bit 2 appel
T0IF et qui correspond au flag permettant de tester la fin du comptage. Les
bits 7, 6 et 5 seront vus lors du chapitre sur les interruptions.
OPTION_REG : Nous venons de le voir ...

16
Le Timer0 du 16F887
Exemple de programme :
void tempo_timer0 ( void ); // tempo de 10ms avec le timer0
void init ( void ); // initialisation des priphriques

void main ( void )


{
init(); // initialisation des priphriques

while ( 1 ) // boucle infinie


{
PORTB.1 = !PORTB.1; // on change l'tat de RB1
tempo_timer0(); // tempo de 10 ms
}
}

void tempo_timer0 ( void ) // tempo de 10ms avec le timer0


{
TMR0 = 100; // initialisation du registre de comptage
T0IF = 0; // initialisation du drapeau li au timer0
while ( T0IF == 0 ); // attente de la leve du drapeau
}

void init ( void ) // initialisation des priphriques


{
TRISB.1 = 0; // RB1 configur en sortie
OPTION_REG = 0x85; // configuration du timer0 : pr-diviseur 64
}
17
Le Timer0 du 16F887
Attention ! : Que se passe-t-il si on ne recharge
pas le registre de comptage (TMR0) chaque
dbut de temporisation ? Par exemple :
void tempo_timer0 ( void ) // tempo de 10ms avec le timer0
{

T0IF = 0; // initialisation du drapeau li au timer0


while ( T0IF == 0 ); // attente de la leve du drapeau ne pas faire en TP !
} (c'est pour illustrer ce
qu'il ne faut pas faire ...)
void init ( void ) // initialisation des priphriques
{
TRISB.1 = 0; // RB1 configur en sortie
OPTION_REG = 0x85; // configuration du timer0 : pr-diviseur 64
TMR0 = 100; // initialisation du registre de comptage
}
La 1re tempo est correcte
mais toutes les autres comptent
de 0 255 au lieu de 100 255
faites donc attention cela !

18
Le Timer0 du 16F887
Exercice 1 : Temporisation de 1 ms avec le timer 0.
Question 1 : Quels sont les registres du TIMER0 qu'il
est ncessaire de configurer ?
Question 2 : Calculer les valeurs du prescaler et du
compteur ncessaire pour obtenir une temporisation
de 1 ms.
Question 3 : Donner la configuration des registres du
TIMER0.
Question 4 :
Ecrivez la fonction void Tempo_Timer0_1ms (void) qui
permet d'utiliser le Timer 0.
19
Le Timer0 du 16F887
Exercice 2 : Temporisation de 8 ms avec le timer 0.
Question 1 : Re-calculer les valeurs du prescaler et du
compteur ncessaires pour obtenir cette fois une
temporisation de 8 ms.
Question 2 : Donner la configuration des registres du
TIMER0.

20
Le Timer0 du 16F887
Exercice 3 : Temporisations variables avec le timer 0.
La temporisation maximale avec le Timer 0 est de 65
536 s. Pour raliser des temporisations plus
longues nous allons faire des boucles.
Pour cela, nous allons crire une fonction appele
TempoX10 qui lance X fois une temporisation de 10
ms. X sera une valeur passe en paramtre.
Par exemple, pour faire une temporisation de 1,5s,
nous crierons tempoX10(150).
Question : crire la fonction void tempoX10('X') en
n'oubliant pas de configurer correctement le passage
de paramtre qui lancera X fois une temporisation de
10ms.
21
Le Timer2 du 16F887
Il est lgrement diffrent du Timer 0 puisque le
dbut de comptage est en principe 0x00 et que la fin
de comptage est la valeur entrer.
Il possde comme le Timer 0 un pr-compteur fixe et
un pr-compteur variable (3 valeurs possibles : 1, 4
et 16). C'est aussi un compteur 8 bits.

22
Le Timer2 du 16F887
Calcul de la dure de comptage
T MAX =T quartz Valeur du pr-compteur fixe Valeur du pr-compteur rglable max (Valeur dfinie + 1)

Dure de comptage max :

1
T MAX = 6
416256=4,096 ms
4.10

23
Le Timer2 du 16F887
Originalit de ce Timer :
Le flag ne se lve pas systmatiquement
chaque fin de comptage.
Existance d'un post-compteur.
Ce post-compteur peut prendre chaque

valeur entire entre 1 et 16.


Exemple pour un post-compteur de 4 :

24
Le Timer2 du 16F887
La temporisation max de ce Timer est donc :
TMAX = 16 * 4,096 ms soit 65,536 ms

La formule permettant de calculer la dure de la


temporisation est donc :
1
T =Valeur du post-compteur 4Valeur du pr-compteur rglable(Valeur dfinie + 1)
F quartz

25
Le Timer2 du 16F887

26
Le Timer2 du 16F887

27
Le Timer2 du 16F887

Attention, en TP : pour choisir un prescaler de 16,


mettez T2CKPS<1:0> = 10, sinon un bug de
MPLABSIM vous donnera des rsultats inchohrents

28
Le Timer2 du 16F887
void tempo_timer2 ( void ); // tempo avec le timer2 void tempo_timer2 ( void ); // tempo avec le timer2
void init ( void ); // initialisation des priphriques void init ( void ); // initialisation des priphriques

void main ( void ) void main ( void )


{ {
init(); // initialisation des priphriques init(); // initialisation des priphriques

while ( 1 ) // boucle infinie while ( 1 ) // boucle infinie


{ {
PORTB.1 = !PORTB.1; // on change l'tat de RB1 PORTB.1 = !PORTB.1; // on change l'tat de RB1
tempo_timer2(); // tempo de 50 ms tempo_timer2(); // tempo de 50 ms
} }
} }

void tempo_timer2 ( void ) // tempo de 50ms avec le void tempo_timer2 ( void ) // tempo avec le timer2
timer2 {
{ TMR2IF = 0; // initialisation du drapeau li au timer2
PR2 = 239; // Valeur dfinie de fin de comptage while ( TMR2IF == 0 ); // attente de la leve du drapeau
T2CON = 0x66; // configuration du timer2 }
TMR2IF = 0; // initialisation du drapeau li au timer2
while ( TMR2IF == 0 ); // attente de la leve du drapeau void init ( void ) // initialisation des priphriques
} {
TRISB.1 = 0; // RB1 configur en sortie
void init ( void ) // initialisation des priphriques PR2 = 239; // Valeur dfinie de fin de comptage
{ T2CON = 0x66; // configuration du timer2
TRISB.1 = 0; // RB1 configur en sortie }
}

Ces 2 programmes fonctionnent mais la solution de droite est plus intelligente


29
Le Timer1 du 16F887

Particularits de ce Timer 1 :
Principe de fonctionnement similaire au Timer0
Le pr-compteur ne peut prendre que quatre
valeurs : 1, 2, 4 ou 8.
Le compteur est un compteur 16 bits :
Registre de comptage compos de deux
registres de 8 bits : TMR1H et TMR1L

30
Fonctions particulires des Timers
Les Timers 0 et 1 peuvent tre utiliss en compteur dvnements
extrieurs.
Exemples :
Compteur de pices dans une machine industrielle
Affichage de la vitesse dun vhicule
Timer 0 :
Signal appliquer sur la broche RA4/T0CKl

(Il faut bien sr penser mettre la ligne


RA4 en entre avec TRISA.4)

Bit T0CS mettre 1

31
Timer 0 en compteur d'vnements
T0SE = 0 : les fronts montants attaquant le Timer0
correspondent aux fronts montants de RA4 / T0CKI
T0SE = 1 : les fronts montants attaquant le Timer0
correspondent aux fronts descendants de RA4 / T0CKI

32
Timer 1 en compteur d'vnements
La broche du PIC associe au Timer 1 est la ligne RC0/T1OSO/T13CKI :

La ligne RC1 / T1OSI est aussi associe au Timer 1, mais ne joue pas
de rle dans le comptage d'vnements extrieurs.

Compte tenu de la remarque ci-dessus, il faut dconnecter la ligne


RC1 / T1OSI en invalidant la porte logique inverseuse.

bit T1OSCEN = 0
33
Timer 1 associ un quartz
Il est possible de connecter un quartz sur le Timer 1 et de compter les
impulsions de celui-ci pour gnrer des temps plus prcis comme par
exemple pour crer une horloge de secondes, minutes, heures ou un
chronomtre.
Trs utile pour grer le mode sommeil du micro-controleur.
En gnral, on prend un quartz dit d'horloger de 32768 Hz (on divise
ensuite par 215 pour avoir 1s)

T1OSCEN = 1

34

Vous aimerez peut-être aussi