Utilisation de la minuterie AVR dans un ISR

J'essaie de créer un ISR qui fonctionne pendant 15 secondes lorsqu'un bouton particulier est enfoncé. J'essaie d'utiliser les fonctions AVR de mon Arduino Uno pour commencer à compter lorsqu'il entre dans l'ISR, puis quitte la boucle lorsqu'elle atteint 15 secondes.

J'ai du mal à comprendre où se trouve le compteur que je veux utiliser pour ma boucle while.

Voici mon code jusqu'à présent:

#define button_pin 2
#define duration 15
#define osc_in 0

#include 
#include 

const float convert = 5.0/1023.0;

void setup() {

  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1 = 0;
  attachInterrupt(digitalPinToInterrupt(button_pin), button_interrupt, CHANGE);

  sei();

  pinMode(button_pin, INPUT);
  Serial.begin(9600);
}

void loop() {
    //int channel1 = analogRead(osc_in);

//while (millis() < 10000)
  //Serial.println(millis());
  //Serial.println(channel1 * convert);
  //channel2 = channel1;
}

void button_interrupt(){
  //(# timer counts + 1) = (target time)/(timer resolution)
  //int timer_counts = duration/(pow(6.4, -5));
  //int dur = 234374;
  OCR1A = 234374;
  TCCR1B |= (1 << CS10);

  while (????????){
    int channel1 = analogRead(osc_in);
    Serial.println(channel1 * convert);
  }
}
1
Faire une série dans un ISR est généralement une mauvaise idée. Peut-être envisagez-vous d'effectuer votre échantillonnage en continu et d'utiliser un ISR pour définir un indicateur et déclencher un chronomètre à une prise. Le code de la boucle pourrait vérifier l'indicateur et faire la transmission en série à 9600 bauds selon les besoins.
ajouté l'auteur Dave X, source

1 Réponses

Ne faites pas de retards dans une ISR. Ne faites pas d’impressions en série dans un ISR. Lisez ceci .

Vous devez repenser. L'ISR peut définir un indicateur que vous testez ensuite dans la boucle . Faites le délai dans la boucle .

1
ajouté