Vous êtes sur la page 1sur 9

République algérienne démocratique et populaire

Ministère de l'Enseignement Supérieur et de la Recherche Scientifique


Université BLIDA 1. Master ESE
Département d’Électronique Semestre S1

Module : Système à Microcontrôleur


TP N=3 les timers du microcontrôleur ATMEGA 328

Charger de tp :MR Kabir _


Préparé par :
- Laid Abderrahmane
- Ouffa Wissal

2023/2024
Introduction :
Les timers sont des registres à l’intérieur d’un microcontrôleur qui s’incrémente ou se décrémente chaque
fois qu’il reçoit une impulsion d’un signal d’horloge. Le signal d’horloge peut être propre au
microcontrôleur ou bien extérieur à celui-ci. Un timer est donc un compteur capable de compter le temps
qui s’écoule, d’où son nom anglais de “timer counter”. Dans ce qui suit, le timer est toujours employé dans
un mode où il s’incrémente, mais dans d’autres modes, il peut se décrémenter.
Si le registre du timer comporte 8 bits, il est alors capable de compter de 0 à 255 (en hexadécimal, de 00 à
FF). Lorsqu’il arrive à 255 (FF), un coup d’horloge supplémentaire devrait le faire passer à 256 (soit 100 en
hexadécimal), ce qui n’est pas possible puisque le registre n’a que 8 bits. Le registre passe donc à 0 ; on dit
qu’il subit un débordement (Overflow en anglais) , mais ce débordement entraîne la mise à 1 d’un bit bien
particulier dans un registre de contrôle associé au timer. Ce bit est appelé un flag et indique que le timer
vient de compter jusqu’à 256, ce qui permet d’attirer l’attention du programmeur, L’intérêt d’un timer est
qu’il compte sans cesse et que pendant ce temps, le programme peut réaliser autre chose, ce qui n’est pas
possible si on utilise la fonction delay() qui est bloquante et qui ne permet pas de faire autre chose
pendant ce temps d’attente.
Le temps que le timer met pour compter 256 coups dépend bien sûr de la fréquence de l’horloge ; à 16
MHz (fréquence du microcontrôleur utilisé dans les modules Arduino), c’est très rapide, mais il est possible
de diviser cette fréquence d’horloge grâce à des circuits internes au microcontrôleur appelés prédiviseur
(prescaler en anglais). On peut alors diviser la fréquence de base (16 MHz)
Timers du microcontrôleur de l’Arduino :

Le module Arduino Uno est construit autour du microcontrôleur AVR ATmega328P d’Atmel qui possède 3 timers :

• Le timer0, sur 8 bits, utilisé par les fonctions delay(), millis() et micros(). Il commande également des PWM
(Pulse Width Modulation ou Modulation par Largeur d’Impulsion) sur les broches 5 et 6.
• Le timer1, sur 16 bits, qui compte de 0 à 65535 (0 à FFFF en hexadécimal) et qui est utilisé par la
bibliothèque Servo ou bien pour de la PWM sur les broches 9 et 10.
• Le timer2, sur 8 bits, qui est utilisé par la fonction Tone() ou bien pour de la PWM sur les broches 3 et 11.

Les registres de contrôle :

ASSR :Asynchronous Status Register GTCCR :General Timer/Counter Control Register

Le timer1 est un timer de 16 bits et est donc constitué de deux registres de 8 bits, l’un donnant les bits 0 à 7, l’autre
donnant les bits 8 à 15.

Pour se repérer dans ce tableau, il faut savoir que TCNT signifie Timer/Counter (Register), TCCR Timer/Counter
Control Register, OCR Output Compare Register, ICR Input Capture Register, TIMSK Timer/Counter Interrupt Mask
Register et TIFR Timer/Counter Interrupt Flag Register. OCR et ICR ont des rôles particuliers dont nous ne parlerons
pas dans ce premier article. TIMSK et TIFR servent pour que le timer puisse générer des interruptions [2] comme
nous le verrons dans un autre article.
Realisation :
Exo 1 : Timer 0 8 bits en mode normale sans utilisation des interruptions

Explication :
Le code montre comment utiliser le Timer 0 dans un microcontrôleur AVR pour créer un délai et inverser
un LED connecté au pin PD4. Le timer est configuré avec un diviseur de fréquence de 1024, permettant
qu'il se rebute après avoir compté 255,584 cycles (2^8 - 1). La flag d'overflow est utilisée pour déclencher
une interruption, qui inverse l'état du LED connecté au pin PD4.
Voici une explication breve de la mise en œuvre du code :
1. Inclure le fichier de tête nécessaire pour les opérations d'entrée/sortie AVR.
2. Définir la macro LED (PD4).
3. Initialiser les registres de timer et de compteur.
4. Utiliser une boucle while pour vérifier continuellement les overflows du timer.
5. Dans la boucle, attendre que la flag d'overflow (TIFRO) soit mise à 1.
6. Vider la flag d'overflow (TIFRO) pour éviter de manquer un overflow.
7. Incrémenter le compteur d'overflow (timerOverflowCount).
8. Si le compteur d'overflow atteint 39 (correspondant à un délai de 1 seconde avec un diviseur de
fréquence de 1024), inverser l'état du LED et réinitialiser le compteur d'overflow.
Conclusion:
on a expliqué le code qui utilise un timer pour toggler l'état d'une LED toutes les 50 unités de temps. Ce
code met en utilisation le timer Timer0 avec un prescaler de 1024 et un mode de fonctionnement normal.
Il a également utilisé un compteur de débordement pour détecter l'overflow du timer et incrémenter un
compteur de débordement. Lorsque le compteur de débordement atteint un certain seuil, il a inversé l'état
de la LED et a réinitialisé le compteur de débordement.
Exo 2 : Timer 1 16 bits en mode normale sans utilisation des interruptions
Le montage :

Voici le code :

Explication :
Ce code crée efficacement un retard à l'aide de Timer 1 et bascule la LED connectée à la broche PD4
lorsque le retard est atteint.
• La directive #include <avr/io.h> inclut la bibliothèque AVR IO, qui fournit un accès aux registres
d'E/S du microcontrôleur AVR.
• La directive #define LED PD4 définit la broche de la LED comme PD4.
• À l'intérieur de la fonction main(), le registre DDRD est défini sur 0b00010000, ce qui définit la
broche PD4 comme une sortie.
• Les registres TCNT1, TCCR1A et TCCR1B sont configurés pour initialiser Timer 1 et définir le diviseur
de fréquence à 1024, ce qui détermine la vitesse du minuteur.
• Le code entre ensuite dans une boucle continue, où il attend que le drapeau de débordement de
Timer 1 soit défini. Une fois le drapeau défini, il le efface, réinitialise la valeur du compteur et
bascule la LED.
Conclusion:
On a établi un code qui utilise un timer pour créer un délai de 1000 ms entre chaque togglement de la LED.
Ce code utilise le timer Timer1 avec un prescaler de 1024 et un mode de fonctionnement CTC. Il a
également utilisé un compteur de débordement pour détecter l'overflow du timer et incrémenter un
compteur de débordement. Lorsque le compteur de débordement atteint un certain seuil, il a inversé l'état
de la LED et a réinitialisé le compteur de débordement.

Exo 3 : Timer en mode normale avec utilisation des interruptions


Voici le code :

Explication :
Ce code crée efficacement un retard à l'aide de Timer 2 et bascule l'état de la LED connectée à la broche PB2 lorsque
le retard est atteint.

• La variable hh est initialisée à 0.

• La fonction ISR(TIMER2_OVF_vect) est une interruption qui est déclenchée lorsque Timer 2 déborde. Elle
incrémente la variable hh et bascule l'état de la LED connectée à la broche PB2 lorsque hh atteint 61.

• La fonction setup() configure la broche PB2 comme sortie pour la LED et initialise Timer 2 avec un diviseur de
fréquence de 1024. Elle active également l'interruption pour le débordement de Timer 2.

• La fonction loop() est vide car elle n'est pas utilisée dans ce code.

Conclusion:
On a complété le code qui utilise une interruption pour toggler l'état d'une LED chaque fois que l'overflow
du timer atteint. Ce code utilise le timer Timer2 avec un prescaler de 1024 et un mode de fonctionnement
CTC. Il a également utilisé un compteur de débordement pour détecter l'overflow du timer et incrémenter
un compteur de débordement. Lorsque le compteur de débordement atteint un certain seuil, il a inversé
l'état de la LED et a réinitialisé le compteur de débordement
Exo 4 : Timer 1 en mode CTC sans interruption

Explication :
Ce code crée efficacement un retard à l'aide de Timer 1 et bascule la sortie connectée à la broche OC1A
(PB1) à chaque comparaison, ce qui peut être utilisé pour contrôler une LED ou tout autre périphérique.
• La broche relative à OC1A est configurée comme sortie pour contrôler la LED ou tout autre
périphérique connecté à cette broche.
• Le drapeau de débordement de Timer 1 (TOV1) est initialisé à 1 pour s'assurer qu'il est prêt à être
utilisé.
• Le Timer 1 est configuré en mode CTC (Clear Timer on Compare Match) avec une valeur de
comparaison de 15625, ce qui provoquera une interruption et permettra de basculer la sortie
toutes les 1 seconde environ.
• Le prescaler est configuré à 1024, ce qui divise la fréquence d'horloge par 1024 et permet de
compter les secondes.
Conclusion:
On a complété un code qui utilise un interrupt pour toggler l'état d'une LED chaque fois que
l'overflow du timer atteint. Ce code utilise le timer Timer1 avec un prescaler de 256 et un mode de
fonctionnement CTC. Il a également utilisé un compteur de débordement pour détecter l'overflow
du timer et incrémenter un compteur de débordement. Lorsque le compteur de débordement
atteint un certain seuil, il a inversé l'état de la LED et a réinitialisé le compteur de débordement.
Exo 5 : Timer 1 en mode CTC avec interruption de comparaison

Explication :
Ce code crée efficacement un retard à l'aide de Timer 1 et bascule la sortie connectée à la broche OC1A
(PB3) à chaque comparaison, ce qui peut être utilisé pour contrôler une LED ou tout autre périphérique.
• La broche relative à OC1A est configurée comme sortie pour contrôler la LED ou tout autre
périphérique connecté à cette broche.
• Le Timer 1 est configuré en mode CTC (Clear Timer on Compare Match) avec une valeur de
comparaison de 15625, ce qui provoquera une interruption et permettra de basculer la sortie
toutes les 1 seconde environ.
• Le prescaler est configuré à 1024, ce qui divise la fréquence d'horloge par 1024 et permet de
compter les secondes.

Conclusion :
On a créé un code qui utilise un interrupt pour toggler l'état d'une LED chaque fois que l'overflow du timer
atteint. Ce code utilise le timer Timer1 avec un prescaler de 1024 et un mode de fonctionnement CTC. Il a
également utilisé un compteur de débordement pour détecter l'overflow du timer et incrémenter un
compteur de débordement. Lorsque le compteur de débordement atteint un certain seuil, il a inversé l'état
de la LED et a réinitialisé le compteur de débordement.
Exo 6 : Timer 1 en mode CTC

Explication :
Ce code crée efficacement un retard à l'aide de Timer 1 et bascule l'état de la LED connectée à la broche
PB3 à chaque comparaison, ce qui peut être utilisé pour contrôler une LED ou tout autre périphérique.
• La broche relative à OC1A est configurée comme sortie pour contrôler la LED ou tout autre
périphérique connecté à cette broche.
• Le Timer 1 est configuré en mode CTC (Clear Timer on Compare Match) avec une valeur de
comparaison de 62500, ce qui provoquera une interruption et permettra de basculer la sortie
toutes les 0,25 seconde environ.
• Le prescaler est configuré à 256, ce qui divise la fréquence d'horloge par 256 et permet de compter
les quarts de seconde.
• L'interruption pour la comparaison est activée et les interruptions globales sont activées pour
permettre l'exécution de l'interruption.
Conclusion:
On a créer un code qui utilise un interrupt pour toggler l'état d'une LED chaque fois que l'overflow du timer
atteint. Ce code utilise le timer Timer1 avec un prescaler de 256 et un mode de fonctionnement CTC. Il a
également utilisé un compteur de débordement pour détecter l'overflow du timer et incrémenter un
compteur de débordement. Lorsque le compteur de débordement atteint un certain seuil, il a inversé l'état
de la LED et a réinitialisé le compteur de débordement.

Conclusion du TP:
Dans le cadre de notre TP on a réussi à créer et comprendre plusieurs codes pour contrôler la toggling
d'une LED à l'aide de timers et d'interruptions. Vous avez utilisé des timers avec des préscalers et des
modes de fonctionnement spécifiques pour obtenir les résultats souhaités. Vous avez également utilisé
des compteurs de débordement pour détecter les overflow du timer et incrémenter un compteur de
débordement.

Vous aimerez peut-être aussi