外部クロックをタイマー1でカウントする
DS3231から出力する1Hzの方形波をタイマー1でカウントし、カウント数に応じて一定周期で何かをする。
#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; }