Problème avec les interruptions

Bonjour à tous,
J’ai réalisé un petit programme qui mesure et affiche sur LCD des températures à partir de sondes DS18B20.
Il fonctionne bien.
J’ai voulu y rajouter une mesure de débit à partir d’un capteur de débit à impulsions à rapport cyclique 50/50.
Pour cela j’ai récupéré un programme sur le net. Le test réalisé à part de ce programme isolé était OK, ensuite je l’ai incorporé dans mon sketch précédent et là cela pose problème !
La mesure de débit se fait en comptant sur une seconde le nombre d’impulsions entre les instructions sei() et cli().
Or dès que sei() est lancé, mon programme se bloque, alors que si je mets des // devant les instructions d’interruption tout va bien mais je n’ai pas de mesure de débit !
Pouvez-vous m’aider ?
D’avance merci.
Ci-joint mon sketch.

GestionMarmiteChaudiere_T_Q.ino (5.22 KB)

FidelCastor: Or dès que sei() est lancé, mon programme se bloque, alors que si je mets des // devant les instructions d'interruption tout va bien mais je n'ai pas de mesure de débit ! Pouvez-vous m'aider ? D'avance merci. Ci-joint mon sketch.

Bonjour le bloquage se traduit comment en situation ? attention avec le onewire sur arduino (DS18B20) la librairie utilise beaucoup de delai fixés (le timing OW est contraignant )

Je comprends tout simplement pas pourquoi tu t'embêtes avec cli() et sei(), ils sont inutiles :

NbTopsFan=0;
delay(1000);
Calc = (NbTopsFan * 60 / 7.5);

Tes interruptions peuvent se produire dans le reste du programme ça ne devrait pas poser de problème. Et si tu tiens il vaut mieux utiliser attachInterrupt() et detachInterrupt() :

NbTopsFan=0;
attachInterrupt(0, rpm, RISING);
delay(1000);
detachInterrupt(0) ;
Calc = (NbTopsFan * 60 / 7.5);

Salut, en plus de tout ce qui a déjà été dit, tu t'es aussi mélangé les pinceaux avec les broches :

#define ONE_WIRE_BUS 2 // sondes DS18B20 sur pin 2 sur la Mega 2560 Arduino
[...]
int hallsensor = 3;    //capteur de débit sur pin 2 sur la Mega 2560 Arduino
[...]
attachInterrupt(0, rpm, RISING); //et attache l'interruption

L'interruption qui correspond à la broche 3 est la numéro 1, pas 0. De plus le commentaire de la deuxième ligne ne correspond pas au code : ce n'est pas ça qui fait planter le programme, mais c'est une mauvaise idée et c'est toujours une source d'ennuis facilement évitable.

De plus, les interruptions sont activées par défaut par le bootloader, donc ton premier sei() ne sert à rien ; comme en plus tu t'es planté dans les broches, ça veux dire due la fonction rpm() est appelée — dès la fin du setup — à chaque fois que la librairie OneWire essaie de communiquer avec les sondes... m'étonnes pas trop que se soit le bordel :grin:

Pour corriger tout ça la solution de B@tto est certainement la plus simple, en replaçant 0 par 1.

Un grand merci à vous tous !

D'abord, je suis désolé, mais à force de "tourner en rond" je n'ai pas fourni le tout dernier sketch, d'où certaines erreurs comme le PIN2 en doublon dans les commentaires :~ Vive le copier coller :)

J'ai remplacé sei, cli par AttachInterrupt et je n'ai plus de blocage :) Mais alors B@tto, peux-tu m'expliquer pourquoi l'un fonctionne et pas l'autre, alors que je n'ai fait qu'un copier coller d'un programme qui fonctionnait bien tout seul avec sei et cli ?

Pour répondre à Artouste, le blocage se traduisait par l'affichage des deux premières lignes (températures) et ensuite plus rien sur les deux lignes suivantes et surtout pas de rafraichissement des valeurs.