クロックはATmega328Pで生成することにする。
/* PD7から10Hzを、PD6から1Hzを出力する。 */ #include <avr/io.h> #include <avr/interrupt.h> #define F_CPU 8000000UL #define PRESCALE_FOR_1HZ 10 volatile int8_t counter = PRESCALE_FOR_1HZ; ISR(TIMER1_COMPA_vect){ // 20Hzの頻度でPD7をトグルする。結局10Hzの方形波が出力される。 PORTD ^= (1 << PD7); // その方形波を10分周する。結局1Hzの方形波が出力される。 if(--counter <= 0){ PORTD ^= (1 << PD6); counter = PRESCALE_FOR_1HZ; } } int main(){ DDRD |= (1 << PD6) | (1 << PD7); // クロックを出力する端子を指定する。 TCCR1B |= (1 << WGM12); // タイマー1をCTCモードで動かす。 TCCR1B |= (1 << CS11); // 8分周してタイマー1でカウントする。 OCR1A = 49999; // コンペア値。(F_CPU/8分周)/(10Hz*2)-1 = 49999 TIMSK1 |= (1 << OCIE1A); sei(); while(1); return 0; }
内蔵発振器自体が若干遅い。