Watchdog in Arduino Library - or at least support by bootloader

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

I tried testing my simple sketch on page 1 of this thread. It works up to a point, but I must have the "bad" bootloader. Does anyone have a link to one that definitely fixes the watchdog issue? (For the Mega 2560).

drjiohnsmith:
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

http://arduino.cc/en/Main/Software

I think you are not seeing or understanding the need for exactness.

Whether or not the Watchdog reset can be used with your board depends on what you actually have.
More precisely what AVR chip is on your board and what bootloader is installed in that chip.
And if what you have doesn't work, depending on what you have (board, IDE, and ISP programmer),
you can use the IDE or tools that come with the IDE to modify/correct (update)
a bootloader that won't work with watchdog reset to a new bootloader that will.

The information you provided above still does not answer the basic questions of what you actually have
with respect to either s/w or h/w.
Ok, so you "like" the "mega", but is that what you have? And if so, which "mega"?
There is an Arduino "mega" that uses 1280 and one that uses a 2560.
Or do you have some other AVR based Arduino?

And the s/w link you provided, actually has 27 different versions of the IDE that can
be downloaded from that page.
While the latest AVR based s/w version is at the top, that version changes through time
so depending on when you downloaded the "latest" IDE it can be different versions.
The reason that all this is very important is that in the past year there
have been some pretty big changes to the IDE, and the AVR based bootloaders
that ship with the Arduino s/w.

Some of these changes affect whether or not watchdog reset works and how to update
a bootloader that doesn't work with one that does.

--- bill

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

The exact code I posted on page 1 of this thread works, and does pretty-much what you ask. Here it is again:

#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

Tested on the Mega2560 board once I replaced the bootloader with this working one:

https://raw.github.com/arduino/Arduino-stk500v2-bootloader/master/goodHexFiles/stk500boot_v2_mega2560.hex

Output:

Restarted.
Entered loop ...
Restarted.
Entered loop ...
Restarted.
Entered loop ...

Here is an example sketch that shows how to use watchdog reset as a way to
intentionally reset the board.
While having a way to reset the board under software control can be useful, this example
unlike Nick's example, is not a good example of what watchdog reset is often/normally used for.
When using watchdog in the normal way - as in Nick's example,
best programming practice is NOT to do the wdt_reset() in an ISR but in a main loop
as his example shows, since doing it in an ISR will prevent a WDT reset from happening
when the foreground code is stuck in an an unintended loop - which is the entire point of using WDT reset.

--- bill


/*
 * Demonstration of AVR processor reset under software control 
 * since the Arduino core library does not provide a function to do this.
 * While this resets the AVR chip and all its internal registers,
 * it won't reset any of the attached hardware that is external to the AVR chip.
 *
 * Note:
 * This will not work with some of the older versions of the Arduino bootloader
 * as they didn't properly initiliaze the AVR chip for watch dog reset & timeouts.
 * With some older bootloaders it may cause the bootloader to get stuck in a 
 * constant reboot until the chip is power cycled.
 *
 * 2012-17-06  bperrybap - added flush for 1.x arduino to ensure message is sent
 *
 * May 2011 -  bperrybap@opensource.billsworld.billandterrie.com
 */


void setup()
{
	Serial.begin(9600);
	Serial.println("setup()");
}
	
void loop()
{
	Serial.println("Top of loop()");
	for(int x = 3; x ; x--)
	{
		Serial.print(x);
		delay(1000);
	}
	Serial.println("(Reseting Arduino)");
#if ARDUINO > 100
	// force out the serial data as silly 1.x ALWAYS buffers xmits
	// with no way to disable buffering.
	Serial.flush(); 
#endif
	resetArduino(); // reset myself
}

/*
 * Function to cause the AVR to reset
 */
#include <avr/wdt.h>
void resetArduino()
{
	noInterrupts();
	wdt_enable(WDTO_15MS);
	while(1); // wait to die and be reborn....
}

thank you guys,

I uploaded these examples in my arduino mega 2560 and was a fight to get remove them.

FernandoGarcia:
I uploaded these examples in my arduino mega 2560 and was a fight to get remove them.

So you got to see first hand what happens when a bootloader doesn't properly initialize the WDT registers
after a watchdog reset.
Given it is such a simple/easy fix to the bootloader, I don't understand why the Arduino team doesn't
ship an updated bootloader to fix this.

--- bill

I've provided a link above to the fixed one. Replace the file in your current installation, and do an "burn bootloader".

I'm not sure if the fixed one is the one that ships with the IDE, it should be, one would think.