ozonn писал(а):И чем вам это не нравится?
Чем мне не нравится? )) Временем обработки прерывания... Важные прерывания.. не важные прерывания... А если у меня есть важные прерывания, например аварийный датчик отключения системы на INT0...
Ну хорошо... МК чёто делает... сработало прерывание по завершению преобразованию АЦП... уходим в обработчик прерывания по завершению преобразования АЦП... Сидим в обработчике и чёто там считаем... примерно так:
a=ADCW; // первая выборка АЦП... записали данные из АЦП в переменную "a" (тип int)...
повторный запуск...
...
a=a+ADCW; // вторая выборка АЦП... прибавили данные из АЦП в переменную "a" (тип int)...
повторный запуск...
...
a=a+ADCW; // третья выборка АЦП... прибавили данные из АЦП в переменную "a" (тип int)...
сброс...
повторный запуск...
...
a=a/3; // нашли среднее значение по трём выборкам АЦП...
повторный запуск...
...
А пока мы сидели в обработчике прерывания по завершению преобразования АЦП... в это время самое время сработал Запрос на внешнее прерывание 0 ... Нужно
НЕМЕДЛЕННО обработать это прерывание и отключить систему!!!

Получили отложенное прерывание... И что? МК сначала закончит обработку прерывания по завершению преобразования АЦП... Затем выйдет из обработчика... Выполнит ещё одну инструкцию.. и только потом перейдёт в обработчик по вектору INT0... На всё это уйдёт грубо до 10...20 микросекунд (зависит от длины кода обработчика и тактовой частоты МК)... Только после этого сработает аварийное отключение системы. Вот только через 10...20 микросекунд отключать будет уже нечего.. потому что за это время всё нафиг уже сгорело)))
Поэтому, оставляем только аварийное прерывание по вектору INT0. В случае Запрос на внешнее прерывание 0, МК
немедленно перейдёт в обработчик по вектору INT0. При этом время на отключение системы потребуется меньше 1 микросекунды (зависит от длины кода обработчика и тактовой частоты МК). За это время ничего сгореть не успеет (а может и испеет...

всё зависит от системы).
А всякие там АЦП и прочее, не важное, можно обработать и в главном цикле..
Это просто пример... что может быть важно, а что не очень важно... ))
ozonn писал(а):сначала делим результат измерения на 2, потом, независимо от того, больше ли это частное чем предыдущее частное плюс один или оно меньше, чем предыдущее частное минус один, выполняем одно и то же действие, а именно, еще раз делим результат на два. Т.е. получаем результат в четыре раза меньше измеренного. В чем тут фокус?
char u; // u - выход данные АЦП
int ub; // ub - буфер АЦП
a=ADCW/2; // это просто делим на 2. Було 10 разрядов, стало 9 разрядов)) Это не важно))
А фокус тут:
if (a>ub+1) {u=a/2; ub=a;};
if (a<ub-1) {u=a/2; ub=a;};
// Если новые данные (АЦП) отличаются больше чем на один от ранее записанных (в буфер АЦП), то новые данные (АЦП) вступают в силу (u - выход данные АЦП). И одновременно сохраняем новые данные (в буфер АЦП).
// Если новые данные (АЦП) не отличаются/или отличаются не больше чем на один от ранее записанных (в буфере АЦП), то это просто
ШУМ (АЦП). В этом случае новые данные (АЦП) игнорируются.
Так полностью избавляемся от шума..)) Там лучше смотреть на графике АЦП...