Виснет Леонардо

Нет ответов
Peotr
Peotr аватар
Offline
Зарегистрирован: 17.02.2014

Здравствуйте знатоки!

У меня с моей Леонардой, похоже, на пару едет крыша.

Попробовал поиграться с фильтрацией. Набросал простенькую прогу с АЦП. И вдруг... Если поместить формулу фильтрации в вектор прерывания АЦП, Леонарда патологически виснет, и выходит только после реанимации. Но стоит перенести формулу фильтра в тело проги (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);
  }
}