char i
int Buffer[8]
Начальная инициализация указателя на массив в начале main():
i=0
В обработчике прерываний от АЦП:
int ADCres
ADCres = младший регистр АЦП + старший регистр АЦП*256
Buffer[(i++)&0x07] = ADCres
Среднее массива можно вычислять либо тут же, либо в main() - это зависит от временных ограничений программы.
Только не вздумайте применять i для вычисления среднего, объявите для этого ЛОКАЛЬНУЮ переменную той же размерности char.
Комментарии.
Сначала объявляем массив как глобальный int, а указатель на него как глобальный char
Потом указатель инициализируем начальным значением и запускаем цепочку таймер-АЦП. Тут я немного не в курсе какой таймер может запускать АЦП по своему переполнению в AVR. Но это несущественно - можно взглянуть в даташите или кто подскажет на лету.
В прерывании по АЦП сначала формируем 16-разрядное значение из двух отдельных байт результата преобразования.
Затем вписываем этот результат в массив по текущему значению указателя (адреса массива). После этого инкрементируем указатель и накладываем на него маску 0х07, тем самым ограничивая размер указателя от 0 до 7.
В приведенном примере использован массив из 8 элементов.
Все! Массив готов для вычисления среднего.
Таким образом мы записываем значения преобразования в массив по КРУГУ. В массиве всегда имеется последние 8 измерений. Правда они неупорядочены, поскольку граница начала новых данных все время скользит по кругу, но для прямоугольного окна это и не требуется, поскольку мы просто суммируем все значения для нахождения среднего.
ЗЫ. Решил не рисовать. Проще будет метапрограмма




