Académique Documents
Professionnel Documents
Culture Documents
architecture et
programmation
Chapitre 4
Timer 0
Dr. ATTIA Brahim, brahim.attia@yahoo.fr
1
Quest-ce quun timer?
Un timer est un compteur interne au C qui peut tre incrment par un signal
dhorloge externe ou interne. Il peut y avoir un pr diviseur avant le timer:
En effet, dans la plupart des applications, on a besoin de mesurer des dures, de gnrer
des signaux bien dfinis temporellement etc
Sans timer, a sera plus difficile, car il dpend du temps dexcution des instructions.
Cela ncessitera un contrle dlicat des boucles.
Leur usage nest pas trs compliqu, mais demande une bonne comprhension de la
structure des diffrents timers dun C.
2 type dimpulsions:
Impulsion issue dun circuit extrieur et reue sur une patte du PIC. Cest le mode
compteur.
Impulsion issue de lhorloge du PIC. Dans ce cas, nous comptons un temps. Cest le
mode timer.
Il existe 3 timers sur le PIC 16f877: timer0, timer1,timer2.
Registre TMR0 :
0x01dans la page 0 et 0x101 dans la page 2.
Son contenu peut tre lu par lutilisateur ou
dveloppeur chaque instant dans le programme.
Registres Associ avec le TIMER 0
ADDR NAME BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0
0Bh INTCON GIE PEIE T0IE INTE RBIE T0IF INTF RBIF
0Ch option RBPU INTED T0CS T0SE PSA PS2 PS1 PS0
G
8Ch TMR0 Registre du module timer0
Registres associ avec le TIMER 0
Ajouter 2 ce dlai pour tenir compte de deux cycles dcriture du timer0: 156 +2 =158=0x9E
exemple dinterruption du TIMER 0
exemple dinterruption du TIMER 0
exemple dinterruption du TIMER 0
le Pr scalaire du timer0
Exemple sur le Pr scalaire
Supposons que nous voulons changer le taux d'interruption de notre dernier exemple de 10
kHz (=0,1 msec) 2,5 kHz(=0,4msec).
Cela pourrait se faire en divisant l'horloge d'entre par quatre ou en slectionnant la valeur 001
des bits PS2, PS1, et PS0.
Veuillez slectionner aussi le pr-scalaire en remettant 0 le bit 3 (PSA) du registre OPTION.
Mode timer
On le slectionne en mettant 0 le bit T0CS.
Dans ce type de fonctionnement, le timer est aliment par son horloge interne dont la frquence
est gale celle de lhorloge du microcontrleur divis par 4.
T0CS=0
PSA=0
Quartz ou mode timer
Si vous utilisez l'horloge interne (quartz), la division est effectue comme suit :
Count : prsente une valeur numrique qui doit tre plac pour obtenir la frquence de
sortie dsire (Fout).
(256 - TMR0) : le nombre dincrmentation pour un cycle de comptage bas sur le contenu
du registre TMR0.
Exemple de calcul du mode timer
Supposons que nous voulons crer un retard de 0,5 secondes dans un programme en
utilisant le Timer0. Quelle est la valeur de Count?
Calcul:
Tout d'abord, supposons que la division de frquence par le Prescaler sera 1: 256.
Deuximement, nous allons dfinir TMR0 = 0. Ainsi:
Mode compteur
set_timer0(value)
Dans ce mode, le timer incrmente son propre comptage chaque front (de monte ou de
descente) prsent sur la patte RA4.
Pour dterminer, si cette incrmentation doit se produire sur le front positif ou sur le ngatif,
il faut agir sur le bit D4, toujours dans le registre OPTION, bit que lon appelle galement
T0SE.
Si ce bit est mis 0, lincrmentation est effectue sur le front positif, et vice versa, sil est
1, lincrmentation est opre sur le front ngatif.
Dans ce cas, il n'y a pas de division par 4 de l'horloge originale. Nous utilisons la frquence
externe comme elle est.
Exemple: Quelle est la frquence de sortie (Fout), lorsque l'oscillateur externe est de 100kHz et
count = 8?
Calcul:
Tout d'abord, supposons que la division de frquence par le Prescaler sera 1: 256.
Deuximement, nous allons dfinir TMR0 = 0. Ainsi:
Programmation du timer0
set_timer0(value)
Syntaxe: set_timer0(value) ou set_rtcc(value)
Paramtre: Value is a 8 bit int.
Fonction: permet dinitialiser la valeur initiale du registre TMR0.(criture dans TMR0)
Examples: // horloge de 20 Mhz, sans prdiviseur, configure le timer 0 afin de dborder chaque 35us.
set_timer0(81); // 256-(.000035/(4/20000000))
value = get_timer0()
Syntaxe: value = get_timer0()
Paramtre: aucun.
retourne: Valeur entier de largeur 8 bit.
Fonction: permet de retourner la valeur instantane du registre TMR0. (lecture du TMR1)
Examples: // horloge de 20 Mhz, sans prdiviseur, configure le timer 1 afin de dborder chaque 35us.
set_timer1(0);
while (get_timer1()<200)
Programmation du timer0
Setup_timer_0(mode)
syntaxe:
setup_timer_0 (mode)
paramtres:
mode peut tre un ou deux des constantes dfinies dans le
fichier 16f877.h.
une seule constante peut tre utilis de chaque groupe.
Si on veut utiliser une constante de chaque groupe on doit
utiliser l'oprateur |.
Exemples:
setup_timer_0 (RTCC_DIV_2|RTCC_EXT_L_TO_H);
Exemple de fonctionnement en mode timer
Exemple de fonctionnement en mode compteur
Exemple de fonctionnement en mode compteur
Exemple de fonctionnement en mode compteur
Exemple de fonctionnement en mode compteur
Dcompteur
Exemple de fonctionnement en mode interruption
U1
13 33
OSC1/CLKIN RB0/INT
14 34
OSC2/CLKOUT RB1
35
RB2
2 36
RA0/AN0 RB3/PGM
3 37
RA1/AN1 RB4
4 38
RA2/AN2/VREF-/CVREF RB5
5 39
RA3/AN3/VREF+ RB6/PGC
6 40
RA4/T0CKI/C1OUT RB7/PGD
7
RA5/AN4/SS/C2OUT
RC0/T1OSO/T1CKI
15 D1
8 16 LED-BIGY
RE0/AN5/RD RC1/T1OSI/CCP2
9 17
RE1/AN6/WR RC2/CCP1
10 18
RE2/AN7/CS RC3/SCK/SCL
23
RC4/SDI/SDA
1 24
MCLR/Vpp/THV RC5/SDO
25
RC6/TX/CK
26
RC7/RX/DT
19
RD0/PSP0
20
RD1/PSP1
21
RD2/PSP2
22
RD3/PSP3
27
RD4/PSP4
28
RD5/PSP5
29
RD6/PSP6
30
RD7/PSP7
PIC16F877A