Официальный сайт компании Arduino по адресу arduino.cc
Виснет Леонардо
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Пт, 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); } }