#define INT_KOEFF 16
int int_RC_filtr;
int int_otobr;
// ADC interrupt service routine
interrupt [ADC_INT] void adc_isr(void)
{
// ПРОГРАММНЫЙ АНАЛОГ RC ФИЛЬТРА
int_RC_filtr += ADCW - ((int_RC_filtr + INT_KOEFF/2) >> 4);
// Деление на 16 сдвигом, правильное округление при делении
// ... + INT_KOEFF/2) / INT_KOEFF);
// значение в INT_KOEFF раз больше (и точнее)
// чем входное значения
}
//................
void main (void)
{
//................
if (TIFR1 & (1 << TOV1)) { // Несколько раз в секунду
TIFR1 = 1 << TOV1;
if (abs(int_otobr - int_RC_filtr) >= GIST_ADC_OTOBR) {
int_otobr = int_RC_filtr;
otobr(int_otobr);
}
}
}