interruption

Bonjour,

Savez vous s'il existe un moyen de stopper un programme ?

Par exemple, si no appuie sur un bouton, ca interrompt tout meme les delay ?

tant que le bouton n'est pas appuyé
{faire le programme...}
sinon
{ ne rien faire, long délai, ou boucle infinie avant Reset de la carte, ...}

Bonjour

Un programme ne s'interrompt jamais.
Ce qui peut s'en approcher, c'est de lui faire exécuter une boucle infinie qui ne fait rien.

Techniquement oui tu pourrais mettre une boucle infinie dans une routine d'interruption, mais c'est vraiment crado. A la moindre perturbation électrique l'interruption risque de se déclencher de manière intempestive.

Apprends à utiliser millis() au lieu de delay() et tu n'auras plus ce genre de questionnement induit par les limites de la programmation avec l'instruction delay()

Calvin-duino:
Bonjour,

Savez vous s'il existe un moyen de stopper un programme ?

Par exemple, si no appuie sur un bouton, ca interrompt tout meme les delay ?

delay() bloque tout même les interruptions.

Il reste le bouton reset

Ah je ne savais pas que delay suspendait les interruptions.
Merci

Delay n'est pas utilisable dans une routine d'interruption mais ce n'est pas la même chose.

Bon en même temps je ne mets JAMAIS un delay dans mes programme (le sentiment de gacher du temps cpu me stresse) donc pas étonnant d'avoir quelques lacunes sur le sujet. :slight_smile:

Bonjour,

delay ne bloque pas les interruptions. Heureusement car ça poserait de graves problèmes, en particulier sur millis() et toutes les tansmissions.

Jambe:
delay() bloque tout même les interruptions.

Il reste le bouton reset

Mais non !!! Allons allons- lisez le source de la fonction et vous verrez que c’est juste une fonction toute bête qui compte pendant le temps demandé... donc rien de magique, les interruptions fonctionneront

Quel est l'intérêt d'arrêter un programme ?

Il y a la solution d'un bon coup de marteau sur la carte, mais c'est un arrêt définitif

Un exemple tout con serait celui-ci :
{
if pas appuyé:
allumer led bleue
delay (2000)
eteindre led bleue
delay (2000)

else
allumer led rouge
delay (2000)
eteindre led rouge
delay (2000)
}

Et donc là, si on appuye sur le bouton pendant un delay des leds bleues, la rouge ne s'allumera pas.
On peut boucler avec un tant que bouton pas appuyé mais, j'arrive pas à interrompre le delay.

Est-ce possible ?

En fait tu ve neu pas interrompre ton programme, tu veu interrompre la fonction delay()

Il n'y a pas de solution pour interrompre delay()

La fonction delay() est le pire ennemi du programmeur

Mais on peut gérer le temps sans cette fonction. Le sujet a été débattu des dizaines de fois sur ce forum.
Voir aussi l'exemple Blink without delay

Si vous utilisez delay() alors utilisez une interruption - mais c’est pas clean car vous allez faire de l’attente active dans l’ISR et une interruption n’est (par défaut) pas interruptible (sauf reset) et donc millis() va s’arreter, la gestion du port série etc...

Si c’est ce que vous voulez pour un truc tout bête oui 2 leds clignotent, pourquoi pas, mais comme dit plus haut cette approche est vouée à l’échec sur des systèmes plus gros, donc prenez plutôt l’habitude de penser en machines à état

Mea culpa pour delay()... J’ai arrêté de m’en servir dès que j’ai réussi à faire clignoter une DEL et que j’ai voulu en faire clignoter une seconde dans une tempo différente

Bonjour Calvin-duino

Calvin-duino:
Et donc là, si on appuye sur le bouton pendant un delay des leds bleues, la rouge ne s'allumera pas.
On peut boucler avec un tant que bouton pas appuyé mais, j'arrive pas à interrompre le delay.

Je n'arrive pas à comprendre les fonctionnalités que vous souhaitez.

Quand au cahier des charges fonctionnel :

Combien de leds?
Combien de boutons?
A quoi servent le ou les boutons?
Telle led doit s'allumer (s'éteindre ) dans quelle(s) condition(s)?

Quand à la réalisation :
Souhaitez vous utiliser des interruptions ( au sens informatique)? Pourquoi?

Cordialement,
Bidouilleelec

il veut pouvoir faire "pause" dans son code à tout moment en appuyant sur un bouton et que le code continue là où il était quand il relâche le bouton - voilà le cahier des charges (en tout cas ma compréhension - parce que s'il s'agit s'arrêter le programme n'importe quand, alors on appuie sur reset et le tour et (quasiment) joué)

Je sais que ce n'est pas très recommandé, mais il devrait être possible de déclarer une interruption sur l'appui du bouton, et qui lance une fonction qui garde la main jusqu'à ce que le bouton soit relâché. A la fin de cette fonction, le code reprendrait son exécution là où il l'a arrêtée.

lesept:
Je sais que ce n'est pas très recommandé, mais il devrait être possible de déclarer une interruption sur l'appui du bouton, et qui lance une fonction qui garde la main jusqu'à ce que le bouton soit relâché. A la fin de cette fonction, le code reprendrait son exécution là où il l'a arrêtée.

ça revient à faire while(digitalRead(pinDuBouton) == LOW); // en input pullupdirectement dans l'ISR, pas la peine d'appeler une fonction. c'est pas propre et éventuellement le chien de garde va aboyer et rebooter votre arduino...

Bonjour,

D'après ce que j'ai compris, Calvin-duino veut que quand on appuie sur le bouton le clignotement de la led bleue s'arrête immédiatement et la led rouge clignote.
Ceci se résout facilement avec l'utilisation de millis() et un petit automate d'état.

Peut-on faire plus propre que :

int period = 5000;
unsigned long times = 0;

const int L1 = 10;
const int BP = 2;

void setup() {
   Serial.begin(9600);
   pinMode(L1, OUTPUT);
   pinMode(BP, INPUT);
}

void loop() {
  while (digitalRead(BP)==LOW){
   times = millis();
   while(millis() < times + period){
     digitalWrite(L1, HIGH);
   }
   times = millis();
   while(millis() < times + period){
     digitalWrite(L1, LOW);
   }
   }
}

ça ce n'est pas bien (dans une cinquantaine de jours)

while(millis() < times + period){

il faut toujours soustraire

while(millis() - times < period){

sinon je ne suis pas sûr de ce que votre code doit faire... ça fait quelque chose mais sans doute pas ce que vous voulez...

si c'est vraiment

Calvin-duino veut que quand on appuie sur le bouton le clignotement de la led bleue s'arrête immédiatement et la led rouge clignote.
Ceci se résout facilement avec l'utilisation de millis() et un petit automate d'état

alors un petit automate qui fait cela


résoudra votre besoin

--> c'est typiquement une définition de programme qui se prête bien à la programmation par machine à états (cf mon tuto éventuellement)

Bonsoir J-M-L

il veut pouvoir faire "pause" dans son code à tout moment en appuyant sur un bouton et que le code continue là où il était quand il relâche le bouton - voilà le cahier des charges (en tout cas ma compréhension - parce que s'il s'agit s'arrêter le programme n'importe quand, alors on appuie sur reset et le tour et (quasiment) joué)

Je reste persuadé que c'est au demandeur d'exprimer les fonctionnalités souhaitées.

Et qu'il n'est pas souhaitable de jouer aux devinettes, ni de proposer des solutions de programmation quasi au hasard

sinon je ne suis pas sûr de ce que votre code doit faire... ça fait quelque chose mais sans doute pas ce que vous voulez...

avant que les fonctionnalités soient bien établies.
Ce qui suppose un certain nombre d'échanges cordiaux.

Mais , j'ai peut-être tord.
Il est vrai que le terme "méthode" est dépassé.

Very Best Regards,
bidouilleelec