Ардуино циклический опрос и масивы
- Войдите на сайт для отправки комментариев
Ср, 29/12/2021 - 14:49
Доброго времени суток . написал код и не пройму что творится!! для ардуино мега. если закоментировать 32 строку (подписана как эту строку) контроллер каждий раз перезагружается. Вчем причина не могу понять
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;} }Строка 63 приводит в выходу за границу массива
timing[10] = millis();
Строка 63 приводит в выходу за границу массива
timing[10] = millis();
но почему когда добовляещ temp1=Douts[11]; в код работат наченае нормально?
Строка 63 приводит в выходу за границу массива
timing[10] = millis();
но почему когда добовляещ temp1=Douts[11]; в код работат наченае нормально?
я специално добавил в код temp при настройки устанавливаю 1, и при конце первом цикле устанавливаю 0.
если закоментировать строчку где temp1=Douts[11]; и просмотреть порте temp оотается всегда 1. значить каждый раз все выполняется с нуля
но почему когда добовляещ temp1=Douts[11]; в код работат наченае нормально?
Трагическая случайность.
Как предположение - пока не было присвоения переменной temp1, компилятор не отводил под нее место (она у Вас на используется больше нигде) и промах массива попадал в что то значимое. Когда стали присваивать, выделил место и теперь при промахе попадаета в эту переменную, а ей все по фигу.
Как предположение - пока не было присвоения переменной temp1, компилятор не отводил под нее место (она у Вас на используется больше нигде) и промах массива попадал в что то значимое. Когда стали присваивать, выделил место и теперь при промахе попадаета в эту переменную, а ей все по фигу.
Не катит.
Переменная объявлена глобально, ее не обязательно сразу инициализировать, память под нее выделится
Не обязательно. Если она не используется, ее выкинут из таблицы глобалов.
Как предположение - пока не было присвоения переменной temp1, компилятор не отводил под нее место (она у Вас на используется больше нигде) и промах массива попадал в что то значимое. Когда стали присваивать, выделил место и теперь при промахе попадаета в эту переменную, а ей все по фигу.
Строка 63 приводит в выходу за границу массива
timing[10] = millis();
но почему когда добовляещ temp1=Douts[11]; в код работат наченае нормально?
я специално добавил в код temp при настройки устанавливаю 1, и при конце первом цикле устанавливаю 0.
если закоментировать строчку где temp1=Douts[11]; и просмотреть порте temp оотается всегда 1. значить каждый раз все выполняется с нуля
Строка 63 приводит в выходу за границу массива
timing[10] = millis();
но почему когда добовляещ temp1=Douts[11]; в код работат наченае нормально?
я специално добавил в код temp при настройки устанавливаю 1, и при конце первом цикле устанавливаю 0.
если закоментировать строчку где temp1=Douts[11]; и просмотреть порте temp оотается всегда 1. значить каждый раз все выполняется с нуля
if ((millis() - timing[9])>=500){. заработала. прокоментировайте чтобы эту ошибку не повторять
прокоментировайте чтобы эту ошибку не повторять
ну что тут комментировать-то? Учебник по Си вообще не читал? Нумерация элементов в массиве начинается нуля.
Если обьявлен массив a[10] из десяти элементов, то элементы имеют индексы от a[0] до a[9], элемента a[10]не существует!!!
прокоментировайте чтобы эту ошибку не повторять
ну что тут комментировать-то? Учебник по Си вообще не читал? Нумерация элементов в массиве начинается нуля.
Если обьявлен массив a[10] из десяти элементов, то элементы имеют индексы от a[0] до a[9], элемента a[10]не существует!!!