Led Buildin clignote sans programme

Bonjour à tous

Débutant toujours en Arduino (Nano) et pour longtemps je crois…
J’ai crée un pg pour lire le HX711 +jauge de contrainte, ne maitrisant pas très bien les bibliothèques et comme les datasheet du HX711 sont très simples j’ai fait le pg qui bien sur donne des résultats étranges

Ce programme utilise la pin D2 en entrée pour les données et D3 en sortie pour l’horloge

Résultats étranges! La led (LED BUILIN) sur pin13 clignote à une période de 1400ms, et la pin Horloge n’agit qu’à la même période il semblerait…

Alors je soumets à votre sagacité ce pb de LED BUILDIN qui clignote sana avoir le programme idoine
Serait ce une indication d’erreur dans l’exécution du programme et non une erreur de programmation, du style d’une division par zéro, je n’ai pas trouve d’info sur ce sujet.
Et si c’est ce problème ou est il dans mon programme ?
Merci d’avance pour toutes vos contributions

const int PD_SCK=3;   //pin horloge
const int DOUT=2;       //entree data
long Force0=0;

long Traction(){
  
  noInterrupts();     // evite que les sortie suivantes de DOUT(sortie de données) ne redéclenchent une interruption
   long Force=0;     //variable de stockage des data
  
    for(int i=1;i<=24;i++){   //data sur 24 bit !
  
      digitalWrite(PD_SCK,HIGH);          //horloge à 1 pour extraire les bit data de DOUT
       Force=Force<<1;                            //decalage gauche de la valeur precedente
          if(digitalRead(DOUT)==HIGH){    // ajout de 1 a Force si DOUT=1
        Force=Force+1;
          }
      digitalWrite(PD_SCK,LOW);           //horloge à 0  fin cycle de lecture d'un bit
   
    }
    
       digitalWrite(PD_SCK,HIGH);         // 25 eme clock horloge pour signifie au HX711 qu'on souhaite un gain de 128 sur les entrees A
       digitalWrite(PD_SCK,LOW);        //horloge à 0       
      
interrupts();                                          //cycle de lecture termine, on retable les interruption pour les data suivantes

    return Force;

}

void setup() {
noInterrupts();                             //pour eviter de perturbe l'init de HX711

pinMode(PD_SCK,OUTPUT);  
pinMode(DOUT,INPUT);           

digitalWrite(PD_SCK,HIGH);      //init HX711
digitalWrite(PD_SCK,LOW);       //init HX711

interrupts();                                   // retabli les interruptions

attachInterrupt(digitalPinToInterrupt(DOUT),Traction(),FALLING);  // le programme "Traction" se declenche sur front descendant de DOUT (sortie data du HX711

}



void loop() {
 // rien je regarde le resultat à l'oscillo
 //pas de sortie Serial pour ne pas compliquer les choses !!!  
}

1400ms ? et quelle est la durée pendant laquelle elle est à 1 ?

Le téléchargement d'est il bien passé?

Bonjour,

Il y a un problème ici:

attachInterrupt(digitalPinToInterrupt(DOUT),Traction(),FALLING);  // le programme "Traction" se declenche sur front descendant de DOUT (sortie data du HX711

Ce n’est pas le résultat de la fonction qu’il faut passer en paramètre, mais son adresse

attachInterrupt(digitalPinToInterrupt(DOUT),Traction,FALLING);  // le programme "Traction" se declenche sur front descendant de DOUT (sortie data du HX711

De plus une routine d’interruption ne peut pas retourner de valeur.

Super merci pour vos réponses

  • la Led_buildin clignote à une période de1400ms dont 100ms allume le reste éteinte
  • le téléversement s’est déroule normalement et le programme tourne pas rond!
  • Dans l’interruption en effet j’avais bien remarque qu’il ne fallait pas mettre de paramètres ,ma fonction en effet renvoie une valeur (que je n’exploitais pas pour l’instant)

Donc j’ai supprimé “return Force” et déclare Force en global volatile

RESULTAT: Plus de clignotement de la LED BUILD IN donc celle ci sert à signaler une erreur !!!

Par contre l’interruption n’est pas encore ce que j’attends.
Je ne comprends pas la réponse “Ce n’est pas le résultat de la fonction qu’il faut passer en paramètre, mais son adresse”
Que faire alors ?

Merci beaucoup

const int PD_SCK=3;   //pin horloge
const int DOUT=2;       //entree data
volatile long Force=0;

long Traction(){
  
  noInterrupts();     // evite que les sortie suivantes de DOUT(sortie de données) ne redéclenchent une interruption
     Force=0;     //variable de stockage des data

    for(int i=1;i<=24;i++){                         //data sur 24 bit !
  
      digitalWrite(PD_SCK,HIGH);          //horloge à 1 pour extraire les bit data de DOUT
       Force=Force<<1;                         //decalage gauche de la valeur precedente
 
          if(digitalRead(DOUT)==HIGH){    // ajout de 1 a Force si DOUT=1
        Force=Force+1;
          }
      digitalWrite(PD_SCK,LOW);           //horloge à 0  fin cycle de lecture d'un bit
   
    }
    
       digitalWrite(PD_SCK,HIGH);         // 25 eme clock horloge pour signifie au HX711 qu'on souhaite un gain de 128 sur les entrees A
       digitalWrite(PD_SCK,LOW);        //horloge à 0       
      
interrupts();                                          //cycle de lecture termine, on retable les interruption pour les data suivantes

//    return Force;

}

void setup() {
noInterrupts();                             //pour eviter de perturbe l'init de HX711

pinMode(PD_SCK,OUTPUT);  
pinMode(DOUT,INPUT);           

digitalWrite(PD_SCK,HIGH);      //init HX711
delay(5);
digitalWrite(PD_SCK,LOW);       //init HX711
delay(5);
interrupts();                                   // retabli les interruptions

attachInterrupt(digitalPinToInterrupt(DOUT),Traction(),FALLING);  // le programme "Traction" se declenche sur front descendant de DOUT (sortie data du HX711

}



void loop() {
 // rien je regarde le resultat à l'oscillo
 //pas de sortie Serial pour ne pas compliquer les choses !!!  
}

Une routine d'interruption ne retourne pas de valeur.

attachInterrupt(digitalPinToInterrupt(DOUT),Traction,FALLING);  // le programme "Traction" se declenche sur front descendant de DOUT (sortie data du HX711

Attacher une valeur retournée de fonction au lieu de son adresse pourrait expliquer que l'interruption déclenche un saut à une adresse indéterminée, suivi d'un reboot.

ATOS_VQ:
RESULTAT: Plus de clignotement de la LED BUILD IN donc celle ci sert à signaler une erreur !!!

Non, c'est un effet de bord de ton erreur de codage.

ATOS_VQ:
Par contre l'interruption n'est pas encore ce que j'attends.
Je ne comprends pas la réponse "Ce n'est pas le résultat de la fonction qu'il faut passer en paramètre, mais son adresse"
Que faire alors ?

La réponse est juste la ligne en-dessous il ne faut pas mettre de parenthèse à Traction dans attachInterrupt()

Traction() = appel à la fonction
Traction = pointeur vers la fonction

attachInterrupt attend comme 2nd paramètre un pointeur vers une fonction qui va assurer la gestion de l'interruption

Comme j'ai écrit c'est l'adresse de la routine qu'il faut passer. Il faut donc enlever les () de Traction

attachInterrupt(digitalPinToInterrupt(DOUT),Traction,FALLING);  // le programme "Traction" se declenche sur front descendant de DOUT (sortie data du HX711

De plus traction devrait être défini en void
void Traction()

…suite une nette amélioration grâce à

attachInterrupt(digitalPinToInterrupt(DOUT),Traction,FALLING);

et non Traction()

cependant l’interruption s’effectue 2 fois d’affilées , comme si le flag générant l’interruption n’était pas effacé…

Dernière tentative avec “detachInterrupt” dans le programme d’interruption(ISR) et retablissement dans la boucle loop() et la c’est un peu mieux mais pas encore correct !!!
A l’oscillo on voit nettement que de temps en temps l’interruption s’effectue 2 fois de suite, DOUT etant haut le resultat est toujours la valeur max d’un nbr en 24 bit, bien visualisé sur moniteur avec le pg suivant légèrement modifié (dans le loop()

La fonction long Traction a été remplacé par void Traction sans changement sur le résultat

const int PD_SCK=3;   //pin horloge
const int DOUT=2;       //entree data
volatile long Force=0;

void Traction(){
  detachInterrupt(digitalPinToInterrupt(DOUT));
 ; noInterrupts();     // evite que les sortie suivantes de DOUT(sortie de données) ne redéclenchent une interruption
     Force=0;     //variable de stockage des data

    for(int i=1;i<=24;i++){                         //data sur 24 bit !
  
      digitalWrite(PD_SCK,HIGH);          //horloge à 1 pour extraire les bit data de DOUT
       Force=Force<<1;                         //decalage gauche de la valeur precedente
 
          if(digitalRead(DOUT)==HIGH){    // ajout de 1 a Force si DOUT=1
        Force=Force+1;
          }
      digitalWrite(PD_SCK,LOW);           //horloge à 0  fin cycle de lecture d'un bit
   
    }
    
       digitalWrite(PD_SCK,HIGH);         // 25 eme clock horloge pour signifie au HX711 qu'on souhaite un gain de 128 sur les entrees A
       digitalWrite(PD_SCK,LOW);        //horloge à 0       
      


//    return Force;

}

void setup() {
noInterrupts();                             //pour eviter de perturbe l'init de HX711

pinMode(PD_SCK,OUTPUT);  
pinMode(DOUT,INPUT);           

digitalWrite(PD_SCK,HIGH);      //init HX711
delay(5);
digitalWrite(PD_SCK,LOW);       //init HX711
delay(5);

attachInterrupt(digitalPinToInterrupt(DOUT),Traction,FALLING);  // le programme "Traction" se declenche sur front descendant de DOUT (sortie data du HX711
  interrupts();  

  Serial.begin(9600);
}



void loop() {
   Serial.println(Force);
  attachInterrupt(digitalPinToInterrupt(DOUT),Traction,FALLING);      //cycle de lecture termine, on retable les interruption pour les data suivantes
}

Tu réautorises interruptions avant la fin de l’interruption, c’est peut être ça le problème.

Dans l’interruption il ne faut pas de noInterrupts(); interrupts();. C’est fait automatiquement.
Le processeur masque les interruptions en entrant et le framework réautorise les interruptions en sortie après avoir acquité l’interruption si nécessaire.

Merci pour ta réponse il semble que ce ne soit pas encore ca
Toujours 2 interruptions l’une derrière l’autre alors que la cause est absente (pas de front descendant de DOUT) visualisé sur oscillo. Le premier traitement de l’interruption semble correct mais le deuxième est erroné tous les bit à 1
Dommage que je ne puisse pas envoyer de copie d’écran

Merci encore!!

const int PD_SCK=3;   //pin horloge
const int DOUT=2;       //entree data
volatile long Force=0;

void Traction(){
//  detachInterrupt(digitalPinToInterrupt(DOUT));
// noInterrupts();     // evite que les sortie suivantes de DOUT(sortie de données) ne redéclenchent une interruption
 
     Force=0;     //variable de stockage des data

    for(int i=1;i<=24;i++){                         //data sur 24 bit !
  
      digitalWrite(PD_SCK,HIGH);          //horloge à 1 pour extraire les bit data de DOUT
       Force=Force<<1;                         //decalage gauche de la valeur precedente
 
          if(digitalRead(DOUT)==HIGH){    // ajout de 1 a Force si DOUT=1
        Force=Force+1;
          }
      digitalWrite(PD_SCK,LOW);           //horloge à 0  fin cycle de lecture d'un bit
   
    }
    
       digitalWrite(PD_SCK,HIGH);         // 25 eme clock horloge pour signifie au HX711 qu'on souhaite un gain de 128 sur les entrees A
       digitalWrite(PD_SCK,LOW);        //horloge à 0       
      
}

void setup() {
noInterrupts();                             //pour eviter de perturbe l'init de HX711

pinMode(PD_SCK,OUTPUT);  
pinMode(DOUT,INPUT);           

digitalWrite(PD_SCK,HIGH);      //init HX711
delay(5);
digitalWrite(PD_SCK,LOW);       //init HX711
delay(5);

attachInterrupt(digitalPinToInterrupt(DOUT),Traction,FALLING);  // le programme "Traction" se declenche sur front descendant de DOUT (sortie data du HX711
  interrupts();  

  Serial.begin(9600);
}

void loop() {
   Serial.println(Force);
  //attachInterrupt(digitalPinToInterrupt(DOUT),Traction,FALLING);      //cycle de lecture termine, on retable les interruption pour les data suivantes
}