Usando o AVR Timer dentro de um ISR

Eu estou tentando criar um ISR que opera por 15 segundos quando um determinado botão é pressionado. Eu estou tentando usar as funções do AVR no meu Arduino Uno para começar a contar quando ele entra no ISR, em seguida, encerre o loop quando ele atingir 15 segundos.

Eu estou tendo dificuldade em raciocinar onde o contador está realmente armazenado que eu quero usar para o meu loop while.

Aqui esta o meu codigo ate agora:

#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
Fazer serial dentro de um ISR é tipicamente uma má ideia. Talvez considere fazer sua amostragem continuamente e usar um ISR para definir um sinalizador e iniciar um temporizador de 1 disparo. O código do loop pode verificar o sinalizador e fazer o relatório serial de 9600 baud conforme necessário.
adicionado o autor Dave X, fonte

1 Respostas

Não faça atrasos dentro de um ISR. Não faça impressões seriais dentro de um ISR. Leia este .

Você precisa reformular. O ISR pode definir um sinalizador, que você testa em loop . Faça o atraso no loop .

1
adicionado