Académique Documents
Professionnel Documents
Culture Documents
1-Définition
Un timer est un compteur de temps écoulé, il peut être utilisé pour :
2-Principe de fonctionnement
Un timer est un compteur n bit (n=8 ou 16 bit) préchargeables dont l’horloge (l’unité de comptage) peut
être :
HORLOGE
comparateur
Bit de flag
0 1
Dans ce cas, le registre période (period register :PR) contient la période numérique qu’on
désire avoir, le timer commence le comptage des périodes (Nps.T) obtenues par division de la
fréquence F par Nps au niveau du prescaler (prédiviseur) ; lorsque le timer atteint la valeur PR,
cette égalité est détectée par le comparateur qui remet ainsi le timer à zéro et fait passer le bit
de flag associé au timer de zéro à 1.
La temporisation est donnée par l’équation suivante :
Temporisation = (1+PR) Nps .Tcy
3-Cas du timer0
Le timer0 est un timer généraliste 8/16 bit. Il utilise la technique de détection du
débordement; la maîtrise de sa programmation rend la manipulation des autres timers (1 et 3)
assez facile. Il peut fonctionner aussi bien en timer (compteur de temps écoulé) qu’en compteur
(compteur d’évènement). En mode timer, il s’incrémente à chaque coup d’horloge à son entrée
(entrée du compteur) ; en mode compteur, il s’incrémente à front sur la broche RA4/T0CKI
(front montant ou descendant selon le choix).
La figure ci-après donne le schéma bloc du TIMER0 dans ses deux modes : 8bits et 16bits.
FOSC/4 0
0
Sync with Set
1 Internal TMR0L TMR0IF
Clocks on Overflow
T0CKI pin Programmable 1
Prescaler
T0SE (2 TCY Delay)
8
T0CS 3
T0PS2:T0PS0
8
PSA Internal Data Bus
Note: Upon Reset, Timer0 is enabled in 8-bit mode with clock input from T0CKI max. prescale.
FOSC/4 0
0
Sync with Set
1 Internal TMR0
TMR0L High Byte TMR0IF
T0CKI pin Programmable 1 Clocks on Overflow
Prescaler 8
T0SE (2 TCY Delay)
T0CS 3 Read TMR0L
T0PS2:T0PS0
Write TMR0L
PSA
Internal Data
Note: Upon Reset, Timer0 is enabled in 8-bit mode with clock input from T0CKI max. prescale.
Mis à part le bloc de comptage qui passe de 8 bit à 16 bit suivant le mode choisi, les
autres blocs du timer0 fonctionnent de façons similaires.
Le choix du mode (8 bit ou 16 bit) se fait par le bit T08BIT du registre T0CON ;le choix du
fonctionnement (timer ou compteur) se fait par le bit T0CS, dans le cas du fonctionnement en
compteur, le bit T0SE permet de choisir entre front montant ou front descendant, l’emploi du
Dans le mode timer l’horloge est dérivée de l’horloge interne du microcontrôleur ; comme le
montre les schémas fonctionnels précédents elle est de Fosc/4, Fosc étant la fréquence
d’horloge du PIC.
c-L’interruption du timer0
L’interruption associée au timer0 a lieu lorsque le registre TMR0L (en mode 8 bit)
déborde et passe à 00h ou lorsque les registres TMR0L et TMR0H (en mode 16 bit) passent à
0000h ; lors du débordement, le bit de flag TMR0IF est mis à 1 ; l’interruption aura lieu lorsque
les bits d’autorisation de l’interruption sont activés.
n=8 n’est choisi que si on veut assurer la compatibilité avec un pic de la série 16x où le timer0
est un timer 8bits.
e-Exemple de calcul
Fosc=8Mhz
Temporisation = 1s
En posant Vi=0, on trouve Nps=temporisation*Fosc/(216 *4)= 8000000 /(65536*4)=
30.517. étant donné que 30.517 appa rtient à [24, 25[, On prend Nps= 32 d’où Vi=216-
temporisation*Fosc/(Np*4)=65536-8000000 /(32*4)=3036
En conclusion n = 16, Nps = 32 ( code 0b100) et Ni = 3036.
f-Programmation du timer0
La programmation du timer0 en assignant à la CPU la tâche de scruter en permanence
le bit de flag TMR0IF n’a aucun intérêt, puisque l’objectif principal de l’emploi d’un timer est de
décharger la CPU du comptage du temps. L’emploi de l’interruption est recommandé.
La programmation du timer0 doit comporter nécessairement :
Au niveau du programme principal :
▪ Configuration du timer (T0CON)
▪ Initialisation du timer
▪ Configuration de l’interruption
▪ Lancement du timer
Au niveau du programme d’interruption :
▪ Acquittement du bit de flag
▪ Rechargement du timer.
#include<xc.h>
main()
{
TRISC0=0; // configurer RC0 en sortie.
T0CON=0b10000100; // configurer le timer (exemple
//précédent :n=16, Np=32→T0PS2 :T0PS0=100)
IPEN=0 ; // pas de priorité.
INTCON=0b11100000; //configurer l’interruption ( GIE=1 , PEIE=1,TMR0IE=1, TMR0IF=0).
WRITETIMER0(3036); //charger la valeur initiale (Ni=3036).
while(1)
{}
TMR0H=0x0B ;
TMR0L=0XDC ;
Le timer2 n’admet comme entrée que l’horloge système (Fosc/4). Son prédiviseur ne
peut diviser que sur 1,4 ou 16 ce qui rend les calculs très faciles ; ces valeurs peuvent être
fixer par le moyen des bits :T2KPS1 :T2KPS0.
En plus du prédiviseur, le timer2 est muni d’un postdiviseur pouvant accepter jusqu’à
16 valeurs de division (les bits T2OUTPS3 : T2OUTPS3 ) et sert à déclencher des opérations
(suivant l’application) en mettant à 1 le bit de flag TMR2IF après N périodes ( de 1 à 16
périodes).
b) Calcul des paramètres du timer2
La formule utilisée pour un tel timer est la suivante : tempo=(1+PR2).Nps.Tcy
Si à titre d’exemple on désire avoir une période de 2ms avec Fosc=8Mhz, il faut
déterminer PR2 et Nps.
Puisque le prédiviseur n’admet que 3 valeurs possibles, on commence par poser Nps=1
et on calcule la valeur de PR2, si cette dernière <=255, on retient Nps=1, sinon on
passe à la valeur Nps=4 et on recalcule PR2, si PR2<=255, on retient Nps=4, sinon on
passe à Nps=16.
Dans notre cas , pour Nps=1, 1+PR2=(tempo.Fosc)/(4.Nps) =
0.002*8000000/(4*1)=4000>255
On passe à Nps=4 ➔1+PR2=1000>255 on passe à Nps=16
➔1+PR2=250➔PR2=249<255
On retient Nps=16 et PR2=249.