digitalRead et interruption

Bonsoir,

juste pour confirmation, digitalRead() ne fonctionne pas dans une interruption. C'est bien ça ?

Donc en mode CHANGE, il faut utiliser une variable pour gérer l'état de l'entrée et inverser cette variable à chaque interruption ?

Merci de vos retours

Ce n’est pas ça. Ça fonctionne très bien (juste un peu lent par rapport à lire le port)

J'ai un bouton poussoir, en série avec une résistance de pullup et en dériv avec une capa pour faire un anti-rebond sommaire. Point milieu sur D3.

J'ai simplifié au max le code pour tester :


int bouton = 1; // interruption 1, pin 3

void traite_int1()
{
    Serial.println(digitalRead(bouton));
}

void setup()
{
  Serial.begin(115200);
  attachInterrupt(bouton, traite_int1, CHANGE);
  Serial.println("On démarre !");
}

void loop()
{

}

La console série n'affiche que des 1, aussi bien quand j'enfonce le bouton que quand je le relâche :frowning:

Si j'enlève le condensateur de l'anti-rebond j'ai parfois des 0 qui apparaissent, mais pas toujours et apparemment quand il y a rebond du bouton (plusieurs lignes alors que je n'ai manipulé qu'une fois le bouton)

Que nenni, pas sommaire du tout. C'est le meilleur anti rebond, bien plus efficace que la version logicielle qui ne fait que cacher la poussière sous le tapis.

Si tu utilises un micro avr 8 bits (cartes UNO, nano, mega, leonardo, mni; micro) il existe une version beaucoup plus rapide de digitalRead.
Il faut télécharger le fichier digitaReadFast.h
Avec cette version il ne faut que 2 cycles horloge pour lire une entrée alors que le digitalRead "classique" en prend plus de 60.

Il semble exister plusieurs versions, certaines couvrent maintenant les micros ARM Samd21.

Bouton n’est pas le numéro de pin….c’est le numéro de l’interruption

const byte boutonPin = 3; // interruption 1, pin 3

void traite_int1()
{
    Serial.println(digitalRead(boutonPin)); // pas génial d’imprimer dans une ISR mais à des fins de démo OK
}

void setup()
{
  pinMode(boutonPin, INPUT); // en supposant le pullup externe correct
  Serial.begin(115200);
  attachInterrupt(digitalPinToInterrupt(boutonPin), traite_int1, CHANGE);
  Serial.println("On démarre !");
}

void loop() {}

(Tapé ici non testé)

Merci à tous les deux, effectivement ça marche mieux quand on ne confond pas pin et numéro d'interruption :- :dizzy_face:

Merci aussi pour l'indication de cette bib. digitalWriteFast.h

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.