Как определить причину перезагрузки Arduino UNO WatchDog

ArduinoUser
Offline
Зарегистрирован: 05.12.2016

Доброго всем времени суток. Стоит задача: при перезагрузки через срабатывание сторожевого таймера должна виполнятся одна часть кода, а при перезагрузки через подачу питания - еще одна дополнительная функция.

#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
 
 
Подскажите пожалуйста как решить даную проблему
toc
Offline
Зарегистрирован: 09.02.2013

по-моему, бутлоадер ардуины влияет. Попробуйте удалить его.

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

ArduinoUser пишет:

Можно ли подробнее объяснить почему вы так решили?
 

потому что это общеизвестный факт - бутлоадер сбрасывает регистр MCUSR.

Чтобы удалить бут - достаточно один раз прошить любой скетч через программатор.