Les interruptions matérielles avec ESP32forth

publication: 20 juillet 2021 / mis à jour 20 juillet 2021

Read this page in english

 


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


Les interruptions

Quand on souhaite gérer des événements extérieurs, un bouton poussoir par exemple, nous disposons de deux solutions:

La solution par interruption est la plus élégante. Elle permet de soulager le programme principal en évitant la surveillance du bouton dans une boucle.

Dans sa documentation ESP32forth, Brad NELSON donne un exemple simple de gestion d'interruption:

17 input pinMode 
: test ." pinvalue: " 17 digitalRead . cr ; 
' test 17 pinchange 

Sauf que cet exemple, tel qu'il est rédigé, a de fortes chances de ne pas fonctionner. Nous allons voir pourquoi et donner les éléments pour qu'il fonctionne.

Montage du bouton poussoir

Pas de schéma. Le bouton est connecté en entrée à l'alimentation 3,3V de la carte ESP32.

La sortie du bouton poussoir est raccordée au pin GPIO17. C'est tout.

Pour que l'exemple de Brad NELSON soit fonctionnel, il faut sélectionner le vocabulaire interrupts avant de paramétrer l'interruption par pinchange. Au passage, on définira la constante button:

17 constant button 
button input pinMode 
: test ." pinvalue: " 
    button digitalRead . cr 
  ; 
interrupts 
' test button pinchange 
forth 

Aïe... Ca fonctionne, mais il y a effet inattendu qui provoque le déclenchement intempestif de l'interruption:

La solution matérielle consisterait à mettre une résistance de forte valeur en sortie du bouton et reliée à GND.

Consolidation logicielle de l'interruption

Dans la carte ESP32, on peut activer une résistance sur n'importe quel pin GPIO. Cette activation est réalisée par le mot gpio_pulldown_en. Ce mot accepte comme paramètre le numéro de pin GPIO dont il faut activer la résistance. En retour ce mot renvoie 0 si l'action s'est bien déroulée, un code d'erreur dans le cas contraire:

17 constant button 
button input pinMode 
: test ." pinvalue: " 
    button digitalRead . cr 
  ; 
interrupts 
button gpio_pulldown_en drop 
' test button pinchange 
forth 

Le résultat de l'exécution de l'interruption est nettement mieux:

A chaque changement d'état, on a une interruption. Sur la copie écran ci-dessus, chaque changement d'état affiche pinvalue: 1 puis pinvalue: 0.

Il est possible de prendre en compte une interruption sur le front montant seul. C'est possible en indiquant:

button GPIO_INTR_POSEDGE gpio_set_intr_type drop 

Le mot gpio_set_intr_type accepte ces paramètres:

Code FORTH complet avec détection du front montant:

17 constant button 
0 constant GPIO_PULLUP_ONLY 
button input pinMode 
: test ." pinvalue: " 
    button digitalRead . cr 
  ; 
interrupts 
button gpio_pulldown_en drop 
button GPIO_INTR_POSEDGE gpio_set_intr_type drop 
' test button pinchange 
forth 

Informations complémentaires

Pour l'ESP32, toutes les broches du GPIO peuvent être utilisées en interruption, à l'exception de GPIO6 à GPIO11.

N’utilisez pas les broches colorées en orange ou en rouge. Votre programme pourrait avoir un comportement inattendu en utilisant celles-ci.

Code complet disponible ici:

ESP32forth/interruptions.txt


Legal: site web personnel sans commerce / personal site without seling