1 Hz、10 Hzのクロックを作る

クロックは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;
}

内蔵発振器自体が若干遅い。
f:id:ti-nspire:20201017081255p:plain:w700