Цитата(Грендайзер @ Aug 5 2015, 20:08)

Сколько угодно. Фильтр расчитывается лишь в том случае, если переменная flag == 1. Она устанавливается в 1 в функции обработки прерывания от АЦП, и сбрасывается в 0, как только завершился код фильтра для данного отсчёта поступившего с АЦП. После этого фильтр не считается, а моргают лампочки....
Представьте, что одна итерация "мигания" длится 1 секунду. Это значит, что фильтр может обновляться не чаще, чем 1 раз в секунду.
Цитата(Грендайзер @ Aug 5 2015, 20:08)

Впрочем я в ф-ции int main(void) я коментил лампочки и писал строчку типа
Код
dout = din;
без всякого фильтра. Всё равно никакого эффекта. Как будто компилятор хочет всё выполнять в функциях прерывания, а на основную ему
наср наплевать

При том самое интересное, что в основной ф-ции переменную flag процессор обнуляет, а вот фильтр банит...
Довольно бессмысленно вносить случайные изменения в неработающую программу в надежде, что она заработает.
И выкиньте из головы мысль о том, что компилятор виноват. Это ошибки в вашей программе. Да, для оптимизации компилятору разрешено многое такое, что новичка может поставить в тупик, но есть чёткие правила. Если хотите понимать, что он нагенерил, смотрите в справочник инструкций процессора. Начинайте с низких уровней оптимизации, потому что на высших уровнях код корёжится до неузнаваемости, без поллитры не разберёшься, но при этом правильные программы не ломаются. Ну и вообще сомневаюсь, что у вас всё упёрлось в оптимизацию. Выглядит так, будто вы просто не понимаете, как работает программа, и надеетесь включением оптимизации волшебным образом решить все проблемы.
Можно было бы попробовать поразбираться, но вы привели неполный код, а полный, наверное, слишком большой, то есть разбираться будет лень. Ну и я не знаю, как там в SAMах всё работает, может быть, хитрые нюансы есть.