Lecture d un octet sous interruption esp32

Bonjour, dans le programme ci dessous j essaie dans l interruption de lire les bits d un octet a une vitesse de 1 par seconde. Avec une fonction while ou for je n'y arrive pas. Quelle est la solution pour que chaque bit s affiche toutes les secondes?
un grand merci



hw_timer_t * timer = NULL; // Declare a timer for interruption

#define OCTET_DATA 3 // nombre d octets dans une trame
int octetIndex=0; // octet actuel qui est recu
byte octetValeur[OCTET_DATA]; // Tableau stockant les octets
#define PREAMBLE 0XFFFF
#define OCTET_UNITE 0xFF
#define OCTET_UN 0xFF
#define OCTET_DEUX 0xFF
#define OCTET_TROIS 0xFF
#define OCTET_NULL 0
#define START 0
#define STOP 1

#define DCC_OUT1 2   // Sortie du signal DCC

#define PACK_IDLE 0
#define PACK_HEADER 1
#define PACK_START 2
#define PACK_BYTE 3
#define PACK_STOP 4

#define DCC_BIT_HIGH 0 // Les quatre états de l'automate bit
#define DCC_BIT_HIGH0 1
#define DCC_BIT_LOW 2
#define DCC_BIT_LOW0 3

byte DccCommande;
byte DccSubByte;

void IRAM_ATTR onTimer() { // Interrupt function
int i = 0;
while ( i <16) {
  Serial.println(bitRead(PREAMBLE,i++));
}

}



void LireOctet(byte PACK) {

switch(PACK) {
  case PACK_BYTE :
        for (int ii=0;ii<8;ii++) {
          Serial.print(bitRead(OCTET_UN,ii));
 
        }
        break;
        
   case PACK_HEADER :
    for (int ii=0;ii<16;ii++) {
          Serial.print(bitRead(PREAMBLE,ii));

        }
        break;
}
}


void setup() {
Serial.begin(115200);
pinMode(DCC_OUT1,OUTPUT);
timer = timerBegin (0, 80, true); // Initialization
timerAttachInterrupt (timer, &onTimer, true); // Call the interrupt function
timerAlarmWrite (timer,1000000, true); // Timerbegin parameter is 80MHz, here is 1000000 Meaning 1 second
timerAlarmEnable (timer); // Timer enables

// TimerDetAnterRupt (timer); // Close the timer
}


void loop() {


         if (Serial.available())
         {
             for (octetIndex=0;octetIndex<3;octetIndex++) 
                       {
                       octetValeur[octetIndex]=Serial.parseInt(); // recupere la valeur numerique
                       }
         }
}
    

Pour faire un truc toutes les secondes, pas besoin d'utiliser les timer ou les interruptions surtout si le reste du code ne fait rien de compliqué.... faites cela dans la loop.

(Ne faites pas un print dans une interruption... et il vaudrait mieux typer (const ou constexpr) les données plutôt que de laisser des define. )

Quel est le vrai besoin ?

Bonsoir

l'interruption est içi utilisée à contre emploi, on ne s'y attarde pas, on lève ou baisse un drapeau et on sort immédiatement.

pour une lecture d'octet au rythme de 1 par seconde voir du côté de millis()

Bonjour, je souhaite envoyer des signaux toutes les 58 ou 116 microsecondes.
Je souhaite avoir l equivalent de ce mouvement par exemple mais avec les interruptions

digitalWrite(2,HIGH);
delaymicroseconds(58);
digitalWrite(2,LOW);
delaymicroseconds(58);

digitalWrite(2,HIGH);
delaymicroseconds(116);
digitalWrite(2,LOW);
delaymicroseconds(116);

ça n'a rien à voir ni avec le premier code ni avec les timings en seconde...

comme 116 c'est le double de 58, faites une interruption toutes les 58µs et ayez un peu d'intelligence dans l'ISR qui sait ce qu'il faut faire

  • interruption #1 : digitalWrite(2, HIGH); // Temps = 0µs
  • interruption #2 : digitalWrite(2, LOW); // Temps = 58µs
  • interruption #3 : digitalWrite(2, HIGH); // Temps = 116µs
  • interruption #4 : rien // Temps = 174µs
  • interruption #5 : digitalWrite(2, LOW); // Temps = 232µs
  • interruption #6 : rien // Temps = 290µs

et on reboucle

ça va mettre quand même pas mal de pression sur votre micro-contrôleur

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.