ISR内のAVRタイマーの使用

私は、特定のボタンが押されたときに15秒間動作するISRを作成しようとしています。私はArduino UnoでAVR機能を使用してISRに入ったときにカウントを開始し、15秒に達するとループを終了しようとしています。

カウンターが実際に格納されている場所を推論するのが難しいので、whileループに使用したいと思っています。

これまでのところ私のコードです:

#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を使ってフラグを設定し、ワンショットタイマーを開始することを検討してください。ループコードは、フラグをチェックし、必要に応じて9600ボーのシリアル報告を行うことができます。
追加された 著者 Dave X,

1 答え

ISR内で遅延を行わないでください。 ISRの中でシリアルプリントをしないでください。 こちらをお読みください。

あなたはデザインを変更する必要があります。 ISRは、 loop でテストするフラグを設定できます。 loop で遅延を行います。

1
追加された