Как определить причину перезагрузки Arduino UNO WatchDog
- Войдите на сайт для отправки комментариев
Ср, 18/07/2018 - 15:06
Доброго всем времени суток. Стоит задача: при перезагрузки через срабатывание сторожевого таймера должна виполнятся одна часть кода, а при перезагрузки через подачу питания - еще одна дополнительная функция.
#include <avr/wdt.h>
bool WD_RST = false; // true - произошло срабатывание сторожевого таймера
bool BO_RST = false; // true - сработала защита от слишком низкого напряжения питания
bool EXT_RST = false; // true - внешний сигнал RESET
bool PON_RST = false; // true - подача питания
void setup() {
wdt_disable(); // Отключаем сторожевой таймер
WD_RST = MCUSR & B00001000; // срабатывание сторожевого таймера
BO_RST = MCUSR & B00000100; // защита от падения напряжения
EXT_RST = MCUSR & B00000010; // сигнал сброса
PON_RST = MCUSR & B00000001; // подача питания
MCUSR = MCUSR & B11110000; // Сбрасываем значения прочитанных битов
wdt_enable(WDTO_8S); // Активируем сторожевой таймер на 8 секунд
Serial.begin(9600);
Serial.println("start program");
}
void loop() {
if (PON_RST == true) {Serial.println("PON_RST = true");}
if (WD_RST == true) {Serial.println("WD_RST = true");}
else {Serial.println("doesn't work");}
wdt_reset(); //сброс сторожевого таймера
delay(1000);
//------------------- первірка роботи таймера WDT ------------------------------------
if ( Serial.available() != 0 ) delay(10000); // проверка таймера
}
При первой загрузке в мониор порта выводится напись
start program
doesn't work
doesn't work
doesn't work
doesn't work
После посылки символа в порт срабативает вачдог, но напись виводиться та же, что свидетельствует об неправильном считивании регистра MCUSR.
start program
doesn't work
doesn't work
doesn't work
doesn't work
start program
doesn't work
doesn't work
Подскажите пожалуйста как решить даную проблему
по-моему, бутлоадер ардуины влияет. Попробуйте удалить его.
Можно ли подробнее объяснить почему вы так решили?
потому что это общеизвестный факт - бутлоадер сбрасывает регистр MCUSR.
Чтобы удалить бут - достаточно один раз прошить любой скетч через программатор.