Ардуино циклический опрос и масивы

sokhib
Offline
Зарегистрирован: 29.08.2016

Доброго времени суток . написал код и не пройму что творится!! для ардуино мега. если закоментировать 32 строку (подписана как эту строку) контроллер каждий раз перезагружается. Вчем причина не могу понять

sokhib
Offline
Зарегистрирован: 29.08.2016
byte Din []={22,23,24,25,26,27,28,29,30,31,32};
byte Dout[]= {33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53};  
bool Dins[sizeof(Din)];
bool Douts[sizeof(Dout)];
int  StepP,alarmP;
unsigned long timing[10];
bool temp, temp1;
void setup() {
  Serial.begin(9600);
  for (byte i=0; i< sizeof(Din); i++){
    pinMode(Din [i],INPUT_PULLUP);
    }
  for (byte i=0; i< sizeof(Dout); i++){
    pinMode( Dout[i],OUTPUT);
  }
 


temp=1;
for (byte i=0; i< sizeof(Dout); i++){
            Douts[i]= false;}
for (byte i=0; i< sizeof(Dout); i++){
  digitalWrite(Dout[i], false);} 

}
void loop() {
inputs();
alarmsP();// check alarms and warms Pump
workP(); // work step Pump
outputs();
monitoring();
temp1=Douts[11];
temp=0;

}   
void inputs(){
 for (byte i=0; i< sizeof(Din); i++){
  Dins[i]=!digitalRead(Din[i]);
 }
}
void alarmsP(){
  Douts[20]=0;
  if ((!Dins[6]&(Dins[7]&Dins[8]||!Dins[7]&Dins[8]||Dins[7]&!Dins[8]))||(Dins[6]&!Dins[7]&Dins[8])){ bitSet(alarmP,0);}// проверка электродов, если да тогда ошибка
  if (alarmP>0){Douts[20]=1;}
  }
void outputs(){

 for (byte i=0; i< sizeof(Dout); i++){
  digitalWrite(Dout[i], Douts[i]);
 } 
}
void monitoring(){
  if ((millis() - timing[10])>=500){
   // Serial.println(" ");
   Serial.print("m");
   Serial.print(temp);
   Serial.print(Dins[5]);
   Serial.print(Dins[6]);
   Serial.print(Dins[7]);
   Serial.print(Dins[8]);
   Serial.print(Douts[11]);
   Serial.println(Douts[20]);
   timing[10] = millis();
  }
}
void workP(){
    if (Dins[5]&&(alarmP==0)){           
         
          if(!Dins[7]){Douts[11]=1;} 
          if( Dins[8]){Douts[11]=0;} 
    
          }
    else{
      Douts[11]=0;}          
}

 

Upper
Offline
Зарегистрирован: 23.06.2020

Строка 63 приводит в выходу за границу массива

 timing[10] = millis();

sokhib
Offline
Зарегистрирован: 29.08.2016

Upper пишет:

Строка 63 приводит в выходу за границу массива

 timing[10] = millis();

но почему когда добовляещ  temp1=Douts[11]; в код работат наченае нормально?

sokhib
Offline
Зарегистрирован: 29.08.2016

sokhib пишет:

Upper пишет:

Строка 63 приводит в выходу за границу массива

 timing[10] = millis();

но почему когда добовляещ  temp1=Douts[11]; в код работат наченае нормально?

я специално добавил в код temp при настройки устанавливаю 1, и при конце первом цикле устанавливаю 0.

если закоментировать строчку где temp1=Douts[11]; и просмотреть порте temp оотается всегда 1. значить каждый раз все выполняется с нуля

sadman41
Offline
Зарегистрирован: 19.10.2016

sokhib пишет:

но почему когда добовляещ temp1=Douts[11]; в код работат наченае нормально?


Трагическая случайность.

GarryC
Offline
Зарегистрирован: 08.08.2016

Как предположение - пока не было присвоения переменной temp1, компилятор не отводил под нее место (она у Вас на используется больше нигде) и промах массива попадал в что то значимое. Когда стали присваивать, выделил место и теперь при промахе попадаета в эту переменную, а ей все по фигу.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

GarryC пишет:

Как предположение - пока не было присвоения переменной temp1, компилятор не отводил под нее место (она у Вас на используется больше нигде) и промах массива попадал в что то значимое. Когда стали присваивать, выделил место и теперь при промахе попадаета в эту переменную, а ей все по фигу.

Не катит.
Переменная объявлена глобально, ее не обязательно сразу инициализировать, память под нее выделится

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Kakmyc пишет:
Переменная объявлена глобально, ее не обязательно сразу инициализировать, память под нее выделится

Не обязательно.  Если она не используется, ее выкинут из таблицы глобалов. 

sokhib
Offline
Зарегистрирован: 29.08.2016

GarryC пишет:

Как предположение - пока не было присвоения переменной temp1, компилятор не отводил под нее место (она у Вас на используется больше нигде) и промах массива попадал в что то значимое. Когда стали присваивать, выделил место и теперь при промахе попадаета в эту переменную, а ей все по фигу.

так мне далше в этом духе в непоняти програмировать или есть где поменять в коде и пойдет все по логике )))

sokhib
Offline
Зарегистрирован: 29.08.2016

sokhib пишет:

sokhib пишет:

Upper пишет:

Строка 63 приводит в выходу за границу массива

 timing[10] = millis();

но почему когда добовляещ  temp1=Douts[11]; в код работат наченае нормально?

я специално добавил в код temp при настройки устанавливаю 1, и при конце первом цикле устанавливаю 0.

если закоментировать строчку где temp1=Douts[11]; и просмотреть порте temp оотается всегда 1. значить каждый раз все выполняется с нуля

проверил Ваш вариант. закоментировал 53 и 64 строчки убрал задержку но сотавил 63 строчку работает нормально. Пожалуйста обясните в чем косяк?

sokhib
Offline
Зарегистрирован: 29.08.2016

sokhib пишет:

sokhib пишет:

sokhib пишет:

Upper пишет:

Строка 63 приводит в выходу за границу массива

 timing[10] = millis();

но почему когда добовляещ  temp1=Douts[11]; в код работат наченае нормально?

я специално добавил в код temp при настройки устанавливаю 1, и при конце первом цикле устанавливаю 0.

если закоментировать строчку где temp1=Douts[11]; и просмотреть порте temp оотается всегда 1. значить каждый раз все выполняется с нуля

проверил Ваш вариант. закоментировал 53 и 64 строчки убрал задержку но сотавил 63 строчку работает нормально. Пожалуйста обясните в чем косяк?

попробовал timing[10] = millis(); заменить на timing[9] = millis(); и сравнение тоже 

if ((millis() - timing[9])>=500){. заработала. прокоментировайте чтобы эту ошибку не повторять

b707
Offline
Зарегистрирован: 26.05.2017

sokhib пишет:

прокоментировайте чтобы эту ошибку не повторять

ну что тут комментировать-то? Учебник по Си вообще не читал? Нумерация элементов в массиве начинается нуля.

Если обьявлен массив a[10] из десяти элементов, то элементы имеют индексы от a[0] до a[9], элемента a[10]не существует!!!

sokhib
Offline
Зарегистрирован: 29.08.2016

b707 пишет:

sokhib пишет:

прокоментировайте чтобы эту ошибку не повторять

ну что тут комментировать-то? Учебник по Си вообще не читал? Нумерация элементов в массиве начинается нуля.

Если обьявлен массив a[10] из десяти элементов, то элементы имеют индексы от a[0] до a[9], элемента a[10]не существует!!!

Есть такое!!! ))) Спасибо за комент.