AVR-timer gebruiken binnen een ISR

Ik probeer een ISR te maken die 15 seconden werkt wanneer op een bepaalde knop wordt gedrukt. Ik probeer de AVR-functies op mijn Arduino Uno te gebruiken om te beginnen met tellen wanneer het de ISR binnengaat, en dan de lus te verlaten wanneer deze 15 seconden bereikt.

Ik heb problemen met het redeneren waar de teller daadwerkelijk is opgeslagen, die ik wil gebruiken voor mijn while-lus.

Hier is mijn code tot nu toe:

#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
Serieel zijn in een ISR is meestal een slecht idee. Overweeg om uw bemonstering ononderbroken te doen en een ISR te gebruiken om een ​​vlag in te stellen en een 1-shot timer te starten. De luscode kan de vlag controleren en de 9600 baud seriële rapportage uitvoeren indien nodig.
toegevoegd de auteur Dave X, de bron

1 antwoord

Vertragingen in een ISR niet. Voer geen seriële prints uit in een ISR. Lees dit .

Je moet opnieuw ontwerpen. De ISR kan een vlag instellen, die u vervolgens in lus test. Voer de vertraging uit in lus .

1
toegevoegd