タイマーカウンター0、CTCモード、トグル出力を試す

アッスィラスコウプ

CTCはClear Timer on Compare match。
WGMはWaveform Generation Mode。
TCCR0はタイマーカウンター0のTimer/Counter Control Register。
OCR0はタイマーカウンター0のOutput Compare Register。

システムクロックを8MHz、1024分周比、トグル出力とすると、

  • コンペア値が0: 1ティックの時間は(1秒 / 8 MHz) * 1024 * 1 = 128 μsec (トグル出力周波数は1秒 / (2 * 128 μsec) ≒ 3.9 kHz)、
  • コンペア値が1: 1ティックの時間は(1秒 / 8 MHz) * 1024 * 2 = 256 μsec、
  • コンペア値が2: 1ティックの時間は(1秒 / 8 MHz) * 1024 * 3 = 384 μsec、
  • コンペア値が3: 1ティックの時間は(1秒 / 8 MHz) * 1024 * 4 = 512 μsec、
  • コンペア値が255: 1ティックに要する時間は(1秒 / 8 MHz) * 1024 * 256 = 32.768 msec (トグル出力周波数は1秒 / (2 * 32.768 msec) ≒ 15 Hz)、
#include <avr/io.h>

int main(){
    TCCR0A |= (1 << WGM01);              // タイマーカウンター0をCTCモードにする。
    TCCR0A |= (1 << COM0A0);             // コンペアマッチ時にOC0A (PD6)端子をトグルする。
    TCCR0B |= (1 << CS02) | (1 << CS00); // 1024分周したシステムクロックをタイマーカウンター0でカウントする。
    OCR0A = 50;                          // コンペア値を設定する。
    DDRD |= (1 << PD6);                  // IOをOUTにして実際にOC0A (PD6)端子からトグル出力する。
  
    return 0;
}

上のコードは、システムクロック8 MHz、1024分周、コンペア値50、トグル出力に設定してあるので、1ティックに要する時間は(1秒 / 8 MHz) * 1024 * 51 = 6.528 msec (トグル出力周波数は1秒 / (2 * 6.528 msec) ≒ 77 Hz)。
f:id:ti-nspire:20190702071103p:plain:h200 f:id:ti-nspire:20190702071627j:plain:h200 f:id:ti-nspire:20190702071704p:plain:h200

f:id:ti-nspire:20190702072132p:plain:w500
f:id:ti-nspire:20190702072226p:plain:w500
f:id:ti-nspire:20190702072331p:plain:w500
f:id:ti-nspire:20190702073440p:plain:w500
f:id:ti-nspire:20190702072451p:plain:w500
f:id:ti-nspire:20190702072603p:plain:w500