Créer des interruptions

Bonjour,

Mon programme utilise une fourche-optique pour créer une interruption' à chaque passage de billes avec l'instruction 'attachInterrupt'.
L’interruption renvoie à une routine 'void ' qui permet d'incrémenter un compteur et aussi de fixer une valeur de 'times()'.
Si le temps entre 2 interruptions dépasse une certaine valeur, je veux arrêter le programme.
Les variables créées pendant l'interruption de peuvent pas être utilisées dans le programme général, et l'instruction 'break' ne semble pas marcher.
Merci si vous pouvez m’aider.

Cordialement.

Il ne devrait pas y avoir de difficulté particulière à faire ce que tu veux.

Poste ton code STP, entre une balise [code] et une balise [/code].

Une routine d'interruption saine doit se limiter à mettre à jour quelques variables globales.
Celles-ci doivent être déclarées en volatile.

Leur contenu est parfaitement accessible depuis les autres parties du programme.

salut ... pas de code, pas de chocolat ...

déclares les variables utilisées dans l'interruption en globales (avec la mention volatile avant le type de la variable)

Punaise, j'avais pas vu "biologiste retraité, né en 1922"
Ca force le respect.

Si cela peut t'aider, voici un exemple de code dont tu peux t'inspirer :

...

//Variables globales liées à la routine d'interruption
volatile int compteur_billes = 0;
volatile bool passage_bille = false;

void routine_interruption()
{
  compteur_billes++;
  passage_bille = true;
}

...

void loop()
{
  const unsigned long delai_arret = 30000UL; //30 secondes
  const unsigned long delai_affichage = 5000UL; //5 secondes

  static unsigned long millis_dernier_passage = 0;
  static unsigned long millis_dernier_affichage = 0;

  ...

  //Traitement du flag positionné par l'interruption
  //Noter que ce traitement peut faire suite à plusieurs interruptions rapprochées.
  //La mise à jour de compteur_billes ne peut donc pas se faire à cet endroit.
  if (passage_bille)
  {
    passage_bille = false;
    millis_dernier_passage = millis();
    ...
  }

  //Affichage du compteur de billes à intervalles réguliers
  unsigned long delai_dernier_affichage = millis() - millis_dernier_affichage;
  if (delai_dernier_affichage > delai_affichage)
  {
    Serial.print("Nombre de billes = ");
    Serial.println(compteur_billes);
    millis_dernier_affichage = millis();
  }

  //Arrêt du programme après une certaine période d'inactivité
  unsigned long delai_dernier_passage = millis() - millis_dernier_passage;
  if (delai_dernier_passage > delai_arret)
  {
    Serial.println("C'est fini !");
    while (1); // Boucle infinie car arrêter un programme est impossible
  }
}

Merci bricoleau pour ton exemple .... et pour le respect !

Le logiciel tourne en permanence pour guetter une interruption.
Mon programme ne peut pas surveiller le passage éventuelle d'un bille, car il fait aussi autre chose entre-temps, je dois donc utiliser 'attachInterrupt' qui va intervenir à des moments différents. J'a donc rajouter cette instruction à ton exemple et je vais essayer d’introduire tout ça dans mon programme, trop long pour l'envoyer.
Je te dirai ce que cela donne.
Bien cordialement.

A ta disposition pour toute aide.

Si le code est trop gros pour passer entre deux balises, tu peux toujours l'attacher en pièce jointe.

Je n'arrive pas ressortir la valeur d'une variable mise à jour dans l'interruption et à sortir de cette interruption pour poursuivre le programme. Est-ce possible ?
Cette variable est un temps de départ créé par l’interruption et comparé ensuite à un temps courant au cours du programme.

Je suis désolé, mais sans ton code je ne peux pas t'aider, d'autant que ce que tu veux faire a l'air de ressembler à l'exemple que j'ai déjà posté.

flameln:
Je n'arrive pas ressortir la valeur d'une variable mise à jour dans l'interruption

Je ne comprends pas cette phrase.
Qu'entends-tu par "ressortir la valeur d'une variable" ?

flameln:
..et à sortir de cette interruption pour poursuivre le programme. Est-ce possible ?

Non.
L'interruption déclenche l'exécution d'une fonction.
Lorsque la fonction est terminée, le programme principal poursuit son cours là où il s'était suspendu.

flameln:
Bonjour,

Mon programme utilise une fourche-optique pour créer une interruption' à chaque passage de billes avec l'instruction 'attachInterrupt'.
L’interruption renvoie à une routine 'void ' qui permet d'incrémenter un compteur et aussi de fixer une valeur de 'times()'.
Si le temps entre 2 interruptions dépasse une certaine valeur, je veux arrêter le programme.
Les variables créées pendant l'interruption de peuvent pas être utilisées dans le programme général, et l'instruction 'break' ne semble pas marcher.
Merci si vous pouvez m’aider.

Cordialement.

Bonjour
Si bien sur que l'on peut récupérer des infos en sortant d'une interruption
ci-dessous un petit code documenté
comptant le nombre de passage par l'interruption et informant d'un délai trop long entre 2 interruptions
Anecdotiquement , vous etes le plus "ancien" arduiniste que je connaisse , le précédent n'etant autre que mon cher Papa, mais vous êtes son ainé de 12 ans.

 pinMode(encoderPinA, INPUT_PULLUP);

  attachInterrupt(0, doEncoderA, FALLING); // // encoder pin on interrupt 0 (pin 2)

  Serial.begin(57600);
  Tparc = millis();
  Tparcold = Tparc;
}

void loop() {

  if (Sint == true) {
    Serial.print("passage ");
    Serial.println(Iparc); // affichage nb de passage par l'interruption

    {
      if (Tparc - Tparcold > delmax) { // condition delai depassé
        Serial.println("delai depasse ");

      }
      Tparcold = Tparc; // on transfere la valeur millis() d'entrée interrupt dans valeur ancienne
    }

    Sint = false; // remise a 0 du "drapeau" de passage par l'interruprion

  }

}
// Interrupt on A FALLING
void doEncoderA() {

  Tparc = millis(); // on charge la variable millis() actuelle

  Iparc ++; // nb de passages par l'interruption
  Sint = true; // on est passé par l'interruption
}