外部クロックをタイマー1でカウントする

DS3231から出力する1Hzの方形波をタイマー1でカウントし、カウント数に応じて一定周期で何かをする。
f:id:ti-nspire:20200210144829p:plain:h270 f:id:ti-nspire:20200210144124p:plain:h270

#include <avr/io.h>
#include <util/delay.h>
#include "DS3231.h"
#include "USART.h"

volatile uint8_t periodElapsed = 0;
ISR(TIMER1_OVF_vect){
    periodElapsed = 1;
}
void initTimer1(){
    TCCR1A |= (1 << WGM11);
    TCCR1B |= (1 << WGM13) | (1 << WGM12);
    TCCR1B |= (1 << CS12) | (1 << CS11) | (1 << CS10);
    TIMSK1 |= (1 << TOIE1);
    TCNT1 = 0;
    sei();
}


int main(){
    initUSART();
    
    myI2Cv2.enable(80);
    
    DS3231 rtc;
    rtc.disable32kHz();
    rtc.enableSqWave(1); // 1Hzの方形波を出力する。

    printString("Enter a period in seconds: "); // 周期を秒単位で設定する。最長約18時間。
    ICR1 = getNumber16() - 1;


    loop_until_bit_is_set(PIND, PD5); // 外部クロックのrising edgeで
    initTimer1();                     // タイマー1を開始して、
    rtc.getDateTimeBCD();             // とりあえず最初に何かをして、
    rtc.printDateTime();
    printString("\n");

    while(1){
        if(periodElapsed){        // その後、設定した周期ごとに、
            rtc.getDateTimeBCD(); // 何かをして、
            rtc.printDateTime();
            printString("\n");
        }
        periodElapsed = 0;        // 次の1周期を待つ。を繰り返す。

        _delay_ms(200);
    }


    return 0;
}