Académique Documents
Professionnel Documents
Culture Documents
programmation
Chapitre 4
Timer 0
Dr. ATTIA Brahim, brahim.attia@yahoo.fr
1
Qu’est-ce qu’un timer?
Un timer est un compteur interne au µC qui peut être incrémenté par un signal
d’horloge 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 durées, de générer
des signaux bien définis temporellement etc …
Sans timer, ça sera plus difficile, car il dépend du temps d’exécution des instructions.
Cela nécessitera un contrôle délicat des boucles.
Leur usage n’est pas très compliqué, mais demande une bonne compréhension de la
structure des différents timers d’un µC.
3
Quels timers dans les PIC16F87?
On dispose de 3 timers:
2 type d’impulsions:
Impulsion issue d’un circuit extérieur et reçue sur une patte du PIC. C’est le mode
compteur.
Impulsion issue de l’horloge du PIC. Dans ce cas, nous comptons un temps. C’est le
mode timer.
Il existe 3 timers sur le PIC 16f877: timer0, timer1,timer2.
5
Port ou PIN utilisé pour le TIMER0
Mode temporisateur :
Le registre (TMR0) s’incrémentera à chaque cycle d’instruction (sans prédiviseur).
Mode compteur :
Le registre (TMR0) s’incrémentera à chaque front montant ou front descendant qui apparaît au
PIN RA4 (T0CLK).
Registre TMR0 :
0x01dans la page 0 et 0x101 dans la page 2.
Son contenu peut être lu par l’utilisateur ou
développeur à chaque instant dans le programme.
6
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 INTEDG T0CS T0SE PSA PS2 PS1 PS0
8Ch TMR0 Registre du module timer0
7
Registres associé avec le TIMER 0
8
Architecture interne du TIMER 0
9
Registre OPTION_REG
OPTION_REG: Registre de sélection d’options
10
Mode interruption du TIMER 0
Le timer 0 est un module basique dans le PIC. Afin d’autorisé son interruption, il faut:
11
exemple d’interruption 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 exécutée à la vitesse maximale et en
sélectionnant l'oscillateur du microcontrôleur
que l'entrée de la minuterie, le compteur / timer
se incrémente toutes les 1 μsec.
12
exemple d’interruption du TIMER 0
T= 0,1 msec = 100 x 1μsec
Donc, assurez-vous que le TIMER0 s’incrémente 100 fois avant qu'il ne déborde:
Ajouter 2 à ce délai pour tenir compte de deux cycles d’écriture du timer0: 156 +2 =158=0x9E
13
exemple d’interruption du TIMER 0
14
exemple d’interruption du TIMER 0
15
exemple d’interruption du TIMER 0
16
le Pré scalaire du timer0
17
Exemple sur le Pré scalaire
Supposons que nous voulons changer le taux d'interruption de 10 kHz (=0,1 msec) à 2,5
kHz(=0,4msec).
Cela pourrait se faire en divisant l'horloge d'entrée par quatre ou en sélectionnant la valeur 001
des bits PS2, PS1, et PS0.
Veuillez sélectionner aussi le pré-scalaire en remettant à 0 le bit 3 (PSA) du registre OPTION.
18
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
19
Mode timer
On le sélectionne en mettant à 0 le bit T0CS.
Dans ce type de fonctionnement, le timer est alimenté par son horloge interne dont la fréquence
est égale à celle de l’horloge du microcontrôleur divisé par 4.
T0CS=0
PSA=0
20
Quartz ou mode timer
Si vous utilisez l'horloge interne (quartz), la division est effectuée comme suit :
Count : présente une valeur numérique qui doit être placé pour obtenir la fréquence de
sortie désirée (Fout).
21
Exemple de calcul du mode timer
Supposons que nous voulons créer 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 fréquence par le Prescaler sera 1: 256.
Deuxièmement, nous allons définir TMR0 = 0. Ainsi:
22
Mode compteur
set_timer0(value)
Dans ce mode, le timer incrémente son propre comptage à chaque front (de montée ou de
descente) présent sur la patte RA4.
Pour déterminer, si cette incrémentation doit se produire sur le front positif ou sur le négatif,
il faut agir sur le bit D4, toujours dans le registre OPTION, bit que l’on appelle également
T0SE.
Si ce bit est mis à 0, l’incrémentation est effectuée sur le front positif, et vice versa, s’il est à
1, l’incrémentation est opérée sur le front négatif.
25
exemple du mode compteur du
TIMER 0
26
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 déclencher le buzzer après chaque
100 impulsions.
27
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 28
Mode compteur
Si vous utilisez une source d'horloge externe (oscillateur), la division est effectuée comme suit:
Dans ce cas, il n'y a pas de division par 4 de l'horloge originale. Nous utilisons la fréquence
externe comme elle est.
Exemple: Quelle est la fréquence de sortie (Fout), lorsque l'oscillateur externe est de 100kHz et
count = 8?
Calcul:
Tout d'abord, supposons que la division de fréquence par le Prescaler sera 1: 256.
Deuxièmement, nous allons définir TMR0 = 0. Ainsi:
29
Programmation du timer0
set_timer0(value)
Syntaxe: set_timer0(value) ou set_rtcc(value)
Paramètre: Value is a 8 bit int.
Fonction: permet d’initialiser la valeur initiale du registre TMR0.(écriture dans TMR0)
Examples: // horloge de 20 Mhz, sans prédiviseur, configure le timer 0 afin de déborder chaque 35us.
set_timer0(81); // 256-(.000035/(4/20000000))
value = get_timer0()
Syntaxe: value = get_timer0()
Paramètre: aucun.
retourne: Valeur entier de largeur 8 bit.
Fonction: permet de retourner la valeur instantanée du registre TMR0. (lecture du TMR1)
Examples: // horloge de 20 Mhz, sans prédiviseur, configure le timer 1 afin de déborder chaque 35us.
set_timer1(0);
while (get_timer1()<200) 30
Programmation du timer0
Setup_timer_0(mode)
syntaxe:
setup_timer_0 (mode)
paramètres:
mode peut être un ou deux des constantes définies 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'opérateur |.
Exemples:
setup_timer_0 (RTCC_DIV_2|RTCC_EXT_L_TO_H); 31
Exemple de fonctionnement en mode timer
32
Exemple de fonctionnement en mode compteur
33
Exemple de fonctionnement en mode compteur
34
Exemple de fonctionnement en mode compteur
35
Exemple de fonctionnement en mode compteur
Décompteur
36
PIC16F877A Timer0 interrupt example:
This is a simple example which uses timer0
interrupt to make an LED connected to RB0
PIC16F877A Timer0 interrupt example CCS PIC blinking at a frequency about 1Hz. The circuit is
C code: simple there is only an LED, this LED keeps
The timer is used to interrupt every 50ms and blinking without using the delay function.
to make the LED ON for 500ms and OFF for
500ms, the interrupt must be interrupted 10
times, that why a variable i is used.
HS oscillator used with frequency of 4MHz. 37
Quel timer choisir, pour quelle application?
Là les choses se compliquent car les possibilités sont
étendues.
Comptage d’évènements externes:
•Timer2 exclus d’office.
•On ne doit pas utiliser de pré-diviseur, sauf cas particulier.
•Timer0 comptage jusqu’à 255
•Timer1 comptage jusqu’à 65535
Mesure de temps:
•Tous les timers sont utilisables.
•La précision ou la capacité déterminera le Timer à utiliser.
Il existe des dispositifs spécifiques internes utilisant les timers (Capture/Compare/PWM)
que nous verrons plus loin pour la génération de signaux ou la mesure de période.
38
Exercice simple d’utilisation du timer1:
Clignotement de la LED rouge indépendamment du déroulement du programme.
39
Timers: principes
Objectifs :
Les Timers ou compteurs de temps écoulé permettent :
De réaliser des temporisations précises puisqu’ils utilisent des oscillateurs de référence à quartz.
De générer des signaux électriques 0V / 5V.
De mesurer des durées.
De compter des évènements extérieurs sur des fronts montants ou descendants
Principe de fonctionnement:
Un timer est un compteur 8 ou 16 bits préchargeable dont l'horloge Th peut être:
Soit dérivée de l'horloge principale du PIC (Tosc ou Kp.Tosc si on utilise un prédiviseur)
Soit fournie par un signal externe (broche RA4/T0CKI pour le timer0)
Soit fournie par un oscillateur interne supplémentaire
41
Timers: principes(2)
Les étapes avec un exemple: temporisation de 10ms, quartz 4Mhz, timers en mode ???
On calcule les valeurs max de tempo sur 8 bits et 16 bits: ici 10ms<65,536 ms => mode
8 bits.
La formule donne: (256 - N) . 4Tosc . Pré-Div de TMR0L = 10ms
Etape1: poser N=0 dans un premier temps
Pré-division = (10ms / 1μs) / 256 = 39
On choisit la valeur existante du pré-diviseur immédiatement supérieure soit : pré-
division = 64
Etape2: on ajuste N pour obtenir la bonne tempo
Le nombre d'incrémentations par cycle est égal à : (256 – N) = (10ms / 1μs) / 64 =
156 soit : N = 256-156 =100
Etapes de programmation des timers
Des IT?
Initialisation du timer
Lancement du timer
Acquittement du flag overflow
Rechargement du timer
42
Les étapes de programmation(1)
43
Les étapes de programmation(2)
44
PIC 16F877
Peut utiliser des broches externes pour clock in/clock out( pour compter des événements
ou en utilisant un autre Fosc).
Timer1: 16-bit timer/counter avec un pre-scaler de 8-bit, il peut être incrémenté durant le
mode SLEEP à travers le crystal externe / horloge.
45
46
47
48
49
50
51
52
53
Timer 0
• The Timer0 module timer/counter has the following
• features:
– 8-bit timer/counter
– Readable and writable
– 8-bit software programmable prescaler
– Internal or external clock select
– Interrupt on overflow from FFh to 00h
– Edge select for external clock
• Figure 5-1 is a block diagram of the Timer0 module and
the prescaler shared with the WDT.
• Timer mode is selected by clearing bit T0CS
• (OPTION_REG<5>). In Timer mode, the Timer0 module
will increment every instruction cycle (without
prescaler). If the TMR0 register is written, the increment
is inhibited for the following two instruction cycles. The
user can work around this by writing an adjusted value
to the TMR0 register.
54
55
56
57
58
59
60
61
62
63
64
65
Il est bien entendu qu’un des modes privilégiés de l’utilisation des timers, est la possibilité de les utiliser en tant que générateurs d’interruptions.
Je vous rappelle donc ici que le timer 1 permet, exactement comme le permet le timer 0, de générer une interruption au moment où timer «
déborde », c’est-à-dire au moment où sa valeur passe de 0xFFFF à 0x0000 (souvenez-vous que nous travaillons sur 16 bits).
Quelles sont les conditions pour que le timer 1 génère une interruption ? Et bien, tout simplement que cette interruption soit autorisée. Donc :
Il faut que le bit d’autorisation d’interruption du timer 1 (TMR1IE) soit mis à 1. Ce bit se trouve dans le registre PIE1 (banque 1).
Pour que le registre PIE1 soit actif, il faut que le bit PEIE d’autorisation des interruptions périphériques soit positionné dans le registre INTCON.
Il faut également, bien entendu, que le bit d’autorisation générale des interruption (GIE) soit positionné dans le registre INTCON.
Moyennant quoi, une interruption sera générée à chaque débordement du timer1. Cet événement sera indiqué par le positionnement du flag
TMR1IF dans le registre PIR1.
Comme d’habitude, il vous incombe de remettre ce flag à 0 dans la routine d’interruption, sous peine de rester indéfiniment bloqué dans la dite
routine.
66
67
https://www.youtube.com/watch?v=MGxyRe-RJ9E
https://www.youtube.com/watch?v=o4r54hL9FeM
https://www.youtube.com/watch?v=-wwIaWH-Nd4
https://www.youtube.com/watch?v=4Wriu7VByF8
68
• When using an external input signal of any kind, it is
important to pay particular attention to electrical
specifications and timing parameters listed in the data
sheet.
• The 2-cycle synchronization block shown in Figure 1-6
samples the input signal on the T0CKI pin and
synchronizes it with the clock used by PIC16F690.
• Therefore, there are some important equations to
know when not using the prescaler for Timer0 (see
Equation 1-3 and Equation 1-4):
69
70
71
72
73
74
75
76
http://embeddede-lab.blogspot.com/2013/09/using-pic18-timer-module-for-delay-c.html
77
https://www.youtube.com/watch?v=6EU_VmRzdkg
https://www.youtube.com/watch?v=i2oCnzjvJAU&list=PLwX8VyNMoKQ5uWLt6fkuyfQmxd9W3Tbz
https://www.youtube.com/watch?v=-vfPxMy_ODY&list=PLwX8VyNMoKQ5uWLt6fkuyfQmxd9W3T
https://www.youtube.com/watch?v=bnU9E4MPOe4
https://www.youtube.com/watch?v=SSIoImKr5Yw
https://www.youtube.com/watch?v=_GKhlYmAurM&list=PLMFrcR3zyPe_BUvi1y3nzE4GNEqkUNkZ
https://www.youtube.com/watch?v=VMcdXLZGpis&list=PLMFrcR3zyPe_BUvi1y3nzE4GNEqkUNkZK
https://www.youtube.com/watch?v=l6mSeCTSv78&list=PLMFrcR3zyPe_BUvi1y3nzE4GNEqkUNkZK
https://www.youtube.com/watch?v=lKk-eF5a1ig&list=PLMFrcR3zyPe_BUvi1y3nzE4GNEqkUNkZK&
78