Vous êtes sur la page 1sur 36

Microcontrleurs:

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:

Un timer gnre un drapeau de dbordement chaque passage de sa valeur max


zro.
Certains timers peuvent tre en criture, ce qui permet de compter depuis une
valeur particulire. On peut lire tout moment la valeur du timer.
Quel est lintrt des timers?
La gestion, la mesure et la matrise du temps!

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.

Il peut tre parfois judicieux de faire un schma fonctionnel de la configuration dsire.


Quels timers dans les PIC16F87?
On dispose de 3 timers:

Timer0 sur 8 bits:pr-diviseur programmable de 1:2 1:256,


lecture/criture,
Horloge interne ou externe (choix du front pour cette dernire)
Interruption possible sur dbordement $FF $00

Timer1 sur 16 bits:


pr-diviseur programmable de 1:1 1:8,
Lecture/criture,
Horloge interne ou externe (oscillateur possible pour cette dernire)
Interruption possible sur dbordement $FFFF $0000

Timer2 sur 8 bits pr-diviseur


: programmable 1:1, 1:4 ou 1:16,
post-diviseur programmable 1:1 1:16,
Lecture/criture,
Horloge interne uniquement
comparateur entre TMR2 et PR2 qui gnre un drapeau
Interruption possible sur sortie post-diviseur
Diffrents modes de fonctionnement

Un timer est un compteur dimpulsion.

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.

Le TIMER0 fonctionne en timer ou compteur sur 8 bits.


chaque impulsion, le registre TMR0 est incrment.
Ds que ce registre est plein, il y a une demande dinterruption sur limpulsion suivante:
passage de FFh 00h sur 8 bits.
Port ou PIN utilis pour le TIMER0
Mode temporisateur :
Le registre (TMR0) sincrmentera chaque cycle dinstruction (sans prdiviseur).
Mode compteur :
Le registre (TMR0) sincrmentera chaque front montant ou front descendant qui apparat au
PIN RA4 (T0CLK).

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

Page 0 Page 1 Page 2 Page 3


Architecture interne du TIMER 0
Registre OPTION_REG
OPTION_REG: Registre de slection
doptions
Mode interruption du TIMER 0
Le timer 0 est un module basique dans le PIC. Afin dautoris son interruption,
il faut:
autoris linterruption globale(mise 1 du bit GIE du
registre INTCON).
autoris linterruption du timer 0 (mise 1 du bit T0IE du
registre INTCON).
mise 1 automatique du bit T0IF du registre INTCON au
dbordement du timer0 et aprs lexecution de la routine
dinterruption ce bit doit tre remise 0 par le programmeur.
exemple dinterruption du TIMER 0
Clignoter une LED infrarouge aux taux de
5KHz.
5KHz => T= 0,2 ms => on pendant 0,1 ms
off pendant 0,1 ms
si elle est excute la vitesse maximale et en
slectionnant l'oscillateur du microcontrleur
que l'entre de la minuterie, le compteur / timer
se incrmente toutes les 1 sec.

T= 0,1 msec = 100 x 1sec


exemple dinterruption du TIMER 0
T= 0,1 msec = 100 x 1sec

Donc, assurez-vous que le TIMER0 sincrmente 100 fois avant qu'il ne


dborde:
choisir la valeur initiale du timer0 comme 256 100= 156=0x9C

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 :

Fout: La frquence de sortie aprs la division.

Tout : Le temps dsir en cycle aprs la division.

4 : La division de l'horloge originale (4 MHz) par quatre, lors de l'utilisation de interne


horloge (cristal) et pas l'oscillateur externe.

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)

T0SE: TMR0 Source Edge Select bit


1 = Incrmentation sil ya transition de haut en bas sur la pin RB0.
T0CS=1 0 = Incrmentation sil ya transition de bas en haut sur la pin RB0.
PSA=0
Mode compteur
On slectionne le mode compteur en mettant 1 le bit T0CS.

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.

T0SE: TMR0 Source Edge Select bit


1 = Incrmentation sil ya transition de haut en bas sur
T0CS=1 la pin RB0.
PSA=0 0 = Incrmentation sil ya transition de bas en haut sur
la pin RB0.
Mode compteur du timer0
compter le nombre de fois que quelqu'un pousse un bouton compte tenu de la
configuration matrielle suivante:
exemple du mode compteur du
TIMER 0
En supposant que les impulsions d'horloge sont
introduites dans la broche T0CKI et un signal
sonore reli la broche PORTB.1
Ecrire un programme pour le timer 0 en mode
8-bit pour dclencher le buzzer aprs chaque
100 impulsions.
BSF TRISA,RA
CLRF TRISB
En supposant que les impulsions MOVLW 0x68
d'horloge sont introduites dans la
broche T0CK1. MOVWF T0CON
Ecrire un programme qui permet
de compter les impulsions et
HERE MOVLW 0x0
afficher l'tat de comptage avec le MOVWF TMR0L
TMR0 sur le port PORTB.
BCF INTCON,TMR0IF
BSF T0CON,TMR0ON
AGAIN MOVFF TMR0L,PORTB
BTFSS INTCON,TMR0IF
BRA AGAIN
BCF T0CON,TMR0ON
GOTO HERE
Mode compteur
Si vous utilisez une source d'horloge externe (oscillateur), la division est effectue comme suit:

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