Зависание в цикле while - кривой код или что то я не так делаю?

Crazyigels

✩✩✩✩✩✩✩
25 Авг 2020
2
0
Доброго дня!

Странно ведет себя код - выполняется цикл while 15 раз и зависает - начинает мигать встроенным LED с большой частотой. Не реагирует пока не перезапустишь. Не важно - подключена периферия или нет - поведение одинаково. И платы разные пробовал - поведение одинаково.

отдельно цикл WHILE в отдельном скетче - работает отлично. А тут - висит.
Не пойму в чем ошибка.
C++:
#include <EEPROM.h> // работа с еепром
#include "GyverButton.h" // работа с кнопками
#include "GyverTimer.h"  // таймера 
#include "GyverWDT.h" // сторожевой таймер

// Описание интерфейсных каналов


#define Sensor_top A0 // Верхняя мертвая точка привода
#define Cassete A1 // датчик кассеты
#define Sensor_left A2 // датчик правого болта
#define Sensor_right A3 // датчик левого болта

#define Cassete_valve 12 // калапан подачи кассеты
#define Vint_feed 11 // подача винтов
#define Pusk 10 // пуск цикла

#define Press_Start_LED 9 // светодиод СТАРТ
#define Insert_cassete_LED 8 // светодиод вставь кассету
#define Remove_bolt_LED 7 // светодиод извлеки болт
#define Work_LED 6 // светодиод Работа

#define Button 5 // кнопка Старт



// таймера
// создаём таймеры в миллисекундах
//GTimer timer (MS, 500); // таймер  0.5 сек 




// инициализация кнопок
GButton Start_button(5);

// Описание переменных

int t=0;
int flag=0;

// переменные настроек, хранятся в EEPROM 





void setup() {

//timer.start(); // старт таймера






// опрос кнопок - автоматически
Start_button.setTickMode(AUTO);

  
  

// Включили последовательный порт
Serial.begin(9600);


pinMode (Sensor_top, INPUT_PULLUP); // Верхняя мертвая точка привода
pinMode (Cassete, INPUT_PULLUP);  // датчик кассеты
pinMode (Sensor_left, INPUT_PULLUP);  // датчик правого болта
pinMode (Sensor_right, INPUT_PULLUP);  // датчик левого болта

pinMode (Cassete_valve,OUTPUT);  // калапан подачи кассеты
pinMode (Vint_feed,OUTPUT);  // подача винтов
pinMode (Pusk,OUTPUT); // пуск цикла

pinMode (Press_Start_LED,OUTPUT);  // светодиод СТАРТ
pinMode (Insert_cassete_LED,OUTPUT);  // светодиод вставь кассету
pinMode (Remove_bolt_LED,OUTPUT);  // светодиод извлеки болт
pinMode (Work_LED,OUTPUT);  // светодиод Работа

pinMode (Button, INPUT_PULLUP); // кнопка Старт


Watchdog.enable(RESET_MODE, WDT_PRESCALER_512); // Режим сторжевого сброса , таймаут ~4с

Serial.println("ready");
mig(5);
startup();

}

void loop() {

if (digitalRead(Cassete)==LOW)  // Если сработал датчик кассеты
{
Serial.println("Cassete on");
}   

if (digitalRead(Sensor_left)==LOW)  // Если сработал датчик кассеты
{
Serial.println("Left_on");
}   

if (digitalRead(Sensor_right)==LOW)  // Если сработал датчик кассеты
{
Serial.println("Right_on");
}   



 if (Start_button.isClick())
 {
                 mig (10);
                   

 
 }                  


 Watchdog.reset(); // Переодический сброс watchdog, означающий, что устройство не зависло

} // КОНЕЦ ОСНОВНОГО ЦИКЛА


void mig(int x)
{
     for (int i=0; i <= x; i++){
      digitalWrite(Work_LED, HIGH); 
      delay (200);
      digitalWrite(Work_LED, LOW); 
      delay (200);
     }
}


void startup()
{

Serial.println("check1");
if (digitalRead(Sensor_left)==HIGH  || digitalRead(Sensor_right)==HIGH) //если есть болт слева или болт справа
  {
Serial.println("check2");
digitalWrite(Remove_bolt_LED, HIGH);
Serial.println("check2.5");
  }


while (t<1000){
delay(100);
Serial.println("check3");
Serial.println(t);
//if (t=1000)  flag=1;
t=t+1;
}


flag=0;

Serial.println("check4");

}
По меткам check - проходит все этапы, и висит 15 раз выполнив цикл while
Собственно в цикле должно быть ожидание срабатывания датчиков, выкинул - думал что что то с обработчиком не так, но даже просто считать до 1000 это зараза не хочет.

Где мой косяк?
Спасибо.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,272
1,303
Москва
Watchdog.enable(RESET_MODE, WDT_PRESCALER_512); // Режим сторжевого сброса , таймаут ~4с

А не должен ли срабатывать сторож за 100 секунд ?

Вот это где то внутрь цикла зависающего поставить надо
Watchdog.reset(); // Переодический сброс watchdog, означающий, что устройство не зависло
 
  • Лойс +1
Реакции: Crazyigels