Пользуюсь давно компаратором (правда, в Меге48РА), всё работает
четко и быстро. Не совсем понял вот эти пляски с битом запрета
копаратора:
ACSR = (1<<ACD);
ACSR = (1<<ACD) | (1<<ACBG) | (1<<ACI) | (1<<ACIE);
ACSR &= ~(1<<ACD);
Зачем его вобще трогать, если компаратор используется? :))
Я настраиваю так (снаружи вход минусовой. а плюсовой внутри подключен к опоре):
//--------------------------------------------------------------------------
// настройка компаратора на срабатывание по перегрузке ключа
void SetUpComparator(void)
{
ACSR = (1<<ACBG) // "+AIN0" внутри соединён с Internal Ref (1,1В)
| (1<<ACIE) // разрешить прерывания от компаратора
| (1<<ACIS1) // по отрицательному фронту, когда внешний "-AIN1"
| (0<<ACIS0); // становится больше внутреннего "+AIN0" (1,1В)
}
И всё. В самом прерывании сделать, что нужно, а сам компаратор трогать не надо:
//--------------------------------------------------------------------------
// прерывание компаратора на срабатывание по перегрузке ключа
__interrupt void irqANA_COMP (void)
{
PORTB_Bit6 = 0; // выключить нижний ключ
}
Ещё раз: Сбрасывать бит ACI в прерывании НЕ НУЖНО!
Он сам сбрасывается аппаратно, когда это прерывание разрешено и в него происходит влёт.
P.S.И да, кстати, опора Vref там не 1,23 а 1,1В