タイマーカウンターペリフェラルを使ってみる / タイマーカウンター1

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;
}

f:id:ti-nspire:20190701132714p:plain:w500
f:id:ti-nspire:20190701132940p:plain:w500
f:id:ti-nspire:20190701134147p:plain:w500