oWart
@oWart
Инженер-конструктор

Почему AVR глючит на вычислениях в основной программе при разрешенных прерываниях?

Добрый день. Столкнулся с такой непонятной мне бедой.

Контроллер ATmega32a работает от внутренних 8 MHz. Среда IAR Embedded Workbench for Atmel AVR 6.12. Отладчик китайский ноунейм JTAG адаптер.

Есть прерывание по таймеру2 с частотой 20kHz, которое считывает значение АЦП и ничего внутри не считает, выполняется за микросекунды, большая часть времени основная программа свободна.
Еще одно прерывание по таймеру0 на частоте 30Hz(!) отвечает за моргания светодиодами, тоже ничего не считает, выполняется быстро, все контролировал не осциллографе.

В основной программе есть моменты, которые весьма затратны по времени. Быстрое преобразование Фурье, арккосинус с арктангенсом и корнем квадратным, на подобие этого:
if (FFTfull){
             cli();
             fft_input(capture, bfly_buff);   
             fft_execute(bfly_buff);          
             fft_output(bfly_buff, spektrum); 
             FFTfull=0;
             sei();
      }
cli();
SKV=0*X+0*Y+1*Z; //скалярное произведение векторов
DLV=sqrt(Y*Y+X*X+Z*Z); //длина вектора
COSV=SKV/DLV; //косинус угла 
Alpha=acos(COSV)*pi180; //угол
sei();

Так вот если я не огораживаю расчеты запретом на прерывания cli(), то контроллер ведет себя неадекватно, перескакивает на непонятные адреса памяти и в итоге уходит на перезагруз. Это нормальная ситуация или все же где-то косяк? Я так понимаю он не может нормально вернуться из прерывания к расчетам.

UPD: Написал небольшую заметку для тех, кого гугол приведет сюда. Решение проблемы с CStack и RStack в среде IAR для AVR driveelectronics.ru/soft/prevyshenie-razmerov-csta...
  • Вопрос задан
  • 699 просмотров
Решения вопроса 1
@iv_k
скорее всего кто-то скушал стек. попробуйте увеличить его до упора.
и перепишите математику на таблицы
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
gbg
@gbg Куратор тега Программирование
Любые ответы на любые вопросы
Арккосинус на AVR? Вы серьезно?
FFT в реальном времени на AVR делается только по готовым таблицам, и то впритык по тактам умещается.
Ответ написан
Комментировать
a_volkov1987
@a_volkov1987
Инженер-схемотехник
Скорее всего у вас пересекаются области памяти, которые используются внутри прерывания, которое отвечает у вас за обновление светодиодной индикации и области памяти, которые вы задействуете в основной программе.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы