Ardu? No!Initiation ≫ delayMicroseconds()

delayMicroseconds()

Jusqu'à présent nous avons utilisé l'instruction delay() sans trop se préoccuper des limites de temps, sauf quand on a écrit delay(-1); pour avoir le délai le plus long possible. Et encore que cela fasse un jour ou un an, c'était bien pareil pour nous.

Nous allons ici nous intéresser à une deuxième fonction procurant des délais, l'instruction delayMicroseconds(). Cette fonction ressemble fort à delay() sauf que le temps est donné en µs au lieu de ms. J'avais dit que si j'ai le temps en seconde, il suffit de multiplier par 1000 pour avoir le temps en ms. De même, comme une ms c'est 1000µs, si on a le temps en ms, il suffit de multiplier par 1000 pour avoir le temps en µs.

Le devoir

En reprenant le programme blink qui fonctionne, remplacez delay() par delayMicroseconds() (et multipliez les valeurs par 1000 bien sûr). Faites l'essaivoid setup() { pinMode(LED_BUILTIN, OUTPUT); // Par défaut elle est en entrée } void loop() { digitalWrite(LED_BUILTIN, HIGH); // On allume delayMicroseconds(100000); // Allumée 1/10ème du temps digitalWrite(LED_BUILTIN, LOW); // On éteint delayMicroseconds(900000); // Eteinte 9/10 du temps }.

La led semble allumée faiblement en permanence. En fait elle va clignoter très vite et l'œil ne voit que la moyenne de l'éclairement.

Recherche de l'erreur

Après quelques recherches sur ce qui a été dit, vous tiltez: pour les nombres sur 32 bits (non signés plus grands que 65535, ou signés plus grands que 32767), il faut suffixer par L ou UL. Vous vous empressez de remplacer les 500000 par 500000L, et là, miracle! C'est pareil.

Vous vous rappelez qu'il existe des listes de diffusion pour poser la question, mais pour ne pas passer pour un gros naze, vous avez envie de voir si cela ne viendrait pas de la fonction delayMicroseconds().

Pour avoir rapidement et en local (sans passer par internet) une information sur un élément du langage, cliquez dans l'IDE sur aide puis référence:

Image: Menu aide>référence

Va s'ouvrir une page avec tous les éléments du langage, dont la plupart des fonctions. Cliquez sur delayMicroseconds et vous aurez une description en anglais. Pour avoir la même page en français sur internet, faites une recherche sur Arduino delayMicroseconds().

Dans cette page est indiqué que le plus grand délai est de 16383µs (c'est en fait le nombre le plus grand sur 14 bits). Voila pourquoi, le temps n'était pas bon. On ne peut pas mettre 900000L. Enfin si mais ce n'est pas la valeur qui est traduite par le compilateur. On a en fait le reste de la division par 16384 soit 14162 seulement. Cela fait environ 0,014s et c'est donc normal que cela clignote très vite

Mon but était de vous encourager à aller voir de temps en temps cette page d'aide. Elle peut être utile pour avoir la syntaxe de certaines instructions, ou un nom (par exemple est-ce LED_BUITLIN ou BUITLIN_LED?).

Maintenant si vous voulez vraiment faire le clignotement avec delayMicroseconds(), c'est possible, mais comme cette fonction est limitée à environ 10ms, pour attendre 0,9s ou 900ms, il suffit de faire 90 boucles de 10000µs:

for (boucle=0; boucle<90; boucle++) delayMicroseconds(10000);