Why watchdog not working with MySensors?
-
Hello,
I faced with the same issue like https://forum.mysensors.org/topic/9946/watchdog-not-watchdogging/1
MySensor ver 2.3.1
Optiboot ver 8.0
atmega328, 8MHz
I have tested two codes on the one board and the result is bellow.
This test code works well. Watchdog is working and Atmega is rebooting.#include <Arduino.h> #include <avr/wdt.h> #define STATUS_LED_PIN A2 void setup() { wdt_disable(); Serial.begin(9600); Serial.println("Setup.."); pinMode(STATUS_LED_PIN, OUTPUT); digitalWrite(STATUS_LED_PIN, 0); Serial.println("Wait 5 sec.."); delay(5000); wdt_enable (WDTO_8S); Serial.println("Watchdog enabled."); } int timer = 0; void loop(){ if(!(millis()%1000)){ timer++; Serial.println(timer); digitalWrite(STATUS_LED_PIN, digitalRead(STATUS_LED_PIN)==1?0:1); delay(1); } //wdt_reset(); }
But this code is not working. Watchdog is not working.
#include <Arduino.h> #include <avr/wdt.h> // RFM95 #define MY_RADIO_RFM95 //#define MY_DEBUG_VERBOSE_RFM95 #define MY_RFM95_FREQUENCY (RFM95_868MHZ) #define MY_RFM95_MODEM_CONFIGRUATION RFM95_BW125CR45SF128 #define MY_NODE_ID 10 #define MY_PARENT_NODE_ID 0 #define MY_PARENT_NODE_IS_STATIC #include <MySensors.h> #define STATUS_LED_PIN A2 void setup() { wdt_disable(); Serial.begin(9600); Serial.println("Setup.."); pinMode(STATUS_LED_PIN, OUTPUT); digitalWrite(STATUS_LED_PIN, 0); Serial.println("Wait 5 sec.."); delay(5000); wdt_enable (WDTO_8S); Serial.println("Watchdog enabled."); } int timer = 0; void loop(){ if(!(millis()%1000)){ timer++; Serial.println(timer); digitalWrite(STATUS_LED_PIN, digitalRead(STATUS_LED_PIN)==1?0:1); delay(1); } //wdt_reset(); }
What I am doing wrong?
-
@dmytro-zadvornov MySensors will automatically reset the watchdog every time loop is exited.
-
@mfalkvidd Thx for you answer.
If I understand you right MySensor has implicit call wdt_reset()?
And in this case this new code will reboot.#include <Arduino.h> #include <avr/wdt.h> // RFM95 #define MY_RADIO_RFM95 //#define MY_DEBUG_VERBOSE_RFM95 #define MY_RFM95_FREQUENCY (RFM95_868MHZ) #define MY_RFM95_MODEM_CONFIGRUATION RFM95_BW125CR45SF128 #define MY_NODE_ID 10 #define MY_PARENT_NODE_ID 0 #define MY_PARENT_NODE_IS_STATIC #include <MySensors.h> #define STATUS_LED_PIN A2 void setup() { wdt_disable(); Serial.begin(9600); Serial.println("Setup.."); pinMode(STATUS_LED_PIN, OUTPUT); digitalWrite(STATUS_LED_PIN, 0); Serial.println("Wait 5 sec.."); delay(5000); wdt_enable (WDTO_8S); Serial.println("Watchdog enabled."); } int timer = 0; void loop(){ if(!(millis()%1000)){ timer++; Serial.println(timer); digitalWrite(STATUS_LED_PIN, digitalRead(STATUS_LED_PIN)==1?0:1); delay(1); } delay(20000); //wdt_reset(); }
I will try it later
-
@dmytro-zadvornov delay will also reset the watchdog
-
Hi,
I have tried last code, and it works - the watchdog reboot MC. As expected.@mfalkvidd Why you think delay() should reset the watchdog?
-
@dmytro-zadvornov thanks for reporting back.
Sorry for my mistake. I thought most platforms called yield() inside delay(), and yield() usually resets the watchdog. Example https://github.com/arduino/ArduinoCore-avr/blob/b7c607663fecc232e598f2c0acf419ceb0b7078c/cores/arduino/wiring.c#L106
But since your test shows that the watchdog is tripped, the watchdog is not reset inside delay().https://github.com/arduino/ArduinoCore-avr/blob/b7c607663fecc232e598f2c0acf419ceb0b7078c/cores/arduino/Arduino.h#L38 shows that avr does not reset watchdog in yield().