Vous êtes sur la page 1sur 28

Cours 5- Programmation du

microcontrôleur ATmega 328P.


Gestion des Temporisateurs
(TIMERS)
Prof Hacine BENCHOUBANE
1. Introduction

 Dans un ATmega 328, nous disposons de 03 Timers/counters; 02 Timers/Counter de


08 bits et un Timer/Counter de 16 bits.
 Ces timers disposent de vecteurs d’interruptions distincts, du vecteur #8 au vecteur
#17, voir P65 de la datasheet de ce MCU.
 Ces timers sont souvent utilisés en tant que counters qui provoquent des
interruptions si des valeurs de comptage ont atteints des seuils prédéfinis.
 Dans le chapitre Register Summary (page 612), on trouvera les différents registres de
chaque Timer/counter ainsi que leurs adresses.

2. Mode de fonctionnement

 Tous ces timers peuvent être directement reliés à l’horloge du système.


 Le signal d’horloge est un signal carré de 16 MHz généré par un quartz et un oscillateur interne.
 Nous allons donc avoir une impulsion d’horloge de type front montant chaque 62.5 ns.
 Ces impulsions d’horloge passent souvent par des diviseurs de fréquence (Prescalar). Ces derniers
ont pour rôle de diviser la fréquence du signal d’horloge initial par un facteur (8, 16, ou autres).
Leur signal de sortie admettra dans ce cas une fréquence réduite par rapport au signal d’horloge
initial par un facteur de 8, 16 etc..
 Il faudra noter que les Timers 0 et Timer 2 sont des timers de 8 bits chacun et qui disposent d’un
comparateur permettant de comparer la valeur comptée(accumulée) par rapport à la valeur
enregistrée dans le comparateur. Un signal d’interruption peut ainsi être généré. Ils disposent
aussi de la fonctionnalité Overflow,; génération d’un signal si la valeur maximum de comptage est
atteinte.
 Le Timer 1 est un timer de 16 bits et qui dispose de la fonctionnalité Input Capture; la possibilité
de transférer sa valeur accumulée dans un autre registre en cas d’interruption.
 Voir la figure et table ci-dessous:
 Pour une fréquence d’horloge de 16Mhz, la période de ce signal est de 62.5 ns.
 Si on utilise un diviseur de fréquence de 8 (prescalar), le signal de sortie de ce
diviseur aura une période de 500 ns. (62.5 x 8 = 500 ns).
 Si on utilise un diviseur de fréquence de 64 (prescalar), le signal de sortie de ce
diviseur aura une période de 4000 ns.
 Si on utilise un diviseur de fréquence de 256 (prescalar), le signal de sortie de ce
diviseur aura une période de 16 000 ns.
 Si on utilise un diviseur de fréquence de 1024 (prescalar), le signal de sortie de ce
diviseur aura une période de 64 000 ns.
 Si par exemple on utilise un compteur de 8bits, qui va compter de 0 à 255 puis se
mettre à 0 et recompter (overflow), on constatera qu’on va avoir 16000000/256
overflows à gérer par seconde,(62.5 KHz) ce qui est très onéreux.
 D’où l’utilité d’utiliser des diviseurs qui vont réduire la fréquence d’horloge et par
conséquence le nombre d’overflows à gérer.
 Par exemple, si on utilise un diviseur (prescalar)de 1024, on aura une nouvelle
fréquence d’horloge de 16000000/1024 = 15.625 KHz. Si on utilise un compteur de 8
bits, on aura alors seulement 15625/256 = 61,035 overflows à gérer par seconde.
D’où l’intérêt d’utiliser les diviseurs de fréquence.
 Dans ce qui suit, nous allons utiliser le Timer 1 (16 bits) pour générer une oscillation
de 1 Hz sur la pin 13 de la carte Arduino.
3. Programmation des registres du Timer 1

 Pour utiliser le Timer 1 pour générer un signal de fréquence 1 Hz, , on aura besoin des
registres suivants:

 Nous allons configurer chacun de ces registres comme suit:


3.1. Description du signal de sortie

 Nous allons par exemple générer un signal de fréquence 1 Hz, soit un niveau haut de
500 ms et un niveau bas de 500 ms qui se succèdent. A chaque changement d’état,
nous allons générer une interruption.

 Donc un compteur de 16 bits pourra mesurer au maximum 2^16 – 1 impulsions, soit


le nombre décimal 65535.
 Donc les opérations suivantes se produisent:
 Écrire un programme en utilisant les registres pour faire clignoter la led 13 à une
fréquence de 1 Hz.
 On va configurer maintenant la valeur du Pescalar. Pour ce faire , observons que:
 Pour connaitre le nombre d’impulsions nécessaires pour compter 0.5s selon la valeur
de chaque Prescalar, on fera les calculs suivants:
 Pour Prescalar = 1 ce sera 0.5 . 16 000000/1 = 8.000.000 impulsions
 Pour Prescalar = 8 ce sera 0.5 . 16000000/8 = 1.000.000 impulsions
 Pour Prescalar = 64 ce sera 0.5 . 16000000/64 = 125.000 impulsions
 Pour Prescalar = 256 ce sera 0.5 . 16000000/256 = 31.250 impulsions (à charger
dans le OCR1A)
 Pour Prescalar = 1024 ce sera 0.5 . 16000000/1024 = 7.812, 15 impulsions. Elle
peut être utilisée aussi.
 Durée x 16.000.000/prescalar = nombre d’impulsions à compter
 En page 134, le tableau suivant décrit l’état des bits CS10, CS11 et CS12 du TCCR1B.
Cas d’une horloge externe

 .
3.2. Étapes à suivre

 Pour un Prescalar de 256, on doit sélectionner la combinaison binaire 100 pour ces
bits (CS12, CS11, CS10).
 Nous devons aussi inscrire notre valeur seuil d’enclenchement (31250) dans le
registre OCR1A.
 Finalement nous devons aussi paramétrer le Timer Counter 1 Mask register (TIMSK1,
page 135) comme suit:
 Dans notre cas, on doit mettre le bit 1 de ce registre à 1.
 En résume, chaque Timer possède:
- Un registre TCNT qui est un registre compteur et la valeur de accumulée y’est
stockée.
- A chaque reset , la valeur du TCNT est égale à 0.
- La valeur dans chaque TCNT peut être lue ou écrite.
- A chaque Overflow, un bit TOV est généré.
- Chaque Timer possède un registre TCCR afin de définir les modes opératoires.
- Chaque Timer possède aussi un registre OCR et le contenu du OCR est comparé à celui
du TCNT afin de générer une interruption en cas d’égalité. Dans ce cas, le bit OCF est
mis à 1.
4. Méthode alternative de programmation

 Plusieurs types d’interruption peuvent être générées par d’autres signaux tels que
Overflow etc..
 On peut utiliser la fonctionnalité de Clear Timer en compare mode, ce qui implique
que le timer est mis à 0 si la condition de comparaison est active.
 Comme on va le voir dans le langage assembleur, il est possible d’avoir de longues
temporisations en créant des boucles à l’intérieur d’autres boucles. Ceci sera traité
dans le cours de programmation assembleur.
Exercice 1

 Créer un programme pour générer un signal carré de fréquence 2Hz . Utiliser la sortie
13 pour cela.
 Corrigé:
 Fréquence 2Hz, soit une période de 500 ms, soit une demi-période de 250 ms.
 Il faudra que la durée de 250 ms corresponde à un nombre d’impulsions comptées,
d’où la valeur à mettre dans le compteur et bien sûr le présalaire à choisir:

Vous aimerez peut-être aussi