Изучаем работу компаратора на микроконтроллере Atmega8.

Практически в каждом микроконтроллере есть аналоговый компаратор. В нашем микроконтроллере находится он на ножках AIN1 (негативный вход) и AIN0 (положительный вход). 
Вход AIN0 можно подключить к выводу общего назначения PB2, а так же к внутреннему источнику опорного напряжения на 1.2 В.
Вход AIN1 — можно подключить к выводу PB3, а так же к одному из 8-и входов модуля АЦП.

Регистры компаратора

Основной регистр управления компаратором — это ACSR (Analog ComparatorControl and Status Register). 

ACD — включение компаратора:
         1 — запрещает работу аналогового компаратора
         0 — разрешает.
По умолчанию компаратор всегда включен. Для уменьшения энергопотребления компаратор желательно отключать. При изменении бита ACD нужно запрещать прерывания компаратора, сбрасывая бит ACIE. Иначе произойдет прерывание. 

ACBG  — подключение внутреннего источника опорного напряжения на 1.23В к положительному входу компаратора (AIN0):
         1 — подключает опорное напряжение     
         0 — отключает опорное напряжение

ACO — данный бит хранит состояние выхода аналогового компаратора, то есть результат сравнения входных напряжений.

ACI — флаг прерывания. Он устанавливается аппаратно, когда происходит событие определенное битами ACIS1 и ACIS0. Если прерывания компаратора разрешены, то вызывается обработчик. Флаг ACI сбрасывается аппаратно при выполнении обработчика. Также он может быть очищен программно, если записать в него 1.

ACIE — разрешение прерываний компаратора:
        1 — разрешено прерывание при изменении состояния его выхода
        0 — прерывание запрещены

ACIC  — подключает выход компаратора к схеме захвата таймера Т1:
       1 — выход компаратора подключен к схеме захват
       0 — не подключен.

ACIS1, ACIS0  — данные биты определяют событие, по которому будет вызываться прерывание компаратора:

При необходимости подключится к выходу мультиплексора АЦП, то задействуются еще два регистра — SFIOR и ADMUX

При установке бита ACME регистра SFIOR в 1 ( АЦП должен быть выключен — бит ADEN регистра ADCSRA сброшен),  отрицательный вход компаратора подключается к выходу мультиплексора АЦП.  При установке бита ACME в ноль — вход компаратора подключается к выводу AIN1.
С помощью регистра ADMUX можно выбирать, какой из восьми выводов ADC7 — ADC0 будет подключен к отрицательному входу компаратора:

В качестве примера использования мы напишем программный код для части схемы, которая следит за состоянием резервной батарейки.

***картинка

AIN0 мы подключаем к внутреннему источнику напряжения 1.2В, а AIN1 подключаем к РВ3. Реостат R1 будет имитировать напряжение на аккумуляторе.
Учитывая очень низкую скорость разрядки батарейки нет надобности постоянно ее проверять и тратить на это ресурсы микроконтроллера, но когда напряжение батарейки достигнет критического значения — сработает прерывание и выдаст нам предупреждение.

#define F_CPU 4000000UL 
 
#include <xc.h>
#include <avr/interrupt.h>
 
ISR(ANA_COMP_vect){ 
PORTB|=(1<<PB0);
}
 
int main(void){
cli();
//настройка компаратора
ACSR = (1<<ACBG)|(1<<ACIE)|(1<<ACIS1)|(0<<ACIS0);
DDRC   =0b11111111;
DDRB   =0b00000001; //ножки D0-выход
sei();
  
    while(1)
    {
        PORTC=(ACSR&(1<<ACO));
    }
}