Cours:TPS XR207 tpTimer : Différence entre versions

De troyesGEII
Aller à : navigation, rechercher
Ligne 51 : Ligne 51 :
  
  
=> méthode en utilisant un delay
+
=={{Bleu|l'outil adapté : '''le timer''' !}}==
 +
 
 +
Passons aux choses sérieuses en utilisant un timer (en l’occurrence le timer2 d'un atmega328p), et donnons tout d'abord les 2 figures qui nous permettront de le configurer facilement :
 +
 
 +
{|
 +
|-
 +
| [[Fichier:AVR_Timer2.png|thumb|500px|Documentation simple du Timer 2 (8 bits)]] || [[File:AVR Timer2 Comp.png|thumb|500px|center|La comparaison avec le Timer 2 (8 bits)]]
 +
|}
 +
 
 +
Remarquons tout de suite qu'il s'agit d'{{Rouge|un compteur 8 bits}}, c'est à dire qu'il générera un débordement (overflow) lors du passage de 255 à 0.
 +
 
 +
 
 +
==={{Vert|Paramètres du timer}}===
 +
 
 +
Comme pour toute utilisation du timer, il est nécessaire de choisir :
 +
*la valeur du prédiviseur, et donc la fréquence de comptage : f<sub>cpt</sub>=f<sub>q</sub>/p
 +
*le nombre de fois que le compteur s'incrémentera, n, avant d'être réinitialisé
 +
On rappelle que sur les cartes arduino UNO, f<sub>q</sub>=16MHz
 +
 
 +
La figure ci après doit vous permettre de trouver facilement la relation entre les différentes valeurs et ainsi déterminer les valeurs n et p adaptées à notre problème.
 +
 
 +
[[Fichier:ChronogrammeTimer.png]]
 +
 
 +
{{Question|Faire un choix pour n et p}}
 +
 
 +
 
 +
==={{Vert|Mode comparaison avec interruption}}===
 +
Nous pouvons désormais écrire le programme utilisant le timer2, qui devra utiliser le mode comparaison.
 +
 
 +
Autrement dit, on configure le timer pour que sa valeur soit réinitialisée à 0 lorsqu'il atteint la valeur OCR2A (ou si vous préférez la valeur n que vous avez calculé juste avant).
 +
 
 +
Comme indiqué sur la figure un peu plus haut, il s'agit de configurer les bits WGM2[2..0] dans le mode adéquat.
 +
 
 +
 
 +
 
  
=> usage du timer mode comparaison avec interruption
 
  
 
=> sortie directe du timer sur patte
 
=> sortie directe du timer sur patte

Version du 3 avril 2015 à 13:32

Retour à la liste des Tps

Éléments de correction

Nous allons dans ce TP nous pencher sur l'utilisation des timers, notamment pour générer un signal, ceci en utilisant le moins possible les ressources du µcontrôleur.

ArduinoPinout.png

Comment générer un signal périodique

Nous allons dans cette partie comparer les 2 principales méthodes pour générer un signal périodique.

Dans toute cette partie, nous considérerons une sortie périodique telle que :

  • le signal est carré (2 états '0' ou '1')
  • de fréquence 1kHz
  • de rapport cyclique 1/2
  • sortie sur la patte PB3

avec une attente .... méthode basique !

Commençons tout simplement par utiliser une attente, comme nous l'avons fait dans le tp précédent.

Il suffit tout bonnement de configurer correctement la valeur d'attente.

Remarquons que pour plus de précision, il est possible d'utiliser la fonction _delay_us(xxx), dont le nom est suffisamment explicite pour se passer d'une description !

Question.jpg Écrire un programme générant le signal souhaité, et le visualiser avec un oscilloscope.


#include <util/delay.h>

int main()
{
   // configuration e/s

   while(1)                // boucle
   {
      // modification de la sortie

      // attente
      _dela.....
   }
}

Remarque : Comme expliqué en TD, cette méthode fonctionne mais entraîne une occupation à 100% du processeur, qui ne peut donc réaliser que cette action !


l'outil adapté : le timer !

Passons aux choses sérieuses en utilisant un timer (en l’occurrence le timer2 d'un atmega328p), et donnons tout d'abord les 2 figures qui nous permettront de le configurer facilement :

Documentation simple du Timer 2 (8 bits)
La comparaison avec le Timer 2 (8 bits)

Remarquons tout de suite qu'il s'agit d'un compteur 8 bits, c'est à dire qu'il générera un débordement (overflow) lors du passage de 255 à 0.


Paramètres du timer

Comme pour toute utilisation du timer, il est nécessaire de choisir :

  • la valeur du prédiviseur, et donc la fréquence de comptage : fcpt=fq/p
  • le nombre de fois que le compteur s'incrémentera, n, avant d'être réinitialisé

On rappelle que sur les cartes arduino UNO, fq=16MHz

La figure ci après doit vous permettre de trouver facilement la relation entre les différentes valeurs et ainsi déterminer les valeurs n et p adaptées à notre problème.

ChronogrammeTimer.png

Question.jpg Faire un choix pour n et p


Mode comparaison avec interruption

Nous pouvons désormais écrire le programme utilisant le timer2, qui devra utiliser le mode comparaison.

Autrement dit, on configure le timer pour que sa valeur soit réinitialisée à 0 lorsqu'il atteint la valeur OCR2A (ou si vous préférez la valeur n que vous avez calculé juste avant).

Comme indiqué sur la figure un peu plus haut, il s'agit de configurer les bits WGM2[2..0] dans le mode adéquat.



=> sortie directe du timer sur patte

=> buzzer

=> mélodie

=> changer les notes avec 2ème timer