Vous êtes sur la page 1sur 5

Utilisation d'un timer de Contrôle

microcontrôleur
NOM : Prénom :

Durée : 1h

Barème : I: /10
Utilisations du timer : /2
horloge : /3
a) : /3
b) : /1
c) : /1
II: /10
Méthode de réalisation : /3
Contenu des registres : /3
Algorithme : /4

Documents de cours interdits. Vous justifierez vos affirmations et détaillerez


vos calculs.

I Rappelez quelques utilisations possibles d'un timer de microcontrôleur.


Un timer de microcontrôleur peut servir à indiquer une durée au CPU, à mesurer la
durée d'un état ou d'une période d'un signal (Input Capture), à générer un signal aux
durées caractéristiques (durée d'un état, période, rapport cyclique...) fixées (Output
Compare).
Dans certains microcontrôleurs (PIC), il peut aussi servir de compteur
d'événements.
Quels sont les signaux pouvant servir d'horloge de base ? Comment peut-on créer
une nouvelle horloge à partir de ces signaux ?
L'horloge de base du timer est généralement l'horloge interne (cycle) du
microcontrôleur. Dans certains microcontrôleurs (PIC), ion peut aussi avoir une horloge
externe (sur une broche) pour compter des événements.
A l'aide d'un prescaler, on peut diviser la fréquence de cette horloge afin
d'augmenter la durée du comptage.
Exemple :
Un microcontrôleur a les caractéristiques suivantes :
fréquence du quartz Fquartz : 16MHz
fréquence interne de base = Fquartz/4

M.Besse Page 1/5


dd/05/yy 06:04
Utilisation d'un timer de Contrôle
microcontrôleur
NOM : Prénom :

Taille du registre de comptage : 8 bits


Divisions possibles de la fréquence de l'horloge de base : par 1, 2, 4, 8 ou 16

On souhaite pouvoir mesurer une durée d'environ 0,5ms.

a) Préciser quelles divisions permettent cette mesure ?


Pour effectuer cette mesure sans être obligé de rajouter un traitement à partir du CPU, il
ne faut pas que le contenu du registre de comptage dépasse (28-1) = 255 sur 0,5ms.
Sa période doit donc être supérieure à 0,5/256 = 1,95µs
Sa fréquence doit donc être inférieure à 256/0,5 = 512kHz
La fréquence interne du microcontrôleur est de 16/4 = 4Mhz
Elle doit être divisée par au moins 4000/512 = 7,8
On doit donc utiliser la division par 8 (f = 500kHz) ou la division par 16 (f = 250kHz)
b) Laquelle donne le résultat de comptage le plus faible ?
L'horloge la plus lente donne le résultat de comptage le plus faible, c'est donc la division
par 16
c) Laquelle donne la meilleure précision ?
L'horloge la plus rapide donne la meilleure précision, c'est donc la division par 8

M.Besse Page 2/5


dd/05/yy 06:04
Utilisation d'un timer de Contrôle
microcontrôleur
NOM : Prénom :

II – On désire mesurer la période d'un signal présent sur une broche d'entrée d'un
PIC16F84 avec une résolution de 1µs.
D'après les extraits de la documentation constructeur fournis, proposer une méthode de
réalisation.
On suppose que la fréquence du quartz et la fréquence interne sont les mêmes qu'au I).
Indiquer les contenus à prévoir dans les registres concernés et l'algorithme de traitement
dans le programme principal.

La résolution indiquée nous donne la période maximale de l'horloge de comptage, donc sa


fréquence minimale f =1Mhz
Avec une fréquence interne de 4MHz, cette fréquence est obtenue par une division par 4.
D'après la documentation fournie, il faut initialiser le registre OPTION_REG qui contient les
bits T0CS, T0SE, PSA, PS2, PS1, PS0.

T0CS (choix de l'horloge de base ) = 0 (horloge interne)


T0SE (choix du front de comptage) sans importance puisqu'on n'utilise pas l'horloge
externe
PSA = 0 (utilisation du prescaler par le Timer)
PS2 PS1 PS0 = 0 0 1 (division par 4)
Les bits 6 et 7 du registre sont utilisés par d'autres fonctions. Nous ne pouvons donc pas
prévoir ce qu'il faut mettre dedans.
Le registre OPTION_REG contient donc : x x 0 x 0 0 0 1

Comme on ne sait pas au départ la durée à compter, il faut prévoir qu'elle puisse dépasser
les 256 µs et donc que le registre TMR0 'déborde' et repasse à 0. Il faut alors prévoir une
variable que l'on incrémentera à chaque débordement de TMR0 afin de pouvoir calculer la
période totale :
T = 256 x variable + TMR0

Le timer doit interrompre le CPU à chaque débordement pour qu'on incrémente la variable
(appelée ici VAR)
D'après la documentation, il faut donc mettre à 1 le bit T0IE (registre INTCON, bit 5)
Le débordement est indiqué par le passage à 1 du bit T0IF (registre INTCON, bit 2)
Le registre INTCON contient donc : x x 1 x x 0 x x à l'initialisation

On décide arbitrairement de mesurer la période de front montant à front montant du

M.Besse Page 3/5


dd/05/yy 06:04
Utilisation d'un timer de Contrôle
microcontrôleur
NOM : Prénom :

signal (appelé ici SIG)

Algorithme du programme principal

VAR = 0 ; initialisation du détecteur de débordement


répéter
attendre
jusqu'à ce que SIG = 0 ; pour être sûr de voir le front montant

répéter
attendre
jusqu'à ce que SIG = 1 ; détection du front montant de début de comptage

OPTION_REG = x x 0 x 0 0 0 1 ; lancement du comptage


INTCON = x x 1 x x 0 x x

répéter
attendre
jusqu'à ce que SIG = 0 ; attente pour mesure période

répéter
attendre
jusqu'à ce que SIG = 1 ; détection du front montant de fin de comptage

T (SIG) = VAR x 256 + TMR0

Algorithme de traitement de l'interruption 'débordement de TMR0'

Si T0IF = 1 ; repérage du débordement


VAR = VAR+1 ; incrémentation du détecteur de débordement
T0IF = 0 ; remise à 0 du flag de débordement
fin de si

M.Besse Page 4/5


dd/05/yy 06:04
Utilisation d'un timer de Contrôle
microcontrôleur
NOM : Prénom :

M.Besse Page 5/5


dd/05/yy 06:04