Бзыки ардуино.
- Войдите на сайт для отправки комментариев
void loop() {
dataFill();
zero = 0;
for(int i = 0; i < n; i++){
zero = zero + data[i];
}
zero = zero/n;
dataIn();
findAnB(hc);
dataOut();
}
Все работает нормально. Если переношу кусок кода в функцию и вызываю ее в loop, симуляция крашется. Вот так.
void loop() {
dataFill();
findZero();
dataIn();
findAnB(hc);
dataOut();
}
Все переменные из этого куска кода объявлены в самом начале, с видимостью проблем нет, к тому же эти же переменные используются во всех остальных функциях. Что это вообще может быть? Я уже несколько часов пытаюсь понять.
Крашится симуляция в методе findAnB(hc), который использует переменую zero и обычно работает отлично. Прикол в том, что если поместить этот кусок кода в эту функцию, симуляция все равно крашится. Объясняется все тем, что кусок кода проклят, и может быть помещен только в великую функцию loop(). Вот только в проклятья я не верю. Помогите пожалуйста, люди добрые. I'm done...
без полного кода (который рушится), помочь проблематично.
Давайте полный код. Вернее два, который работает и который - нет. А то хрен Вас знает что Вы там куда перенесли.
Наменди тут одному помогали ADC читать и только посту к 30-му выснилось, что он его с пина Ресет читает. там потом ещё долго доказывал, что это можно и всех гондонами называл.
а у этого, я думаю, n к нулю прилетает.
#include <LiquidCrystal.h> const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2; LiquidCrystal lcd(rs, en, d4, d5, d6, d7); #define IN 0 #define hc 20 byte d = 5; float th = 0.0; long zero; int n; int data[565]; float a[hc]; float b[hc]; int maxin; int minin; float minth; int lastm; bool fm; bool fm1; int count; unsigned long time1; byte c[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; byte c0[8] = {0b11011, 0b10001, 0b00100, 0b01110, 0b00100, 0b10001, 0b11011,0b00000}; byte c1[8] = {0b11011, 0b10001, 0b00000, 0b00000, 0b00000, 0b10001, 0b11011, 0b00000}; byte c2[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b11111, 0b11111, 0b11111}; byte c3[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b11111, 0b11111, 0b11111, 0b11111}; byte c4[8] = {0b00000, 0b00000, 0b00000, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111}; byte c5[8] = {0b00000, 0b00000, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111}; byte c6[8] = {0b00000, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111}; byte c7[8] = {0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111}; #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) void setup() { Serial.begin(9600); lcd.begin(16, 2); createChars(); sbi(ADCSRA, ADPS2); //1 cbi(ADCSRA, ADPS1); //0 sbi(ADCSRA, ADPS0); //1 } void createChars(){ lcd.createChar(0, c0); lcd.createChar(1, c1); lcd.createChar(2, c2); lcd.createChar(3, c3); lcd.createChar(4, c4); lcd.createChar(5, c5); lcd.createChar(6, c6); lcd.createChar(7, c7); } int findA0(){ a[0]=0; //Serial.print("zero in fun");Serial.println(zero); for( int i = 1; i < n; i++){ a[0]= a[0] + (float)((data[i]-zero)*2*PI/n); //Serial.print(data[i]-zero);Serial.print("||");Serial.print(data[i]);Serial.println(); } //Serial.println(a[0]); a[0]=a[0]/(2*PI); //Serial.print("a0 = "); Serial.println(a[0]); } int findAnB(int noa){ Serial.println("I'm out of zero"); zero = zero/n; Serial.println("I'm in furie"); for(int j = 1; j < noa+1; j++){ a[j]=0; for( int i = 1; i < n; i++){ a[j]= a[j] + (data[i]-zero)*cos(j*2*PI*i/n)*2*PI/n; //Serial.println(a[j]); } a[j]=a[j]/PI; //Serial.print("finded a");Serial.print(j);Serial.print("||");Serial.println(a[j]); b[j]=0; for( int i = 0; i < n; i++){ b[j]= b[j] + (float)(data[i]-zero)*sin(j*2*PI*i/n)*2*PI/n; } b[j]=b[j]/PI; //Serial.print("finded b");Serial.print(j);Serial.print("||");Serial.println(b[j]); } } void dataFill(){ // ЗАПОЛНЕНИЕ data[] ЗА ВРЕМЯ t=1/f, ГДЕ f=50 Гц n = 0; time1 = micros(); while(micros() - time1 < 19980){ int x = analogRead(0); data[n] = x; n++; delayMicroseconds(5); } Serial.print("t=");Serial.println(micros()-time1); Serial.print("n=");Serial.println(n); } void dataIn(){ //ПРОВЕРКА МАССИВА data[] на периодичность Serial.print("data[0]="); Serial.println(data[0]); Serial.print("data[n-1]="); Serial.println(data[n-1]); //МИН, МАКС И СРЕД ЗНАЧЕНИЯ В data[] minin = data[0]; maxin = data[0]; for(int i = 0; i < n; i++){ if (data[i] > maxin) maxin = data[i]; if(data[i] < minin) minin = data[i]; } Serial.print("min="); Serial.println(minin); Serial.print("max="); Serial.println(maxin); } void dataOut(){ Serial.println("I'm in dataOut"); for(int i = 1; i < hc + 1; i++){ if(abs(a[i]) < th && abs(b[i]) < th){ a[i] = 0; b[i] = 0; } else a[i]= abs(a[i]) + abs(b[i]); Serial.print(a[i]); Serial.print(" || "); //if (i%10 == 0) //Serial.println(); } Serial.println(); Serial.println("____________________________________________________________________"); } void lcdMagic(){ lcd.clear(); lcd.setCursor(0, 0); for(int i = 1; i < hc + 1; i++){ if(a[i] > 0) lcd.write(c[0]); else lcd.write(c[1]); } for(int i = 1; i < hc + 1; i++){ if(a[i] > 0){ a[i] = constrain((a[i] - th), 0, th)*100; a[i] = map(a[i], 0, 20, 2, 7); lcd.setCursor(i-1, 1); lcd.write(a[i]); } } } void findZero(){ Serial.println("I'm in zero"); zero = 0; for(int i = 0; i < n; i++){ zero = zero + data[i]; } Serial.println("I'm out of zero"); zero = zero/n; } void loop() { dataFill(); //findZero(); Serial.println("I'm in zero"); zero = 0; for(int i = 0; i < n; i++){ zero = zero + data[i]; } Serial.println("I'm out of zero"); zero = zero/n; dataIn(); findAnB(hc); dataOut(); }Второй тип выкидонов. Симуляция не крашится, но после захода в фунцкию поиска коэфициентов Фурье ардуинка как будто резетиться.
закоментил //findZero(), заскоментил кусок кода к loop обратно и все как часы.
с n все нормально.

Т.е. Вас не смущает что в 88 строке (может и еще где-то) цикл от 1 до 20, но при этом массив всего 20 элементов, т.е. от 0 до 19...
Такие вот "Бзыки и закидоны" у ардуино
Я затупил, a[0] - нулевой коэффициент считается по другому и чтобы использовать тот же массив я решил считать все остальные коэффициенты и записывать их начиная с 1, а к 20му просто прибавить 1. Ахахахахах, ну я и идиот). Как оно работало то раньше? я не понимаю. Спасибо тебе добры человек! Проклятие с кода снято, а тебе хвала и почет. Прошу прощения у ардуины за клевету, щас попробую переименовать тему.