Clignotement d'une LED par timer
publication: 2 juillet 2022 / mis à jour 5 juillet 2022
Appel à collaboration
Vous développez des montages, simples ou complexes avec ESP32 et ESP32forth.
Partagez-les ici sur ce site.
ESP32forth ne pourra se développer qu'avec la collaboration active de toutes les bonnes volontés.
Vos montages peuvent aider d'autres développeurs.
Les montages des autres développeurs peuvent vous aider.
Pour proposer un article ou un montage, cliquez ici
Débuter en programmation FORTH
Tout débutant en programmation connait très bien cet exemple plus que classique: le clignotement d'une LED. Voici le code source, en langage C pour ESP32:
/* * This ESP32 code is created by esp32io.com * This ESP32 code is released in the public domain * For more detail (instruction and wiring diagram), * visit https://esp32io.com/tutorials/esp32-led-blink */ // the code in setup function runs only one time when ESP32 starts void setup() { // initialize digital pin GIOP18 as an output. pinMode(18, OUTPUT); } // the code in loop function is executed repeatedly infinitely void loop() { digitalWrite(18, HIGH); // turn the LED on delay(500); // wait for 500 milliseconds digitalWrite(18, LOW); // turn the LED off delay(500); // wait for 500 milliseconds }
En langage FORTH, ce n'est guère différent:
18 constant myLED
: led.blink ( -- )
myLED output pinMode
begin
HIGH myLED pin
500 ms
LOW myLED pin
500 ms
key? until
;
Si vous compilez ce code FORTH avec ESP32forth installé sur votre carte
ESP32 et que vous tapez led.blink
depuis le terminal, la LED
connectée au port GPIO18 va clignoter.
Au passage, on notera que pour injecter un code écrit en langage C, il faudra le compiler sur le PC, puis le téléverser sur la carte ESP32, opérations qui prennent un certain temps.
Alors qu'avec le langage FORTH, le compilateur est déjà opérationnel sur notre carte
ESP32. Le compilateur va compiler le programme écrit en langage FORTH en deux à trois secondes
et permettre son exécution immédiate en tapant simplement le mot contenant ce code,
ici led.blink
pour notre exemple.
En langage FORTH, on peut compiler des centaines de mots et les tester immédiatement, tous de manière individuelle, ce que ne permet pas du tout le langage C.
Pour expliquer ce qui est dit dans cet encadré, on va simplement factoriser notre code FORTH comme ceci:
18 constant myLED : led.on ( -- ) HIGH myLED pin ; : led.off ( -- ) LOW myLED pin ; : waiting ( -- ) 500 ms ; : led.blink ( -- ) myLED output pinMode begin led.on waiting led.off waiting key? until ;
Depuis le terminal, on peut simplement allumer la LED en tapant led.on
et l'éteindre en tapant led.off
. L'exécution de led.blink
reste possible.
En FORTH, chaque mot est l'équivalent d'une fonction en langage C.
Un mot FORTH peut être exécuté seul ou intégré à un nouveau mot. C'est le cas
de led.on
et led.off
qui sont intégrés à led.blink
.
La factorisation a pour but de découper une fonction complexe et peu lisible en un ensemble de fonctions plus simples et lisibles. Avec FORTH, la factorisation est conseillée, d'une part pour permettre une mise au point plus facile, d'autre part pour permettre la réutilisation des mots factorisés.
Ces explications peuvent paraitre triviales pour ceux qui connaissent et maitrisent
le langage FORTH. C'est loin d'être évident pour les personnes programmant en langage C,
obligés de regrouper les appels de fonctions dans la fonction générale loop()
.
Avec FORTH, on peut s'amuser à définir des mots en ne se limitant pas aux seuls caractères alphabétiques:
18 constant =O \ myLED : =O_/ ( -- ) \ led.high HIGH =O pin ; : =0\_ ( -- ) \ led.low LOW =O pin ; : ... ( -- ) \ waiting 500 ms ; : =O_/\_ ( -- ) =O output pinMode begin =O_/ ... =O\_ ... key? until ;
On peut tester le clignotement de la LED en exécutant =O_/\_
Maintenant que ceci est expliqué, on va tout oublier!
Parce que...
Clignotement par TIMER
On va oublier tout ce qui a été expliqué précédemment. Parce que cet exemple de clignotement de LED a un énorme inconvénient. Notre programme ne fait que ça et rien d'autre. En clair, c'est un vrai gâchis matériel et logiciel de faire clignoter une LED à notre carte ESP32. Nous allons voir une manière très différente de produire ce clignotement, en langage FORTH exclusivement.
ESP32forth dispose deux mots qui vont être très utiles pour gérer ce clignotement de
LED: interval
et rerun
.
Mais avant d'aborder le fonctionnement de ces deux mots, intéressons-nous à la notion d'interruption...
Les interruptions matérielles et logicielles
Si vous pensez gérer des micro-contrôleurs sans vous intéresser aux interruptions matérielles ou logicielles, alors abandonnez le développement informatique pour les cartes!
Vous avez le droit de débuter et ne pas connaître les interruptions. Et on va vous expliquer
les interruptions et la manière d'utiliser les interruptions par timers
dans le
cadre de cet article.
On va vous expliquer, par un exemple pas du tout informatique de ce qu'est une interruption:
- vous attendez un colis important;
- vous descendez toutes les minutes au portail de votre domicile, voir si le facteur est arrivé;
Dans ce scénario, vous passez en fait votre temps à descendre, regarder, remongter. En fait, vous n'avez quasiment plus le temps de faire autre chose...
Voici ce qui se passe en réalité:
- vous restez dans votre domicile;
- le facteur arrive et sonne à la porte;
- vous descendez et récupérez votre colis...
Un micro-contrôleur, ce qui inclue la carte ESP32, dispose de deux types d'interruptions:
- les interruptions matérielles: elles se déclenchent sur une action physique sur une des entrées GPIO de la carte ESP32;
- les interruptions logicielles: elles se déclenchent si certains registres atteignent des valeurs pré-définies.
C'est le cas des interruption par timer, que nous allons définir comme interruptions logicielles.
Utiliser les mots interval et rerun
Le mot interval
( xt usec t ) est défini dans le vocabulaire timers
.
Il accepte trois paramètres:
- xt qui les code d'ecxécution du mot à lancer quand l'interruption se déclenche;
usec
est le délai d'attente, en micro-secondes, avant déclenchement de l'interruption;t
est le numéro du timer à déclencher. Ce paramètre doit être dans l'intervalle [0..3]
Reprenons partiellement le code factorisé de notre clignotement LED:
18 constant myLED 0 value LED_STATE : led.on ( -- ) HIGH dup myLED pin to LED_STATE ; : led.off ( -- ) LOW dup myLED pin to LED_STATE ; timers \ select timers vocabulary : led.toggle ( -- ) LED_STATE if led.off else led.on then 0 rerun ; ' led.toggle 500000 0 interval : led.blink myLED output pinMode led.toggle ;
Le mot rerun
est précédé du numéro de timer activé avant la définition de interval
.
Le mot rerun
doit être utilisé dans la définition du mot exécuté par le timer.
Le mot led.blink
initialise la sortie GPIO utilisée par la LED. Puis exécute
led.toggle
.
Dans cette séquence FORTH dans cette séquence FORTH: ' led.toggle 500000 0 interval
, on
initialise le timer 0 en récupérant le code d'exécution du mot utilisant rerun
,
suivi de l'intervalle de temps, ici 500 millisecondes, puis le numéro du timer à déclencher.
Le clignotement de la LED démarre immédiatement après exécution du mot led.blink
.
L'interpréteur FORTh de ESP32forth reste accessible pendant le clignotement de la LED, chose impossible en langage C!
Legal: site web personnel sans commerce / personal site without seling