タイマー1 / インプットキャプチャ機能 / 周期を測る

pp.494-495

今50 Hzの方形波(周期20 ms)を入力している。
f:id:ti-nspire:20200718133937p:plain:h300 f:id:ti-nspire:20200718144924j:plain:h300

#define F_CPU 8000000UL

#include <avr/io.h>
#include <avr/interrupt.h>
#include "LCDClass.h"

LCDClass lcd("PD7","PD6","PD5","PD4","PD3","PD2"); // (RS,EN,D4,D5,D6,D7)の順番で指定する。

volatile uint16_t timeOld;
volatile uint16_t timeNew;
ISR(TIMER1_CAPT_vect){
    // ICP1ピン(PB0)にキャプチャイベントが発生したら、
    // 隣るrising edge同士の差を計算して表示する。
    timeOld = timeNew;
    timeNew = ICR1;
    lcd.gotoRowCol(2, 1);
    lcd.print(timeNew - timeOld);
}

int main(){
    lcd.init();
    lcd.gotoRowCol(1, 1);
    lcd.print("period (us):");
    
    // rising edgeでキャプチャ(デフォルトはfalling edge)。8分周してカウント。
    // だから1カウントが1 uS。
    // ICESはInput Capture Edge Select。
    // CSはClock Select。
    TCCR1B |= (1 << ICES1) | (1 << CS11);
    
    // インプットキャプチャ割り込みを有効化。
    TIMSK1 |= (1 << ICIE1);
    
    sei();
    while(1);
    return 0;
}