Go Down

Topic: ESP32 INTERRUPTION (Read 90 times) previous topic - next topic

el_gringo

Bonjour j'aimerais créer un petit programme qui d'un côté fait clignoter une led pendant 3 secondes et en même temps envoyer un signal rythmé toutes les 58 et 116 millièmes de seconde BitUn et BitZero respectivement sur les GPIO 2 et 23.
Merci pour votre aide

j'ai essayé d'adapter un programme sur internet. Mais je ne trouve pas la solution.

Code: [Select]

volatile int interruptCounter;
int totalInterruptCounter;

 int LED_BUILTIN = 27;
 
hw_timer_t * timer = NULL;
portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED;
 
void IRAM_ATTR onTimer() {
 portENTER_CRITICAL_ISR(&timerMux);
  interruptCounter++;
  portEXIT_CRITICAL_ISR(&timerMux);

}
 
void setup() {
 
  Serial.begin(115200);
 
  timer = timerBegin(0, 4640, true); // 17240 Hz pour avoir 58 micros s par interruption
  timerAttachInterrupt(timer, &onTimer, true);
  timerAlarmWrite(timer, 1, true); // toutes les 1 x 58 micro secondes
  timerAlarmEnable(timer);

  pinMode(2,OUTPUT);
  pinMode(23,OUTPUT);
  pinMode(LED_BUILTIN, OUTPUT);
}




 
void loop() {

   
    if (interruptCounter > 0) {
 
    portENTER_CRITICAL(&timerMux);
    interruptCounter--;
    portEXIT_CRITICAL(&timerMux);
 
    totalInterruptCounter++;
 
    BitUn();
    BitZero();
 
  }
  
  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(3000);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(3000);  
  
}

void BitZero() {
    digitalWrite(2,LOW);
    digitalWrite(23,HIGH);
    delayMicroseconds(116);
    digitalWrite(2,HIGH);
    digitalWrite(23,LOW);
    delayMicroseconds(116);
}
void BitUn() {
    digitalWrite(2,LOW);
    digitalWrite(23,HIGH);
    delayMicroseconds(58);
    digitalWrite(2,HIGH);
    digitalWrite(23,LOW);
    delayMicroseconds(58);
}


lesept

#1
Oct 11, 2020, 10:24 am Last Edit: Oct 11, 2020, 03:15 pm by lesept
Tu parles de millisecondes dans ton message mais tu utilises delayMicroseconds dans ton code. Lequel est le bon ?

Pour faire ça, il ne faut pas organiser ton code comme tu le fais. Il faut surveiller le temps avec la fonction millis () ou micros () et basculer tes IO lorsque tes délais sont dépassés.
Il existe de bons tutos pour ça, certains sont listés ici.

Sinon tu peux utiliser des bibliothèques spécialisées comme celle de Bricoleau
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

el_gringo

Bonjour, je parle en microsecondes.
Je ne peux pas accéder aux liens que vous avez gentiment mis. merci bcp

lesept

Liens corrigés. Ré essaye
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

Go Up