https://github.com/ti-nspire/AVR/tree/master/reactionTime
タイマーカウンター1を使って人の反応時間を計ってみる。
#include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> extern "C" { #include "USART.h" #include "support.h" } // タイマーカウンター1を使うことにする。 static inline void initTimer1(){ TCCR1B |= (1 << CS12) | (1 << CS10); // 1024分周したクロック(8MHz / 1024 = 7.8125kHz)をカウントすることにする。 // したがって128μ秒ごとに1ずつカウントアップする。 // したがって1ミリ秒につき7.8125ずつカウントアップする。 } int main(){ uint16_t timerVal; DDRB = 0xff; // ポートBのIOを全部OUTにする。そこにLEDをつなぐ。 PORTD |= (1 << PD2); // PD2を内部プルアップする。そこにタクトスイッチをつなぐ。 initUSART(); initTimer1(); printString("Press any key to start.\r\n"); while(1){ receiveByte(); // 何かを受信したら、 randomDelay(); // 何秒か待ってから、(randomDelay()はsupport.hに定義してある) TCNT1 = 0; // タイマーカウンター1の値をリセットして、 PORTB = 0xff; // LEDを点けて、 loop_until_bit_is_clear(PIND, PD2); // LEDが点くのを見たらすぐにタクトスイッチを押して、 timerVal = TCNT1 >> 3; // そのときのカウント数を取得して、それを8分の1にしてミリ秒数に変換して(※)、 printWord(timerVal); // 表示して、 printString(" msec\r\n"); PORTB = 0x00; // LEDを消す。 // (※)1ミリ秒につき7.8125ずつカウントアップする設定になっているので // カウント数を7.8125で割ってミリ秒数を求める。ここでは7.8125ではなく8で割っている。 // この分周比だと8秒強までカウントできる。 printString("Press any key to try again.\r\n"); } return 0; }