[ Solved Just !!! bug] WDT+sleep sketch upload: MEGA2560 hangs VS. UNO no proble

[Summary] Code won't load to arduino MEGA. It turns out one string has a "!!!" in it, which prevents the code from loading. The bug only exists in older Arduino board with older bootloaders.

I have this issue: If I upload blink or longer code to my MEGA2560, it works. If I upload a watch dog timer sleep sketch (see below), which is not long, it will hang in the middle of the upload. I have two mega boards and they do this both. I wonder if this has anything to do with the WDT or sleep code. I tested the code on uno and it works fine. I wonder if the arduino abstraction has once again bit my rear or not. I'm sure it's something rather stupid. I later added disabling and reenabling interrupt around the WDT setup but still can't upload to MEGA.

/*
 * Sketch for testing sleep mode with wake up on WDT.
 * Donal Morrissey - 2011.
 *
 */
#include <avr/sleep.h>
#include <avr/power.h>
#include <avr/wdt.h>

#define LED_PIN (13)

volatile int f_wdt=1;



/***************************************************
 *  Name:        ISR(WDT_vect)
 *
 *  Returns:     Nothing.
 *
 *  Parameters:  None.
 *
 *  Description: Watchdog Interrupt Service. This
 *               is executed when watchdog timed out.
 *
 ***************************************************/
ISR(WDT_vect)
{
  if(f_wdt == 0)
  {
    f_wdt=1;
  }
  else
  {
    Serial.println("WDT Overrun!!!");
  }
}


/***************************************************
 *  Name:        enterSleep
 *
 *  Returns:     Nothing.
 *
 *  Parameters:  None.
 *
 *  Description: Enters the arduino into sleep mode.
 *
 ***************************************************/
void enterSleep(void)
{
  set_sleep_mode(SLEEP_MODE_PWR_SAVE);   /* EDIT: could also use SLEEP_MODE_PWR_DOWN for lowest power consumption. */
  sleep_enable();
  
  /* Now enter sleep mode. */
  sleep_mode();
  
  /* The program will continue from here after the WDT timeout*/
  sleep_disable(); /* First thing to do is disable sleep. */
  
  /* Re-enable the peripherals. */
  power_all_enable();
}



/***************************************************
 *  Name:        setup
 *
 *  Returns:     Nothing.
 *
 *  Parameters:  None.
 *
 *  Description: Setup for the serial comms and the
 *                Watch dog timeout. 
 *
 ***************************************************/
void setup()
{
  Serial.begin(9600);
  Serial.println("Initialising...");
  delay(100); //Allow for serial print to complete.

  pinMode(LED_PIN,OUTPUT);

  /*** Setup the WDT ***/
  
  /* Clear the reset flag. */
  MCUSR &= ~(1<<WDRF);
  
  /* In order to change WDE or the prescaler, we need to
   * set WDCE (This will allow updates for 4 clock cycles).
   */
  WDTCSR |= (1<<WDCE) | (1<<WDE);

  /* set new watchdog timeout prescaler value */
  WDTCSR = 1<<WDP0 | 1<<WDP3; /* 8.0 seconds */
  
  /* Enable the WD interrupt (note no reset). */
  WDTCSR |= _BV(WDIE);

  Serial.println("Initialisation complete.");
  delay(100); //Allow for serial print to complete.
}



/***************************************************
 *  Name:        enterSleep
 *
 *  Returns:     Nothing.
 *
 *  Parameters:  None.
 *
 *  Description: Main application loop.
 *
 ***************************************************/
void loop()
{
  if(f_wdt == 1)
  {
    /* Toggle the LED */
    digitalWrite(LED_PIN, !digitalRead(LED_PIN));
    
    /* Don't forget to clear the flag. */
    f_wdt = 0;
    
    /* Re-enter sleep mode. */
    enterSleep();
  }
  else
  {
    /* Do nothing. */
  }
}

2560 doc has this code blurb:

void WDT_off(void)
{
__disable_interrupt();
__watchdog_reset();
/* Clear WDRF in MCUSR */
MCUSR &= ~(1<<WDRF);
/* Write logical one to WDCE and WDE */
/* Keep old prescaler setting to prevent unintentional time-out
*/
WDTCSR |= (1<<WDCE) | (1<<WDE);
/* Turn off WDT */
WDTCSR = 0x00;
__enable_interrupt();
}

I don't know what header to include to define __watchdog_reset().
I also get the core.a exists error once in a while when compiling code.

Log:

C:\Arduino\arduino-1.6.5-r2\hardware\tools\avr/bin/avrdude -CC:\Arduino\arduino-1.6.5-r2\hardware\tools\avr/etc/avrdude.conf -v -patmega2560 -cwiring -PCOM12 -b115200 -D -Uflash:w:C:\Users\ZENGQI~1\AppData\Local\Temp\build731221977736597301.tmp/WDT_sleep_sample.cpp.hex:i 

avrdude: Version 6.0.1, compiled on Apr 15 2015 at 19:59:58
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2009 Joerg Wunsch

         System wide configuration file is "C:\Arduino\arduino-1.6.5-r2\hardware\tools\avr/etc/avrdude.conf"

         Using Port                    : COM12
         Using Programmer              : wiring
         Overriding Baud Rate          : 115200
         AVR Part                      : ATmega2560
         Chip Erase delay              : 9000 us
         PAGEL                         : PD7
         BS2                           : PA0
         RESET disposition             : dedicated
         RETRY pulse                   : SCK
         serial program mode           : yes
         parallel program mode         : yes
         Timeout                       : 200
         StabDelay                     : 100
         CmdexeDelay                   : 25
         SyncLoops                     : 32
         ByteDelay                     : 0
         PollIndex                     : 3
         PollValue                     : 0x53
         Memory Detail                 :

                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           eeprom        65    10     8    0 no       4096    8      0  9000  9000 0x00 0x00
           flash         65    10   256    0 yes    262144  256   1024  4500  4500 0x00 0x00
           lfuse          0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
           hfuse          0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
           efuse          0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
           lock           0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
           calibration    0     0     0    0 no          1    0      0     0     0 0x00 0x00
           signature      0     0     0    0 no          3    0      0     0     0 0x00 0x00

         Programmer Type : Wiring
         Description     : Wiring
         Programmer Model: AVRISP
         Hardware Version: 15
         Firmware Version Master : 2.10
         Vtarget         : 0.0 V
         SCK period      : 43.5 us

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.01s

avrdude: Device signature = 0x1e9801
avrdude: reading input file "C:\Users\ZENGQI~1\AppData\Local\Temp\build731221977736597301.tmp/WDT_sleep_sample.cpp.hex"
avrdude: writing flash (3342 bytes):

Writing | ##########################################avrdude: stk500v2_ReceiveMessage(): timeout

I pinpointed the problem to be the ISR(WDT_vect) function or macro. Having it makes the mega hang at code upload. Removing it makes the code upload normally. There must be some issue in calculate where this code is stored and the wrong address may hang the bootloader.

So should I do something special to ISR(WDT_vect), like put it in the end or something?

Serial.print in an ISR?

I suspect the !!! bug. If it is the bootloader has to be updated.

jboyton:
Serial.print in an ISR?

It was the original code I got from a blog. It's not running unless the main code somehow missed a watchdog interrupt. I'll remove it then.

I didn't even bother looking that way! I thought something stupid was at play. Thank you!
Why people are so excited, triple-exclamation their messages is a bit beyond me :slight_smile:
Yes, I may have to update my MEGA clones. They are from way back when(?).

Or just remove one of the three exclamation points from that string you're trying to print? :wink: (at least as an interim measure)

Wow, cool bug!!!

If by "cool" you mean "painful" then yes, yes it is cool.

Or some non-chargeable consulting hours, yes. I will update my bootloaders. The UNO has optiboot.

Thank you for the follow-up.