前回のはdelay()を使ったものなのでこちらのブログ
Arduinoでtimerを使った割込み処理の方法 – imo Lab.
を参考に今回はタイマーを使ってみた。ライブラリがあるのは知ってるけど敢えて使わず
結果は前回と変わらず、あるいは若干時定数が小さくなってるか。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); }