Виснет Леонардо
- Войдите на сайт для отправки комментариев
Пт, 04/08/2017 - 07:28
Здравствуйте знатоки!
У меня с моей Леонардой, похоже, на пару едет крыша.
Попробовал поиграться с фильтрацией. Набросал простенькую прогу с АЦП. И вдруг... Если поместить формулу фильтрации в вектор прерывания АЦП, Леонарда патологически виснет, и выходит только после реанимации. Но стоит перенести формулу фильтра в тело проги (loop), как всё пучком.
Привожу скетч:
#define Fs 160
#define Fpl 16
#define K (Fs/Fpl)
volatile byte Dout = 0;
//volatile byte Din = 0;
unsigned long previousMicros = 0; //Переменная для паузы в индикации параметров
const long interval = 10000;
void ADC_init()
{
ADCSRA = 0;
ADCSRB = 0;
ADMUX |= (1 << REFS0);
ADMUX |= (1 << ADLAR);
ADMUX |= (0 & 0x07);
ADCSRA |= (1 << ADPS2);
ADCSRA &= ~ ((1 << ADPS1) | (1 << ADPS0));
ADCSRA |= (1 << ADATE);
ADCSRA |= (1 << ADIE);
ADCSRA |= (1 << ADEN);
ADCSRA |= (1 << ADSC);
}
ISR(ADC_vect)
{
noInterrupts();
static byte Din = ADCH;
Dout = (Dout * (K-1) + Din)/K;
interrupts();
}
void setup()
{
Serial.begin(9600);
while (!Serial) {
}
pinMode(A0, INPUT);
ADC_init();
interrupts();
}
void loop()
{
// Dout = (Dout * (K-1) + Din)/K;
unsigned long currentMicros = micros();
if(currentMicros - previousMicros < 0)
previousMicros = currentMicros;
else if(currentMicros - previousMicros >= interval)
{
previousMicros = currentMicros;
Serial.println(Dout);
}
}