Watchdog in Arduino Library - or at least support by bootloader

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.

I don't support your words.
If the delay() is used, the watchdog will reset all time.
Reset button don't work. I have to power off.

After much searching the web I finally found a optiboot version for the mega1280 board. Tested on two different mega1280 boards a seeeduino and a arduino mega1280. First the the new boards.txt entry to support the new bootloader:

##############################################################

megao.name=Arduino Mega1280 Optiboot
megao.upload.protocol=arduino
megao.upload.maximum_size=130048
megao.upload.speed=115200
megao.bootloader.low_fuses=0xff
megao.bootloader.high_fuses=0xdc
megao.bootloader.extended_fuses=0xf5
megao.bootloader.path=optiboot
megao.bootloader.file=optiboot_atmega1280.hex
megao.bootloader.unlock_bits=0x3F
megao.bootloader.lock_bits=0x0F
megao.build.mcu=atmega1280
megao.build.f_cpu=16000000L
megao.build.core=arduino
megao.build.variant=mega

And the optiboot hex file optiboot_atmega1280.hex
I was able to burn this bootloader using the arduinoISP sketch from IDE 1.0.3, but not using my USBtiny hardware programmer, as it does not work with flash sizes >64KB in size.

:020000000404F6
:020000021000EC
:10FC0000112484B714BE81FFF2D085E08093810077
:10FC100082E08093C00088E18093C10086E08093F9
:10FC2000C20080E18093C4008EE0CBD0279A86E0AA
:10FC300020E33CEF91E0309385002093840096BB55
:10FC4000B09BFECF1F9AA8958150A9F7CC24DD2444
:10FC500099249394A5E0BA2EF1E1AF2EA6D0813479
:10FC600061F4A3D0082FB3D0023811F0013811F499
:10FC700084E001C083E091D08DC0823411F484E12E
:10FC800003C0853419F485E0AAD084C08535A1F479
:10FC90008CD0082F10E089D0E82EFF24FE2CEE2413
:10FCA000E02AF12A8F2D881F8827881F8BBFEE0C32
:10FCB000FF1C8DD067016EC0863521F484E08FD0A3
:10FCC00080E0D9CF843609F042C06FD06ED0082FC3
:10FCD0006CD080E0C81680EED80620F483E0F601F0
:10FCE00087BFE895C0E0D2E060D089930C17E1F7B8
:10FCF000F0E0CF16F0EEDF0620F083E0F60187BFDC
:10FD0000E89565D007B600FCFDCFA601A0E0B2E003
:10FD10002C9130E011968C91119790E0982F8827C4
:10FD2000822B932B1296FA010C0197BEE8951124B1
:10FD30004E5F5F4FF3E0A030BF0751F7F601B7BE4B
:10FD4000E89507B600FCFDCFA7BEE89523C0843731
:10FD5000A1F42BD02AD0E82E28D039D0E6010E2DE0
:10FD6000FE0186911AD021960150D1F70894C11C4A
:10FD7000D11CEA94CE0CD11C0DC0853731F427D0AC
:10FD80008EE10BD087E909D075CF813511F488E079
:10FD900018D01DD080E101D061CF982F8091C00094
:10FDA00085FFFCCF9093C60008958091C00087FF27
:10FDB000FCCF8091C00084FD01C0A8958091C60051
:10FDC0000895E0E6F0E098E1908380830895EDDF08
:10FDD000803219F088E0F5DFFFCF84E1DECF1F939A
:10FDE000182FE3DF1150E9F7F2DF1F91089580E04B
:08FDF000E8DFEE27FF2709946C
:040000031000FC00ED
:00000001FF

And finally a sketch from a poster here on this forum (forgot name, sorry whoever) to test the ability to handle a very short 15 millisec WDT interrupt timeout. Works with Uno but
will 'brick' mega boards with 'stock' bootloaders.
WDT_test.ino

// Test sketch to see if WDT interrupts are handled properly by the bootloader

/*
 Warning Warning Warning this is a semi-destructive test in that
 if your bootloader does not reset WDT interrupts upon starting 
 it will be forced into a tight loop of bootloader starts/WDT resets
 chip/bootloader starts again/lather rinse repeat. One can only
 recover to normal operation by reburning the bootloader with
 a ICSP programmer. If this sketch runs properly on a chip with a WDT aware bootloader,
 you will see continuous serial output on the serial monitor.

Note that current arduino mega boards will fail this test and brick

*/

// Code from arduino forum poster (sorry name not remembered) 1/11/13

#include <avr/wdt.h>

void setup(){
  Serial.begin(57600);
  delay(100);
  Serial.println("Hello world");
  wdt_enable(WDTO_15MS);
}

void loop(){
  Serial.println("I am going to not get stuck..");
  for(int x=0; x<100; x++) {
    wdt_reset();
    x++;
    delay(10);
  }
  wdt_reset();
  Serial.println("I am going to get stuck now..");
  for(int x=0; 1; x++) {
    delay(10);
  }
}

Lefty

stevemeng:
I don't support your words.
If the delay() is used, the watchdog will reset all time.
Reset button don't work. I have to power off.

It's a bug in the bootloader, not the sketch. If you change the fuse to load the sketch (and bypass the bootloader) it will work correctly. Or, better, get a bootloader that handles the WDT correctly.

Regarding "
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
"

I found another bootloader (which seems to be the one installed with the Arduino IDE) under
https://github.com/arduino/Arduino/tree/master/hardware/arduino/
bootloaders/stk500v2/stk500boot_v2_mega2560.hex

It has the same file name as "this working one", but its size is 103kB versus 21kB for the other.
Obviously, these are different bootloaders, and should have a different version, means e.g. stk500boot_v3_mega2560.hex for the working one. Besides of this, what are the differences between the two, other than watchdog support?

Thanks Nick to have solved the problem for the Mega2560 (now only the correctly working bootloader should be delivered with new Mega 2560 and new versions of the IDE).

Meanwhile, I have ordered the new Arduino Due. Has anyone yet successfully used watchdog with this one? Means, does the standard Due bootloader support watchdog, and what are the equivalent lines of code for the SAM3XE8 in the Arduino IDE?

I don't know, I suggest you post this question in the Due part of the forum.

Obviously, these are different bootloaders, and should have a different version, means e.g. stk500boot_v3_mega2560.hex for the working one.

"Stk500v2" is the name of the protocol supported by this bootloader, the v2 is NOT the version of bootloader itself.
I don't think that there is a separate version number for the bootloader. Although that WOULD be a good idea.
(Hmm. It does have the date that the code was compiled:

Bootloader>? CPU stats
Arduino explorer stk500V2 by MLS
Compiled on = Jan 28 2013

)

but its size is 103kB versus 21kB for the other.

Um? Not that I could see.
https://github.com/arduino/Arduino/blob/master/hardware/arduino/bootloaders/stk500v2/stk500boot_v2_mega2560.hex shows as "514 lines (513 sloc) 22.989 kb"
While the newer code at Arduino-stk500v2-bootloader/stk500boot_v2_mega2560.hex at master · arduino/Arduino-stk500v2-bootloader · GitHub shows as "file 469 lines (468 sloc) 20.964 kb "
Perhaps you were comparing HTML pretty-printed web page against 'raw' file size?

Embed:
It has the same file name as "this working one", but its size is 103kB versus 21kB for the other.

We have to take that with a grain of salt, as the maximum size of the bootloader on the Mega2560 is 8K bytes (see datasheet, page 330).

The idea that a chip with 256 Kb of program memory would have a 103 Kb bootloader is, if I may say, laughable.

Well, size of the .hex file will always be somewhat more than twice the size of the actual code...
20k is a reasonable .hex file size for an 8k bootloader.

hello, I need the strech by bluetooth shit, and I get it, but I must be attentive to press the reset arduino-one.

when bleutooch connects, there squeezed reset and this loads the strech.

I tried to use the wacthdog, when this is connected to a reset,
but I can not load the strech, someone has done something similar to what
comment?

#include <avr/wdt.h>

int led = 9;           // the pin that the LED is attached to
int brightness = 0;    // how bright the LED is
int fadeAmount = 5;    // how many points to fade the LED by
void setup ()
{
  Serial.begin (115200);
    pinMode(led, OUTPUT);

//  Serial.println ("Restarted.");
while(!Serial){
  ;
}  
wdt_reset ();   
wdt_disable();

 }  // end of setup

void loop ()
{


analogWrite(led, brightness);    

  // change the brightness for next time through the loop:
  brightness = brightness + fadeAmount;

  // reverse the direction of the fading at the ends of the fade: 
  if (brightness == 0 || brightness == 255) {
    fadeAmount = -fadeAmount ; 
  }     
  // wait for 30 milliseconds to see the dimming effect    
  delay(30);   





  
}  // end of loop

http://www.ebay.com/itm/Wireless-Bluetooth-Transceiver-Module-RS232-TTL-/200520318414?_trksid=p2047675.m1850&_trkparms=aid%3D222002%26algo%3DSIC.FIT%26ao%3D1%26asc%3D11%26meid%3D6299423035725889752%26pid%3D100011%26prg%3D1005%26rk%3D4%26sd%3D320968741708%26

Nick,
re: Regarding "
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"

Do you know if this is the bootloader in the Arduino 1.04 IDE release?

I've been battling dropped ethernet connection on my webserver application for weeks. It occurs anywhere from hours to days. The application continues to run, but over time, a client will not be able to connect. I have a Mega2560 and want to implement watchdog timer based on your example. The code verifies, but I haven't uploaded it yet to test based on the comments on this post (the need to replace the bootloader)

Is your recommendation of the bootloader you specified still valid? Any help is appreciated.

Thanks,
Rich

There seem to be two booloader files shipping with 1.04 namely:

// File =  Mega2560-prod-firmware-2011-06-29.hex
// Loader start: 3E000, length: 8192
// MD5 sum = 1E 35 14 08 1F 65 7F 8C 96 50 69 9F 19 1E 3D F0 

// File =  stk500boot_v2_mega2560.hex
// Loader start: 3E000, length: 8192
// MD5 sum = D9 E6 6B 4E D1 A6 11 2C 61 8F 9B D5 5D 24 E2 13

However neither has the MD5 sum of the one that I found to work namely:

// File =  stk500boot_v2_mega2560_fixes_watchdog_problem.hex
// Loader start: 3E000, length: 8192
// MD5 sum = 8A F4 7A 29 43 A0 D8 7C DB ED 09 A3 8F 40 24 1E

I would still recommend the "fixed" one from:

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

Nick, thanks for your reply. Ummmm... how do I actually load this? Using the Arduino IDE under tools->Burn Bootloader ? Obviously from my question I've never done this and would appreciate pointing me in the right direction. Is there documentation you could site? All I could find in http://arduino.cc/en/Guide/Environment using IDE tools->Burn Bootloader is:
"Ensure that you've selected the correct board from the Boards menu before burning the bootloader."

Thanks in advance.
Rich

You need an external device. A board can't burn its own bootloader. If you have a second Arduino one option is the sketch described here:

Using the IDE you also need another device, such as another Arduino with the "Arduino as ISP" sketch on it, or a programmer like USBtinyISP or similar. These are available from places like Adafruit, Sparkfun, eBay, etc.

Nick, thanks for your reply. I do have another Arduino ( Uno, rev 3). I reviewed the sketch you specified in your reply. To other readers... Nick's reply is more then just a sketch, it's a tutorial on how to burn a new bootloader using a second arduino.
Question: before doing this, is there any harm in testing the sketch you listed on page 1 with my existing bootloader? If my bootloader (by chance) were correct, I would get the results listed on page 2 ,your Reply #22 . If not, what will occur? It won't brick my Mega will it? What happened when you ran with the "bad" bootloader, Reply #20?
I'm asking because of FernandoGarcia 's reply #25 "I uploaded these examples in my arduino mega 2560 and was a fight to get remove them." as well as RetroLefty's post #29 example code comment: "Note that current arduino mega boards will fail this test and brick". Yikes!
To restate my environment: Mega2560, Arduino IDE 1.0.4

thanks
Rich

richsp51:
Question: before doing this, is there any harm in testing the sketch you listed on page 1 with my existing bootloader? If my bootloader (by chance) were correct, I would get the results listed on page 2 ,your Reply #22 . If not, what will occur? It won't brick my Mega will it? What happened when you ran with the "bad" bootloader, Reply #20?

First, there are ways around a "bricked" processor, particularly this type of bricking. The problem is that the sketch runs, sets up the watchdog timer, and the watchdog then interrupts the bootloader.

The trick is to not let the sketch run. You power the board off completely, hold down reset, keep holding down reset you apply power (plug the USB cable in). At this stage the sketch hasn't run (you have reset held down). Now with a free hand (this can be the tricky bit) you start uploading a fresh sketch. As it starts to upload you release reset (and not before), and the bootloader kicks in, without having the watchdog timer enabled.

Or, you simply use things like my bootloader uploader to simply replace the bootloader which has the side-effect of erasing program memory, and thus erasing the problem sketch. So you have two ways around it.

pls check this:

Arduino Mini 328
no delay() befero wdt_enable(), and one wdt_reset() just after wdt_enable() and another wdt_reset() in first line in loop();

like this:
void setup()
{
wdt_enable(WDTO_4S);
wdt_reset();
}
void loop()
{
wdt_reset ();
while(1)
{
//user loop
}
}

Nick,

Is there a source that documents which Arduinos have what bootloader?

Specfically, I would like to know whether a standard Leonardo will work with a watchdog timer?

Thanks so much
Gerrie