アナログコンパレーター / 実際に使ってみる

アナログコンパレーターについては、本書も含めて手持ちの図書には詳しい説明がなく、データシートを読むしかない。

ここでは、ADCペリフェラル / 読み取るチャンネルを切り換える -と同じようなことをアナログコンパレーターで再現してみる。2値の比較だけなら、ADコンバーターを動かすよりも当然遙かに簡単である。
f:id:ti-nspire:20200720061440p:plain:h315

#define F_CPU 8000000UL

#include <avr/io.h>
#include <avr/interrupt.h>

ISR(ANALOG_COMP_vect){                      // コンパレーター出力がトグルしたら、
    /*
   if(bit_is_set(ACSR, ACO)) PORTB = 0xF0; // それがHへの変化であれば何かをして、
   else                      PORTB = 0x0F; // それがLへの変化であれば何かをする。
   */
    PORTB = ~PORTB;                         // そのたびに何かをする。
}

int main(){
    DDRB  = 0xFF;
    PORTB = 0xF0;

    // コンパレーター割り込みを有効化。
    // コンパレーター出力のトグル時に割り込む(これがデフォルトなので特に指定しない)。
    ACSR |= (1 << ACIE);
    
    // コンパレーター端子のディジタル入力を無効化して省電力化。しなくてもよい。
    // DIDRはDigital Input Disable Register。
    DIDR1 |= (1 << AIN1D) | (1 << AIN0D);
    
    sei();
    while(1);
    return 0;
}