Changes between Version 12 and Version 13 of SujetTP6-2016


Ignore:
Timestamp:
Mar 23, 2016, 5:59:12 PM (9 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • SujetTP6-2016

    v12 v13  
    4646}}}
    4747
    48 Pour les tâches périodiques, nous pouvons écrire une fonction qui exploite un timer interne du processeur qui s'incrémente chaque microseconde. Cette fonction nommée waitFor() prend un numéro de timer (il en faudra autant que de tâches périoodiques) et une période en microsecondes. wairFor() rend 0 tant que le temps écoulé depuis le précédent appel est inférieur à la période en paramètre, sinon il rend le nombre de périodes entières écoulées depuis le dernier appel.
    49 
     48Pour les tâches périodiques, nous pouvons écrire une fonction qui exploite un timer interne du processeur qui s'incrémente chaque microseconde. Cette fonction nommée `waitFor(int timer, unsigned long period)` prend deux paramètres `timer` et `period`. Le premier un numéro de timer (il en faudra autant que de tâches périoodiques). Le second est une période en microsecondes.
     49
     50`wairFor()` peut être appelée aussi souvent que nécessaire, elle rend 1 une seule fois par période (second paramètre).
     51Si elle n'est pas appelée pendant longtemps alors elle rend le nombre de périodes qui se sont écoulées.
     52
     53Dans l'application suivante nous avons deux tâches périodiques `Led()` et `Mess()`.
     54La première fait clignoter une led dont le numéro est passé en paramètre à 5Hz.
     55La seconde affiche bonjour à une fois par seconde.
    5056{{{#!c
    5157// unsigned int waitFor(timer, period)
     
    6066unsigned int waitFor(int timer, unsigned long period){
    6167  static unsigned long waitForTimer[MAX_WAIT_FOR_TIMER];
    62   unsigned long newTime = micros() / period;
    63   int delta = newTime - waitForTimer[timer];
    64   if ( delta < 0 ) delta += 1 + (0xFFFFFFFF / period);   
    65   if ( delta ) waitForTimer[timer] = newTime;
     68  unsigned long newTime = micros() / period;              // numéro de la période modulo 2^32
     69  int delta = newTime - waitForTimer[timer];              // delta entre la période courante et celle enregistrée
     70  if ( delta < 0 ) delta += 1 + (0xFFFFFFFF / period);    // en cas de dépassement du nombre de périodes possibles sur 2^32
     71  if ( delta ) waitForTimer[timer] = newTime;             // enregistrement du nouveau numéro de période
    6672  return delta;
    6773}
    6874
    69 void Led(int timer, long period, int led) {
    70   static int val = 0;
    71   if (!waitFor(timer,period)) return; // sort s'il y a moins d'une période écoulée
    72   digitalWrite(13,val);
    73   val = 1 - val;
     75void Led(int timer, long period, byte led) {
     76  static byte val = 0;                                    // valeur à mettre sur la led
     77  if (!waitFor(timer,period)) return;                     // sort s'il y a moins d'une période écoulée
     78  digitalWrite(13,val);                                   // ecriture
     79  val = 1 - val;                                          // changement d'état
    7480}
    7581
    7682void Mess(int timer, long period, const char * mess) {
    77   if (!(waitFor(timer,period))) return;
    78   Serial.println(mess);
     83  if (!(waitFor(timer,period))) return;                   // sort s'il y a moins d'une période écoulée
     84  Serial.println(mess);                                   // affichage du message
    7985}
    8086
    8187void setup() {
    82   pinMode(13,OUTPUT);
    83   Serial.begin(115200);
     88  pinMode(13,OUTPUT);                                     // initialisation de la direction de la broche
     89  Serial.begin(115200);                                   // initialisation du débit de la liaison série
    8490}
    8591
    8692void loop() {
    87   Led (0,100000,13);           // Led est exécutée toutes les 100ms
    88   Mess(1,1000000,"bonjour");   // Mess est exécutée toutes les secondes
    89 }
    90 }}}
    91 
     93  Led (0,100000,13);                                      // Led est exécutée toutes les 100ms
     94  Mess(1,1000000,"bonjour");                              // Mess est exécutée toutes les secondes
     95}
     96}}}
     97
     98Dans une application multiple
    9299== Lecture de la luminosité ==
    93100