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.
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.
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.
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.
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
}