Бзыки ардуино.

ilyash550
Offline
Зарегистрирован: 26.06.2017

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...

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

без полного кода (который рушится), помочь проблематично.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Давайте полный код. Вернее два, который работает и который - нет. А то хрен Вас знает что Вы там куда перенесли. 

Наменди тут одному помогали ADC читать и только посту к 30-му выснилось, что он его с пина Ресет читает. там потом ещё долго доказывал, что это можно и всех гондонами называл.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

а у этого, я думаю, n к нулю прилетает.

ilyash550
Offline
Зарегистрирован: 26.06.2017
#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();
}

 

ilyash550
Offline
Зарегистрирован: 26.06.2017

Второй тип выкидонов. Симуляция не крашится, но после захода в фунцкию поиска коэфициентов Фурье ардуинка как будто резетиться. 

закоментил //findZero(), заскоментил кусок кода к loop обратно и все как часы.

ilyash550
Offline
Зарегистрирован: 26.06.2017

с n все нормально.

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Т.е. Вас не смущает что в 88 строке (может и еще где-то)  цикл от 1 до 20, но при этом массив всего 20 элементов, т.е. от 0 до 19...

Такие вот "Бзыки и закидоны" у ардуино

ilyash550
Offline
Зарегистрирован: 26.06.2017

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