Cours:InfoS2 tdTimerCTC : Différence entre versions

De troyesGEII
Aller à : navigation, rechercher
(Utilisation d'une broche quelconque)
(1ère version simple)
 
(5 révisions intermédiaires par le même utilisateur non affichées)
Ligne 34 : Ligne 34 :
 
   // choisir prédiviseur du timer
 
   // choisir prédiviseur du timer
 
   // choisir le mode CTC
 
   // choisir le mode CTC
   // choisir la valeur de remise à 0 du timer
+
   // choisir la valeur de remise à 0 du timer : valeur Top
 
   // activer le contrôle de la sortie par le timer
 
   // activer le contrôle de la sortie par le timer
 
   while(1)
 
   while(1)
Ligne 49 : Ligne 49 :
 
{{Question|Faire clignoter la led à une fréquence de 3Hz}}
 
{{Question|Faire clignoter la led à une fréquence de 3Hz}}
  
  La période de l'interruption est donnée par l'expression Tinter = (P*Top) / Fcpu , avec Top la valeur maximale du Timer et P la valeur du prédiviseur
+
  La période de l'interruption (durée entre 2 interruptions) est donnée par l'expression Tinter = (P*Top) / Fcpu , avec Top la valeur maximale du Timer et P la valeur du prédiviseur
  
 
<source lang=cpp>
 
<source lang=cpp>
Ligne 64 : Ligne 64 :
 
   // choisir prédiviseur du timer
 
   // choisir prédiviseur du timer
 
   // choisir le mode CTC
 
   // choisir le mode CTC
   // choisir la valeur de remise à 0 du timer
+
   // choisir la valeur de remise à 0 du timer : valeur Top
 
   // activer l'interruption de comparaison
 
   // activer l'interruption de comparaison
 
   while(1)
 
   while(1)
Ligne 79 : Ligne 79 :
 
*Écrire le programme d’un chenillard qui change de led toutes les 200ms.
 
*Écrire le programme d’un chenillard qui change de led toutes les 200ms.
 
*Faire en sorte qu’un appui sur le bouton PD2/PD3, divise/multiplie par 2 la vitesse de défilement.
 
*Faire en sorte qu’un appui sur le bouton PD2/PD3, divise/multiplie par 2 la vitesse de défilement.
 +
 +
=Répéter une action avec des durées variables=
 +
 +
==1ère version simple==
 +
On souhaite faire clignoter une led de la façon suivante :
 +
*allumée pendant 100ms
 +
*éteinte pendant 500ms
 +
*et on recommence
 +
 +
{{Question|Ecrire un tel programme :}}
 +
*choisir un prédiviseur qui permettra de réaliser ces 2 durées
 +
*calculer les valeurs Top permettant d'avoir les 2 durées possibles : 100/500 ms
 +
*gestion allumer/eteindre
 +
**déclarer une variable '''static''' isAllumee dans la fonction d'interruption de type '''bool'''
 +
**inverser la valeur de isAllumee à chaque interruption
 +
**selon la valeur de isAllumee :
 +
***modifier l'état de la sortie
 +
***changer la valeur Top du Timer
 +
 +
==2ère version==
 +
On souhaite faire clignoter une led de la façon suivante :
 +
*allumée pendant 100ms  (etat 1)
 +
*éteinte pendant 500ms
 +
*allumée pendant 200ms  (etat 2)
 +
*éteinte pendant 500ms
 +
*allumée pendant 400ms  (etat 3)
 +
*éteinte pendant 500ms
 +
*et on recommence
 +
 +
{{Question|Ecrire un tel programme :}}
 +
*choisir un prédiviseur qui permettra de réaliser n'importe laquelle de ces durées
 +
*calculer les valeurs Top permettant d'avoir les 4 durées possibles : 100/200/400/500 ms
 +
*on conserver la gestion allumer/eteindre
 +
*on ajoute une 2ème variable static de type uint8_t nommée etat
 +
**incrémenter la valeur de etat lorsqu'on allume la led
 +
**changer la durée du Timer en fonction de etat

Version actuelle datée du 12 février 2026 à 20:44

Atmega328pPinout.jpeg

Fiche résumé

Retour à la liste des Tds/Tps

Éléments de correction

simuler avec simulIDE

Pensez à mettre sur la 1ère ligne de votre code :
// Compiler: Avrgcc device: nomDuMicrocontroleur


*****************************************
*****************************************
*****************************************
*** feuille de calcul pour les TIMERS ***
*****************************************
*****************************************
*****************************************
Fichier simulIde : Media:infouc_ActionPeriodique.sim1

Génération d'un signal carré périodique

On souhaite faire clignoter une led en utilisant le timer1 d'un atmega328p.

La fréquence du CPU est de Fcpu=1MHz.

Utilisation de la broche OC1A

Une led est connectée sur la broche PB1 ( OC1A ). Le timer1 peut générer directement un signal sur cette broche particulière.

Question.jpg Faire clignoter la led à une fréquence de 0.5Hz

La fréquence de la sortie est donnée par l'expression Fs = Fcpu / (2*P*Top) , avec Top la valeur maximale du Timer et P la valeur du prédiviseur
#include ...

int main()
{
  // configurer sortie
  // choisir prédiviseur du timer
  // choisir le mode CTC
  // choisir la valeur de remise à 0 du timer : valeur Top
  // activer le contrôle de la sortie par le timer
  while(1)
  {
  }
}
documentation sur le timer1 partie 16 (les registres page 131 et suivantes) de la datasheet

Utilisation d'une broche quelconque

Une led est connectée sur la broche PD5. Cette led n'étant pas connectée à un timer, on devra utiliser une fonction d'interruption qui sera exécutée régulièrement.

Question.jpg Faire clignoter la led à une fréquence de 3Hz

La période de l'interruption (durée entre 2 interruptions) est donnée par l'expression Tinter = (P*Top) / Fcpu , avec Top la valeur maximale du Timer et P la valeur du prédiviseur
#include ...

ISR(TIMER1_COMPA_vect)
{
   ...
}

int main()
{
  // configurer sortie
  // choisir prédiviseur du timer
  // choisir le mode CTC
  // choisir la valeur de remise à 0 du timer : valeur Top
  // activer l'interruption de comparaison
  while(1)
  {
  }
}
documentation sur le timer1 partie 16 (les registres page 131 et suivantes) de la datasheet

Action périodique

On utilise toujours le timer1, et on souhaite l’utiliser pour cadencer un chenillard qui utilise les 6 leds du PORTB.

  • Écrire le programme d’un chenillard qui change de led toutes les 200ms.
  • Faire en sorte qu’un appui sur le bouton PD2/PD3, divise/multiplie par 2 la vitesse de défilement.

Répéter une action avec des durées variables

1ère version simple

On souhaite faire clignoter une led de la façon suivante :

  • allumée pendant 100ms
  • éteinte pendant 500ms
  • et on recommence

Question.jpg Ecrire un tel programme :

  • choisir un prédiviseur qui permettra de réaliser ces 2 durées
  • calculer les valeurs Top permettant d'avoir les 2 durées possibles : 100/500 ms
  • gestion allumer/eteindre
    • déclarer une variable static isAllumee dans la fonction d'interruption de type bool
    • inverser la valeur de isAllumee à chaque interruption
    • selon la valeur de isAllumee :
      • modifier l'état de la sortie
      • changer la valeur Top du Timer

2ère version

On souhaite faire clignoter une led de la façon suivante :

  • allumée pendant 100ms (etat 1)
  • éteinte pendant 500ms
  • allumée pendant 200ms (etat 2)
  • éteinte pendant 500ms
  • allumée pendant 400ms (etat 3)
  • éteinte pendant 500ms
  • et on recommence

Question.jpg Ecrire un tel programme :

  • choisir un prédiviseur qui permettra de réaliser n'importe laquelle de ces durées
  • calculer les valeurs Top permettant d'avoir les 4 durées possibles : 100/200/400/500 ms
  • on conserver la gestion allumer/eteindre
  • on ajoute une 2ème variable static de type uint8_t nommée etat
    • incrémenter la valeur de etat lorsqu'on allume la led
    • changer la durée du Timer en fonction de etat