Здравствуйте!
Бывает так, что программа зависает (подвисает) или наоборот - строки 22,23 отрабатывают с огромной скоростью.
Похоже, что портится переменная moment. (Скетч1)
Почему она портится - задам вопрос в новой теме, где выложу полный скетч.
Скетч1
bool trigger;
int st;
void setup()
{
pinMode(13, OUTPUT);
Serial.begin(9600);
}
void loop()
{
static uint32_t period = 500;
static uint32_t moment;
if (millis() - moment >= period)
{
moment = moment + period; // благословенная строка
trigger = !trigger;
// далее бывает вот что:
// 1. диод мерцает, вывод в порт с огромной скоростью
// 2. диод светится или погашен, вывода в порт НЕТ
digitalWrite(13, trigger);
Serial.println(st);
}
}
Так вот. Если по какой-то причине программа зависла, то с помощью WatchDog легко организоавать ее перезагрузку.
А можно ли организовать перезагрузку следующим образом (Скетч2), если строки 22,23 отрабатывают с огромной скоростью?
Скетч2
#include <avr/wdt.h>
bool trigger;
int st;
unsigned long t1, t2;
bool flag = true; // разрешается wdt_reset()
void setup()
{
pinMode(13, OUTPUT);
Serial.begin(9600);
t1 = millis();
t2 = t1 + 5000;
wdt_enable (WDTO_8S);
}
int timer = 0;
void loop()
{
static uint32_t period = 500;
static uint32_t moment;
if (millis() - moment >= period)
{
moment = moment + period; // благословенная строка
trigger = !trigger;
// далее бывает вот что:
// 1. диод мерцает, вывод в порт с огромной скоростью
// 2. диод светится или погашен, вывода в порт НЕТ
digitalWrite(13, trigger);
Serial.println(st);
// определение времени между соседними проходами
t2 = millis();
if (t2 - t1 < 250) // если это время меньше period, запрет wdt_reset()
{
flag = false;
}
else
{
t1 = millis(); // все нормально
}
if (flag)
{
wdt_reset();
}
}
}
Спасибо!