Watchdog in Arduino Library - or at least support by bootloader

I think watchdog support is essential for many projects where an Arduino boards performs control functions 24h a day.
Reading many posts in the internet, it seems to be very complicated using Arduino 1.0.1 and the current standard bootloader for the AVR boards to get watchdog functionality working. One issue is, that there is no watchdog function in the Arduino Library that would allow processor-independent implementation of such function; currently, registers have to be set directly. The more severe issue is, that the bootloader does not de-activate the watchdog upon reset, so that one can end up with endless resets. There are patched bootloaders available, but without official Arduino support this remains tricky.
Please, at least starting with the new ARM processor generation of boards, support watchdog with a compatible bootloader. If feasible, dedicated library functions should be added to initialize and reset the watchdog.

I think the added complexity would put off most Arduino adopters.
By the time you've got to the stage of running an Arduino 24/7, the watchdog is a triviality, or, more likely, an irrelevance.

I have had projects running for months at a time, and can count the number of them that have had a watchdog on the fingers of one finger.

... it seems to be very complicated using Arduino 1.0.1 ...

Doesn't seem complicated to me:

#include <avr/wdt.h>

void setup ()
{
  Serial.begin (115200);
  Serial.println ("Restarted.");
  wdt_enable (WDTO_1S);  // reset after one second, if no "pat the dog" received
 }  // end of setup

void loop ()
{
  Serial.println ("Entered loop ...");
  wdt_reset ();  // give me another second to do stuff (pat the dog)
  while (true) ;   // oops, went into a loop
}  // end of loop

You need a bootloader that doesn't get into a loop if you have the watchdog fire, but that is just an issue of uploading the right bootloader.

1 Like

The more severe issue is, that the bootloader does not de-activate the watchdog upon reset, so that one can end up with endless resets.

the official ATmega328 bootloader (optiboot) deactivates the watchdog on reset.
The official MEGA bootloader does not.
I'm not sure about Leonardo or Due.

Yes, but this is nothing to do with this:

One issue is, that there is no watchdog function in the Arduino Library that would allow processor-independent implementation of such function; currently, registers have to be set directly.

My example code did not set registers directly.

I believe Optiboot works OK, the older bootloaders may not.

This statement is not supported:

it seems to be very complicated using Arduino 1.0.1 and the current standard bootloader for the AVR boards to get watchdog functionality working.

It's nothing to do with complexity. It's to do with the bootloader.

Thank you for the hints...with complicated, I just meant, I spent hours in the internet to find out in principle what to do. I know Arduino aims more on beginners than on hackers, but nevertheless, Arduino is usable for serious applications. And watchdog is missing in the libraries.
Main thing is, I agree, to install the proper bootloader. Why does the pre-installed bootloader not deactivate the watchdog? This should not really be a technical problem, is it?
Anyway, do you have a link to a bootloader that officially supports Arduino Sketches on a Mega 2560? Sorry if this is a silly question, but I have no special knowledge which bootloaders are available and which one to use for which application.

Embed:
Thank you for the hints...with complicated, I just meant, I spent hours in the internet to find out in principle what to do. I know Arduino aims more on beginners than on hackers, but nevertheless, Arduino is usable for serious applications. And watchdog is missing in the libraries.

There are other AVR mega chip built-in hardware functions that are not directly supported by the Arduino core libraries. The watchdog is just one of them. Sleep modes, pin change interrupts and others are not directly supported but has had many request to do so. This doesn't prevent a true hacker from accessing them if they study the AVR datasheet and read the existing arduino source code.

Main thing is, I agree, to install the proper bootloader. Why does the pre-installed bootloader not deactivate the watchdog? This should not really be a technical problem, is it?

Because the Arduino core libraries did not use or support WDT functions they saw no need to disable WDT interrupts as part of the bootloader start-up code. Others saw the flaw early on and had posted patched bootloader, such as ADAFRUIT, and made it available for downloading directly to users. The Arduino Co. was slow or reluctant to make the change, and I have no memory of the exact status of current arduino shipping bootloaders are at. I think Uno bootloader supports WDT, but Mega boards still do not?

Anyway, do you have a link to a bootloader that officially supports Arduino Sketches on a Mega 2560? Sorry if this is a silly question, but I have no special knowledge which bootloaders are available and which one to use for which application.

I don't have a link but I pretty sure there is a newer mega2650 bootloader available somewhere that handles the WDT correctly and fixes the !!! bootloader monitor problem.

Embed:
And watchdog is missing in the libraries.

What do you understand by the word "libraries"?

#include <avr/wdt.h>
...
  wdt_enable (WDTO_1S);  // reset after one second, if no "pat the dog" received
...
  wdt_reset ();  // give me another second to do stuff (pat the dog)
...

An include file. A line to enable it. A line to pat the dog. Seems to me to be supported.

And if they release a different processor, they adjust those functions to support the new processor. It seems done to me.

Nick,
I would disagree that is is anywhere close to "done".
Calling this part of "Arduino" is more than a bit of a stretch.
Yes the sketch itself is not directly touching the hardware but this header and these functions
are clearly not part of Arduino. They are AVR specific.

In his original post, Embed was talking about a "watchdog function in the Arduino Library that would allow processor-independent implementation of such function"

The only way to do that is to have an Arduino function wrapper to do this. Which means
it would need to be part of the core code or part of an Arduino library.
Today that simply does not exist.

While it is possible to easily make watchdog work on certain AVR based boards
by using the AVR specific header file and its proprietary function calls,
that fails to meet the OP's original request of having
a portable function that is processor independent.
To make it work, you have to step outside of Arduino and use
architecture specific proprietary functions.
Because of that, I'd say it isn't "done".


In terms of support by the bootloader. I'd call it's lack of support a bug, or
at least an issue related to an unintended oversight, particularly given
it is usually a line or two of code to fix it with no other s/w impact.

--- bill

In terms of support by the bootloader. I'd call it's lack of support a bug, or
at least an issue related to an unintended oversight, particularly given
it is usually a line or two of code to fix it with no other s/w impact.

--- bill

I would certainly agree with that part as they seemed to have 'fixed it" for some bootloaders (Uno for sure) but left the mega bootloaders still with the "WDT bug' as well the now famous mega bootloader !!! 'feature'.

Lefty

"watchdog function in the Arduino Library that would allow processor-independent implementation of such function"

Ah. It depends on whether that means "processor-independent within the AVR family" or "processor-independent within all CPUs that implement an arduino-like library." Usually a watchdog is a pretty architecture-dependent thing; not all chips support the same timeouts, some have a "window" of allowed reset times, etc...
The avr-libc watchdog functions are probably OK for within the AVR family...

question time:

so can I include a watchdog timer in arduino code,

it would be nice on a few bit I'm playing with,
as I'd like the thing to look after itself, go back to a known good state
i.e. a watch dog.

is there an example set of code that I can compile etc to try out,

drjiohnsmith:
is there an example set of code that I can compile etc to try out,

Look back 4 posts. Nick's post (reply #7) shows how to use watchdog for the AVR.

--- bill

thanks

saw the code snippet,

there was some comment about the right boot loader !
what is the right boot loader ? I use the Arduino IDE, is that the right boot loader ?

The bootloader is code stored in flash on the board.
The IDE can be used to burn/update the bootloader on the board
if you have a ISP programmer.

Depending on which bootloader is on the board, watchdog may or may
not work because the older bootloaders don't properly handle
restarting from a watchdog reset.

--- bill

drjiohnsmith:
thanks

saw the code snippet,

there was some comment about the right boot loader !
what is the right boot loader ? I use the Arduino IDE, is that the right boot loader ?

Depends on what board model you have. The latest R3 Uno is OK as shipped.

Lefty

thank you

so question still stands,

I have the off the shelf Arduino IDE, program via the ide / code on the standard arduino boards,
standard boards etc,

I guess like, most people.

do we have an example design I can download, modify and use ?
are you saying I need a different set of boot loader and programer for the arduino ?

A guide would be good please.

drjiohnsmith:
I have the off the shelf Arduino IDE, program via the ide / code on the standard arduino boards,
standard boards etc,

What does that mean?
There are many different versions of the IDE and many different arduino boards as well
as revisions of those boards.

do we have an example design I can download, modify and use ?

I haven't seen one, but then I haven't looked. It is pretty simple to use.
Nick provided an outline of the code you need to make watchdog work.
If you want to know more you can consult the AVR libc manual:
http://www.nongnu.org/avr-libc/user-manual/group__avr__watchdog.html
What is useful on that page are the other timer timeout defines like
WDTO_2S, WDTO_120MS, etc.. So you can see the other timeout values
available.

are you saying I need a different set of boot loader and programer for the arduino ?

Without knowing exactly what you have, it will be impossible to say.

If you have an ISP programmer you can use the 1.x IDE to burn a new optiboot bootloader
into the AVR on your m328 based board that will work with the watchdog timer.
i.e. you can convert your older arduino into a board that will appear to be
an "uno" with optiboot as far as the IDE is concerned.

But depending on what board you have, you may not have to do this.

--- bill

Well, we know "recent UNOs" (perhaps even "all Unos") should have a bootloader that correctly disables the watchdog on RESET. Note that this means that your sketch will not be able to tell that it was restarted by the watchdog (which is occasionally useful.)

And we know that all Arduino MEGAs currently in production have a bootloader that does NOT disable the watchdog.
There's actually a patch for the MEGA bootloader to fix this; it's just not shipping yet.

Official Duemilanove and earlier 28-pin CPUs may or may not work.
There are some third-party bootloaders (ie AdaBoot) that fixed this.

Typical usage of the watchdog would be to do the wdt_enable (WDTO_1S); in setup(), and then call wdt_reset() at the start of loop(). If the loop execution takes longer than (in this case) one second, the watchdog will reset the chip and it will start over.

I'm not sure how much more of an API you'd be able to wrap around this...

thank you west fw.

seems from what I read that it could be construed that arduino is not one product.

to answer an earlier comment, I like the mega, and I have the official IDE that comes from the arduino web site,
as in here

would be nice if there was an example I could use, same as we have examples for things like lcd's in the ide.

how about an example,

suggestions.
print out to rs232 message.
flashes the led, using say delay
that needs say a key to be pressed on the terminal within say 10 seconds,
if you press a key, led stays on for a second,
if you don't press a key in time, program resets

just an idea,
thanks