Gianamp
February 6, 2024, 10:55am
1
Bonjour,
Etant nouveau à utiliser Arduino, je dois compter des impulsions d'une roue dentée qui tourne très rapidement.
Seule la fonction Interrupt peut relever les fronts et avoir un comptage précis.
J'ai du utilisé EnableInterrupt parce que les pin D2 et D3 de mon arduino Nano sont déjà occupés.
Le programme fonctionne correctement lorsque tout va bien!!!!
Malheureusement, de temps à autre, la CPU se bloque ou bien le programme repart comme si j'avais actionné le bouton poussoir Reset du microprocesseur.
que faire pour éviter cette anomalie?
Si cette fonction de comptage n'est pas la seule fonction effectuée par ton micro as tu protégé le temps durant lequel le micro compte les impulsions des interruptions extérieures?
terwal
February 6, 2024, 11:26am
3
Non pas forcément, si tu passe trop de temps dans ta fonction, tu peux rater des fronts.
Sans le code il est impossible de te donner une réponse ciblée.
Si tu as des reset intempestifs, c'est surement que ton code fait quelque chose de mal.
Ci-joint le programme...
#include <EnableInterrupt.h>
#include <LiquidCrystal_I2C.h>
const int ledGreenOK = 2;
const int ledRedFail = 3;
const int reed = 4;
const int switch_start = 5;
const int stop_test = 6;
const int pump_on = 9;
const int cover_closure = 10;
const int buzzer = 12;
bool marcia = false;
bool arresto = false;
unsigned long Time = 0;
unsigned long Temps = 0;
unsigned long Tempo_test = 0;
LiquidCrystal_I2C lcd(0x27, 16, 2);
float calcul = 0;
int conta_ctrl_buoni = 0;
int numero_tentativi = 1;
volatile int valeur_int = 0;
volatile float valeur_float = 0.0;
int valeur_impulsi_int = 0;
float valeur_impulsi_float = 0.0;
int memoire_valeur_int = 0;
float memoire_valeur_float = 0.0;
bool valori = false;
bool inizio_test = false;
bool buono = false;
bool scarto = false;
bool via_rilievo = false;
bool fine_test = false;
bool riprova = false;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600); //connection au port série
Serial.println("Ctrl impulsi dei Flussometri per LS100 WashWash");
lcd.begin();
lcd.backlight();
lcd.home();
lcd.clear();
pinMode(ledGreenOK, OUTPUT);
pinMode(ledRedFail, OUTPUT);
pinMode(pump_on, OUTPUT);
pinMode(buzzer, OUTPUT);
pinMode(switch_start, INPUT);
pinMode(stop_test, INPUT);
pinMode(reed, INPUT);
pinMode(cover_closure, INPUT);
enableInterrupt(4, frontdescendant, FALLING);
}
void loop() {
// put your main code here, to run repeatedly:
if (digitalRead(switch_start) == LOW)
{
digitalWrite(pump_on, HIGH); //MARCIA POMPA
marcia = true;
arresto = false;
enableInterrupt(4, frontdescendant, FALLING);
delay(4000);
via_rilievo = false;
fine_test = false;
valeur_int = 0;
valeur_float = 0.0;
}
//***********************************
//***** Comptage impulsions *****
//***********************************
if ((marcia == true) && (via_rilievo == false) && (fine_test == false))
{
Temps = millis();
valeur_int = 0;
valeur_float = 0.0;
via_rilievo = true;
}
//****************************
//***** Analyse Controle *****
//****************************
if (via_rilievo == true)
{
Tempo_test = millis() - Temps;
if ((Tempo_test >= 5000) && (fine_test == false))
{
digitalWrite(pump_on, LOW); //ARRESTO POMPA
analisi();
disableInterrupt(4);
}
}
//FINdePROGRAMME:
}
//*******************************************
//***** SUBROUTINE Gestion Analyse Test *****
//*******************************************
void analisi()
{
valori = true;
memoire_valeur_int = valeur_int;
memoire_valeur_float = valeur_float;
if ((memoire_valeur_int >= 685) && (memoire_valeur_int <= 745)) //***** +/- 30 impulsi *****685 <--> 745
{
conta_ctrl_buoni++;
//Serial.print("esiti_positivi: ");
//Serial.println(esiti_positivi);
digitalWrite(pump_on, LOW);
via_rilievo = false;
fine_test = true;
}
else
{
digitalWrite(pump_on, LOW);
fine_test = true;
via_rilievo = false;
scarto = true;
valori = true;
Serial.println("SCARTO");
}
Serial.print("N. impulsi Totali.....: ");
Serial.println(memoire_valeur_int);
Serial.print("Tempo_test Totale.....: ");
Serial.println(Tempo_test);
Serial.print("Num. tentativi........: ");
Serial.println(conta_ctrl_buoni);
if ((conta_ctrl_buoni >= numero_tentativi) && (scarto == false))
{
fine_test = true;
via_rilievo = false;
buono = true;
valori = true;
Serial.println("BUONO");
}
if ((conta_ctrl_buoni < numero_tentativi) && (scarto == false))
{
fine_test = true;
via_rilievo = false;
riprova = true;
Serial.println("RIPROVA");
}
}
//*******************************************************
//***** SUBROUTINE Gestion Incrementation sur Interrupt *
//*******************************************************
void frontdescendant()
{
valeur_int++;
valeur_float++;
}
Par rapport au programme original, j'ai inséré l'instruction:
"disableInterrupt(4);"
à la fin du test et, ensuite, j'ai relancer en début d'un nouveau contrôle, l'instruction:
"enableInterrupt(4, frontdescendant, FALLING);
Il semblerait que, jusqu'à présent, je ne rencontre plus de problèmes.
Pur hasard?
Gianamp
February 7, 2024, 10:34am
7
Bonjour à tous,
J'ai trouvé la cause de mon problème.
Mon code est correct!
Des phénomènes transitoires en électronique font en sorte de créer un problème électrique à la carte Arduino.
Ceci est dû à une pompe hydraulique, pilotée par la sortie D9.
Lorsqu'elle est en action, elle gérère des perturbations!!!!
C'est à isoler!!!!
Merci à tous pour vos interventions!!!!
Bonne journée!
system
Closed
August 5, 2024, 10:34am
8
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.