アッスィラスコウプ
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)。