タイマー0 / 強制アウトプットコンペアマッチ

p.480

実際にはコンペアマッチしていないのに、コンペアマッチしたことを示す信号がウェーブフォームジェネレーターへ供給される。何に使うのかはわからない。

f:id:ti-nspire:20200717145057p:plain:w900
非公式訳:
FOC0Aビットが意味を持つのは、WGM02:00の各ビットでPWMモード以外のモードを指定したときだけです。

ただし今後登場するデバイスとの互換性を保つ手段として、たといPWMモードのときでも、TCCR0Bレジスタに書き込むときにはFOC0Aビットを0にしてください。FOC0Aビットに1が書き込まれた瞬間、実際はコンペアマッチしていないのにコンペアマッチしたことを示す信号がウェーブフォームジェネレーターユニットへ供給され、OC0Aピン(PD6)の出力がCOM0A1:0の各ビットの設定に応じて変化します。FOC0Aビットはストロボ(ストローブ)として機能します(訳註: 光った瞬間の光景が切り取られる(= FOC0Aビットがセットされた瞬間のCOM0A1:0の各ビット値が適用される))。そのため、強制コンペアマッチ時の動作はCOM0A1:0の各ビット値によって決まります。

FOC0Aビットがセットされても、割り込みは発生しませんし、CTCモードのときでもトップ値OCR0Aに達したわけではないためタイマーがクリアされることもありません。

FOC0Aビットは、いつ読み出しても必ず0です。

f:id:ti-nspire:20200717144656p:plain:w500

#define F_CPU 8000000UL

#include <avr/io.h>
#include <util/delay.h>

int main(){
    DDRD |= (1 << PD6);
    
    // コンペアマッチ時にトグル。
    // ノーマルポート動作。すなわちOC0Aピンは切り離されている。
    // Waveform Generation Modeはノーマル。
    // 分周比の設定もしない。
    TCCR0A |= (1 << COM0A0);

    while(1){
        TCCR0B |=  (1 << FOC0A);
        _delay_us(10);
        
        TCCR0B |=  (1 << FOC0A);
        _delay_us(30);
    }
    
    return 0;
}