chottoshitahanashi’s diary

基本的に間違ったことばかり書いてるブログ。検索ひっかかるな

RCテスト結果2

前回のはdelay()を使ったものなのでこちらのブログ
Arduinoでtimerを使った割込み処理の方法 – imo Lab.
を参考に今回はタイマーを使ってみた。ライブラリがあるのは知ってるけど敢えて使わず
f:id:name-3333:20220405211500p:plain
結果は前回と変わらず、あるいは若干時定数が小さくなってるか。1ミリ秒毎に割り込みがかかってるのは確認済み。
コードは下に記述。最初下のコードでloop()内をストップするためにコメントアウトした部分

  // while(counter) {a += 1;}

を使ってたんだけどこれだとほとんど割り込みコールバックが呼ばれてくれなかったんでdelay()に直した。この辺の勘所はまだよくわかってない。ちなみに

  while(counter) {}

だと最適化されてコード自体削除されたんで酷いことに。volatileとか適当にいろいろ試したけど駄目だった。

#define TACT_SW_PIN 8
#define DIGITAL_OUT_PIN 9
#define ANALOG_IN_PIN A5
#define LED_PIN 13
#define NUM_MEASURES 512
  
void setup() {
  Serial.begin(9600);

  pinMode(TACT_SW_PIN,  INPUT_PULLUP);
  pinMode(DIGITAL_OUT_PIN, OUTPUT);
  pinMode(ANALOG_IN_PIN, INPUT);

  digitalWrite(DIGITAL_OUT_PIN, LOW);

  delay(1000);
}

int counter;
int result[NUM_MEASURES + 1]; // Not using result[0];

ISR (TIMER2_COMPA_vect)
{
  if (counter)
  {
    // Serial.println(counter);
    result[--counter] = analogRead(ANALOG_IN_PIN);
  }
}

void start()
{
  TCCR2A = (1<<WGM21); // CTC mode
  TCCR2B = (1<<CS22); // 64 Division
  OCR2A = 250 - 1; // 1ms
  TIMSK2 |= (1 << OCIE2A);
}

void stop()
{
  TCCR2B = 0;
}

void loop()
{

  Serial.println("waiting");

  int tact_in = 1;
  while(tact_in)
  {
    tact_in = digitalRead(TACT_SW_PIN);
  }

  Serial.println("start");
  digitalWrite(LED_PIN, HIGH);
  counter = NUM_MEASURES + 1; // Count down, stop when 0
  int a = 0;
  unsigned int millis1 = millis();
  digitalWrite(DIGITAL_OUT_PIN, HIGH);
  start();

  // while(counter) {a += 1;}
  delay(1000);

  stop();
  unsigned int millis2 = millis();
  digitalWrite(DIGITAL_OUT_PIN, LOW);
  digitalWrite(LED_PIN, LOW);
  Serial.println("done");

  for (int i = NUM_MEASURES; i != 0; --i)
  {
    Serial.println(result[i]);
  }

  Serial.println("discharging");
  delay(5000);
}