Використання таймера AVR в межах ISR

Я намагаюся створити ISR, який працює протягом 15 секунд після натискання певної кнопки. Я намагаюся використовувати функції AVR на моєму Arduino Uno, щоб почати підрахунок, коли він входить в ISR, а потім вийти з циклу, коли він досягне 15 секунд.

У мене виникають труднощі, мотивуючи, де лічильник фактично зберігається, що я хочу використовувати для моєї петлі.

Наразі мій код:

#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
Здійснення серійної обробки в ISR зазвичай є поганою ідеєю. Може бути, розглянути питання про вашу вибірки безперервно, і за допомогою ISR встановити прапор і ініціювати 1-shot таймера. Код петлі може перевірити прапорець і виконати 9600-бодову серіальну звітність у міру необхідності.
додано Автор Dave X, джерело

1 Відповіді

Не робіть затримок у ISR. Не виконуйте послідовний друк у ISR. Прочитайте це .

Потрібно змінити дизайн. ISR може встановити прапор, який ви тестуєте в loop . Зробіть затримку в циклі .

1
додано