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 | | |
| 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(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). |
| 51 | Si elle n'est pas appelée pendant longtemps alors elle rend le nombre de périodes qui se sont écoulées. |
| 52 | |
| 53 | Dans l'application suivante nous avons deux tâches périodiques `Led()` et `Mess()`. |
| 54 | La première fait clignoter une led dont le numéro est passé en paramètre à 5Hz. |
| 55 | La seconde affiche bonjour à une fois par seconde. |
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 |
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; |
| 75 | void 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 |
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 | |
| 98 | Dans une application multiple |