Cours:TPS 2103 3

De troyesGEII
Révision datée du 21 avril 2014 à 13:51 par SergeMoutou (discussion | contributions) ({{Rouge|Génération d'un signal en sortie}})
Aller à : navigation, rechercher

Retour à la liste des Tps

Éléments de correction

Lien enseignant


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)

Documentation simple du Timer 2 (8 bits)

Voici ci-contre, avec les conventions schématiques habituelles, le schéma de fonctionnement du timer 2.

On distingue ainsi le bit b0 du registre TIFR2 appelé TOV2 qui est mis à un automatiquement par le matériel. Ce ne sera pas la matériel qui le mettra à 0 s'il n'y a pas d'interruptions. C'est à vous programmeur de le faire ! Mais pour le faire il vous faut écrire un 1 dans ce bit b0 !

Les habituels bits de configuration de la division se trouvent dans le registre TCCR2B et fonctionnent exactement comme pour timer 0.

Le registre ASSR sert à choisir la source de l'horloge du timer 2. Pour nous, sauf mention contraire, ce sera toujours le quartz. Ce registre doit être configuré dans ce mode de fonctionnement par défaut.

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)

Question.jpg 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()
{
}

Question.jpg 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).

Question.jpg É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()
//{
//}

Question.jpg É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

Nous allons commencer par générer un signal carré simple (rapport cyclique 0,5) sans interruption. La technique consiste à attendre (bêtement ?) que le drapeau de dépordement (TOV2) se positionne à 1. On n'oubliera pas de le remettre à 0 (en évrivant un 1 dedans !).

En scrutant le débordement

En utilisant le principe vu en td et l'exercice précédent, répondez à la question suivante :

Question.jpg 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);
  }
}


En utilisant une interruption