Vous êtes sur la page 1sur 78

Microcontrôleurs : architecture et

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:

Un timer génère un « drapeau » de débordement à chaque passage de sa valeur max


à zéro.
Certains timers peuvent être en écriture, ce qui permet de compter depuis une
valeur particulière. On peut lire à tout moment la valeur du timer.
2
Quel est l’intérêt des timers?
La gestion, la mesure et la maîtrise du temps!

 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.

 Il peut être parfois judicieux de faire un schéma fonctionnel de la configuration désirée.

3
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 dernière)
Interruption possible sur débordement $FF à $00

Timer1 sur 16 bits: pré-diviseur programmable de 1:1 à 1:8,


Lecture/écriture,
Horloge interne ou externe (oscillateur possible pour cette dernière)
Interruption possible sur débordement $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 génère un drapeau
Interruption possible sur sortie post-diviseur
4
Différents modes de fonctionnement

 Un timer est un compteur d’impulsion.

 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.

 Le TIMER0 fonctionne en timer ou compteur sur 8 bits.


 À chaque impulsion, le registre TMR0 est incrémenté.
 Dès que ce registre est plein, il y a une demande d’interruption sur l’impulsion suivante:
passage de FFh à 00h sur 8 bits.

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

Page 0 Page 1 Page 2 Page 3

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:

 autorisé l’interruption globale(mise à 1 du bit GIE du registre INTCON).


 autorisé l’interruption du timer 0 (mise à 1 du bit T0IE du registre INTCON).
 mise à 1 automatique du bit T0IF du registre INTCON au débordement du timer0
et après l’execution de la routine d’interruption ce bit doit être remise à 0 par le
programmeur.

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.

T= 0,1 msec = 100 x 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:

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

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 :

Fout: La fréquence de sortie après la division.

Tout : Le temps désiré en cycle après 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 : présente une valeur numérique qui doit être placé pour obtenir la fréquence de
sortie désirée (Fout).

(256 - TMR0) : le nombre d’incrémentation pour un cycle de comptage basé sur le


contenu du registre TMR0.

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)

T0SE: TMR0 Source Edge Select bit


1 = Incrémentation s’il ya transition de haut en bas sur la pin RB0.
T0CS=1 0 = Incrémentation s’il ya transition de bas en haut sur la pin RB0.
PSA=0
23
Mode compteur
 On sélectionne le mode compteur en mettant à 1 le bit T0CS.

 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.

T0SE: TMR0 Source Edge Select bit


1 = Incrémentation s’il ya transition de haut en bas sur la pin RB0.
T0CS=1 0 = Incrémentation s’il ya transition de bas en haut sur la pin RB0.
PSA=0
24
Mode compteur du timer0
compter le nombre de fois que quelqu'un pousse un bouton compte tenu de la
configuration matérielle suivante:

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.

Exercice d’utilisation du timer0 en comptage d’événements:


Inversion de l’état de la LED tous les x appuis du bouton poussoir, indépendamment
du déroulement du programme.

Exercice d’utilisation conjointe Timer0 et Timer1:


Activation de la LED pendant 0,3s tous les x appuis du bouton poussoir,
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

 Le passage de la valeur maximum (0xFF ou 0xFFFF) à 0 est appelé overflow.


 L'overflow provoque le passage à 1 du bit TMRxIF.
 Une interruption est disponible sur l'overflow.
 La durée entre deux overflow est :
 Toverflow = (2n – valeur initiale). Th avec (n = 8 ou 16)
 On peut lire/écrire une valeur dans le compteur.
 (Précautions nécessaires pour les compteurs 16bits) 40
Timers: principes(1)

 Les paramètres d’ajustements


 Pour obtenir un temps désiré on peut jouer sur :
 L’horloge externe ou interne.
 La pré-division.
 Le nombre d’incrémentations pour un cycle, sachant que si on recharge le compteur à
chaque fin de cycle avec une valeur N, le nombre d’incrémentations par cycle est de (2n –
N).
 Carte PICDEM + :calculer la pré-division nécessaire
 Durée de comptage maximale en utilisant l’oscillateur de la carte PICDEM +
 Avec Fosc = 4 Mhz divisée par 4, soit 1Mhz, la période d’horloge compteur est de Thorloge
= 1 ms.
 Si on utilise la valeur maximum de pré-division soit 1/256, le compteur s’incrémente de 1
chaque Tincrémentation = 1μs x pré-division soit toutes les 256 μs.
 Avec le comptage maximum :
 En mode 8 bits: 256 incrémentations pour aller de 0X00 à 0XFF, on obtient : 256 incré.
x 256 us soit 65,536 ms.
 En mode 16 bits: 16,77 s .

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

 Modules de temporisation / compteur)(Timer/counter):

 Générer des interruptions en cas de débordement du TIMER.

 Peut utiliser des broches externes pour clock in/clock out( pour compter des événements
ou en utilisant un autre Fosc).

 Il ya 3 modules de temporisation et de contage(Timer/counter):

 Timer0: 8-bit timer/counter avec un pre-scaler de 8-bit.

 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.

 Timer2: 8-bit timer/counter avec un registre de periode de 8-bit, un pre-scaler et post-scaler.

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

Vous aimerez peut-être aussi