Cours:TPS 2103 3 : Différence entre versions
m (→{{Rouge|Génération d'un signal en sortie}}) |
m (→{{Rouge|Mesure de temps d'exécution}}) |
||
Ligne 19 : | Ligne 19 : | ||
*Observer la valeur du timer | *Observer la valeur du timer | ||
*Afficher cette valeur | *Afficher cette valeur | ||
+ | =={{Bleu|Le timer 2 et ses registres (sans interruption)}}== | ||
+ | Voici, avec les conventions schématiques habituelles, le schéma de fonctionnement du timer 2 : | ||
+ | |||
+ | [[Fichier:AVR_Timer2.png|thumb|500px|Documentation simple du Timer 2 (8 bits)]] | ||
=={{Bleu|Configuration des entrées/sorties}}== | =={{Bleu|Configuration des entrées/sorties}}== | ||
Ligne 93 : | Ligne 97 : | ||
{{Question|Écrire le même code en utilisant directement les registres ad-hoc et comparer les vitesses d'exécution.}} | {{Question|Écrire le même code en utilisant directement les registres ad-hoc et comparer les vitesses d'exécution.}} | ||
− | |||
={{Rouge|Génération d'un signal en sortie}}= | ={{Rouge|Génération d'un signal en sortie}}= |
Version du 21 avril 2014 à 12:32
Sommaire
Mesure de temps d'exécution
Commençons par analogie au td à essayer de mesurer le temps d'exécution d'une fonction.
Nous allons en profiter pour mesurer le temps d'exécution de certaines fonctions Arduino, et se rendre compte de l'une de leu principale limite.
Le temps écoulé sera mesuré à l'aide du Timer 2.
Le principe est toujours le même :
- Initialiser le timer
- Répéter plusieurs fois l'instruction souhaitée
- Observer la valeur du timer
- Afficher cette valeur
Le timer 2 et ses registres (sans interruption)
Voici, avec les conventions schématiques habituelles, le schéma de fonctionnement du timer 2 :
Configuration des entrées/sorties
Nous souhaitons ici évaluer le temps mis par la fonction pinMode().
L'affichage du résultat sera tout simplement transmis sur la liaison série en utilisant les fonctions suivantes :
- Serial.begin(debit)
- Serial.print("valeur = ")
- Serial.println(valeur,DEC)
Compléter le programme suivant en choisissant les bonnes valeurs pour évaluer le temps d'exécution de pinMode()
void setup()
{
// Variables éventuelles
// Initialisation du port série
Serial.begin(9600);
// Configuration du timer 2 : Attention, chaque bit doit être configuré à '0' ou '1'
TCCR2A ??? (1<<WGM20);
TCCR2A ??? (1<<WGM21);
TCCR2B ??? (1<<CS22);
TCCR2B ??? (1<<CS21);
TCCR2B ??? (1<<CS20);
// Initialisation du Timer : acquittement et valeur de départ
TIFR2|=1<<TOV2;
TCNT2=0;
for (i=0;i<1;i++) // Le nombre d'itérations peut/doit être adapté !
{
// Fonction à évaluer : il est intéressant de répéter la fonction plusieurs fois
pinMode(6,OUTPUT);
}
// Récupérer la valeur du timer et l'afficher seulement si le timer n'a pas débordé !!!
}
void loop()
{
}
Comparer en déclarant une sortie directement en configurant le registre DDRx
Valeur de sortie
Si la fonction pinMode() est d'importance, sa durée d'exécution ne l'est pas forcément puisque la plupart du temps elle n'est exécutée qu'une seule fois.
Allons donc un peu plus loin dans la manipulation des ports en modifiant l'état d'une sortie (pin 6 arduino ou PD6).
Évaluer la durée d'exécution du code suivant :
//void setup()
//{
pinMode(6,OUTPUT);
for (char i=0;i<10;i++)
{
digitalWrite(6,0);
digitalWrite(6,1);
}
//}
//void loop()
//{
//}
Écrire le même code en utilisant directement les registres ad-hoc et comparer les vitesses d'exécution.
Génération d'un signal en sortie
En scrutant le débordement
En utilisant le principe vu en td et l'exercice précédent, répondez à la question suivante :
Faire un programme qui génère un signal de fréquence 1kHz sur la patte PB3, en utilisant le timer 2
Remarque : Vous en profiterez pour vous passez de toute fonction arduino :
int main()
{
// variables
// e/S
DDRx|=1<<Pxx;
// configuration du timer2
TCCR2A ??? (1<<WGM20);
TCCR2A ??? (1<<WGM21);
TCCR2B ??? (1<<CS22);
TCCR2B ??? (1<<CS21);
TCCR2B ??? (1<<CS20);
TIFR2|=1<<TOV2;
TCNT2=0;
for (;;)
{
// Attendre un débordement du timer
while (???) ;
// Acquitter le débordement
????
// Changer l'état de la sortie
PORTx ^= (1<<Pxx);
}
}