Cours:TPS XR207 tpTimer : Différence entre versions
(→{{Bleu|l'outil adapté : le timer !}}) |
|||
Ligne 84 : | Ligne 84 : | ||
Comme indiqué sur la figure un peu plus haut, il s'agit de configurer les bits WGM2[2..0] dans le mode adéquat. | Comme indiqué sur la figure un peu plus haut, il s'agit de configurer les bits WGM2[2..0] dans le mode adéquat. | ||
+ | Il conviendra également de générer une interruption à chaque remise à zéro (ou plus exactement lors de chaque comparaison), et pour ce faire il suffit : | ||
+ | *autoriser l'interruption de comparaison : TIMSK2|=1<<OCIE2A | ||
+ | *autoriser globalement les interruptions : sei() | ||
+ | *la fonction d'interruption sera définie par : ISR(TIMER2_COMPA_vect) | ||
+ | La valeur de sortie sera alors modifiée à chaque interruption, et le µcontrôleur pourra vaquer à d'autres activités dans le programme principal. | ||
+ | {{Question|Écrire le programme utilisant le Timer2, en vous servant du squelette suivant :}} | ||
+ | <source lang=c> | ||
+ | // Fonction de traitement Timer 2 Comparaison | ||
+ | ISR(TIMER2_COMPA_vect) | ||
+ | { | ||
+ | // il suffit de changer l'état de la sortie | ||
+ | } | ||
+ | |||
+ | int main() | ||
+ | { | ||
+ | // variables | ||
+ | |||
+ | // e/s | ||
+ | |||
+ | // configuration du timer2 (prédiviseur) | ||
+ | |||
+ | // autorisation d'interruption (cf ci dessus) | ||
+ | |||
+ | // boucle | ||
+ | while(1) | ||
+ | { | ||
+ | // tout se passe dans l'interruption, rien à faire ici | ||
+ | } | ||
+ | } | ||
+ | </source> | ||
=> sortie directe du timer sur patte | => sortie directe du timer sur patte |
Version du 3 avril 2015 à 13:42
Retour à la liste des Tps
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. |
Sommaire
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 !
É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 :
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.
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.
Il conviendra également de générer une interruption à chaque remise à zéro (ou plus exactement lors de chaque comparaison), et pour ce faire il suffit :
- autoriser l'interruption de comparaison : TIMSK2|=1<<OCIE2A
- autoriser globalement les interruptions : sei()
- la fonction d'interruption sera définie par : ISR(TIMER2_COMPA_vect)
La valeur de sortie sera alors modifiée à chaque interruption, et le µcontrôleur pourra vaquer à d'autres activités dans le programme principal.
Écrire le programme utilisant le Timer2, en vous servant du squelette suivant :
// Fonction de traitement Timer 2 Comparaison
ISR(TIMER2_COMPA_vect)
{
// il suffit de changer l'état de la sortie
}
int main()
{
// variables
// e/s
// configuration du timer2 (prédiviseur)
// autorisation d'interruption (cf ci dessus)
// boucle
while(1)
{
// tout se passe dans l'interruption, rien à faire ici
}
}
=> sortie directe du timer sur patte
=> buzzer
=> mélodie
=> changer les notes avec 2ème timer