Utilizarea cronometrului AVR În cadrul unui ISR

Încerc să creez un ISR care funcționează timp de 15 secunde când este apăsat un anumit buton. Încerc să folosesc funcțiile AVR de pe Arduino Uno pentru a începe să contorizez când intră în ISR, apoi închideți bucla atunci când atinge 15 secunde.

Am dificultati sa gandesc unde este stocat contorul pe care vreau sa il folosesc pentru buzunarul meu.

Aici este codul meu până acum:

#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
Făcând serial în interiorul unui ISR ​​este de obicei o idee rea. Poate vă gândiți să faceți eșantionul în mod continuu și folosind un ISR pentru a seta un steag și pentru a iniția un cronometru cu 1 foc. Codul de buclă ar putea să verifice steagul și să facă raportarea serială de 9600 baud după cum este necesar.
adăugat autor Dave X, sursa

1 răspunsuri

Nu faceți întârzieri în cadrul unui ISR. Nu efectuați imprimări seriale în interiorul unui ISR. Citiți acest .

Trebuie să reproiectați. ISR poate seta un steag, pe care apoi îl testați în loop . Faceți întârzierea în loop .

1
adăugat