Has anyone EVER uploaded more than 30k sketch to a Mega 2560 or ADK?

Jeepdude2009:
I guess my main question is...has anyone EVER been able to upload more than 30k to a Mega 2560 or ADK directly from the factory?

Yes. Me.

I don't know what a bootloader is and I don't know what everybody else is talking about, but I don't have a problem either. After a few weeks I moved from Uno to Mega for the same reason as you, and my project is about 47k.

The only problem I can understand happening is caused by forgetting to reconfigure the IDE. I have had is because I still use the Uno occasionally and thus need to have the IDE confugured accordingly. I believe it is possible to write a programme for Mega OK when when the IDE is configured for Uno, but it will not load, even if a Mega is connected. You make no mention of the IDE or its configuration, so maybe that is happening to you.

The matter could be compounded by the USB port. The choice of port by the PC seems to be by chance and I guess you could have Uno and Mega on the same port. I would consider this an advantage, but it might compound the confusion if yours are the same.

There have been times when the upload is very slow and I have even been obliged to save and start over.

The choice of port by the PC seems to be by chance and I guess you could have Uno and Mega on the same port. I would consider this an advantage, but it might compound the confusion if yours are the same.

It's not by chance and any specific PC will not assign the same comm port to any Uno board and a mega2560 board. The comm port number doesn't 'move' with the board when moving from one PC to another PC. It's all about the first time a specific board is plugged into a specific PC for the first time, that is when a comm port number is associated with that board but only for that specific PC. If you use one USB serial cable to plug into many different standalone 328 based 'boards' (that lack their own USB serial converter chip) then they will all work with the same comm port number, the one assigned to the USB serial cable when it was first plugged into the specific PC.

Lefty

retrolefty:

The choice of port by the PC seems to be by chance and I guess you could have Uno and Mega on the same port. I would consider this an advantage, but it might compound the confusion if yours are the same.

If you use one USB serial cable to plug into many different standalone 328 based 'boards' (that lack their own USB serial converter chip) then they will all work with the same comm port number, the one assigned to the USB serial cable when it was first plugged into the specific PC.

So is the end result the same - two Arduinos that run on USBx?

Nick_Pyner:

retrolefty:

The choice of port by the PC seems to be by chance and I guess you could have Uno and Mega on the same port. I would consider this an advantage, but it might compound the confusion if yours are the same.

If you use one USB serial cable to plug into many different standalone 328 based 'boards' (that lack their own USB serial converter chip) then they will all work with the same comm port number, the one assigned to the USB serial cable when it was first plugged into the specific PC.

So is the end result the same - two Arduinos that run on USBx?

USBx? Do you mean COM port x? If one has only one USB serial cable (not to be confused with a simple USB cable) you can't communicate with two or more standalone 328p based 'boards' at the same time anyway. The point is how and when a COM port number gets assigned to a arduino board, that is what I tried to explain. If the USB serial converter chip is mounted on the board then the your specific PC will never automatically assign it the same comm port number as any other arduino board it has ever had plugged into it.

You may have a Uno board that works on COM 3 on your PC, but if you bring it to a friends house that also owns a UNO board and plug yours into his PC it will get a new COM port assigned to it on your friends PC. The COM port assignment is not 'owned' by the arduino board, it's created and owned by the PC based on a unique USB device serial number inside the USB serial converter chip. A PC using the USB serial driver software will know if it's the first time that board has been plugged into it or not, and if not it will assign it a new COM port number.

The arduino IDE does not know what kind of board you may have plugged into your PC, it just scans the PC for the number and names of active serial ports (which may not even be arduino boards). That's why you can get upload errors if you 'lie' to the arduino IDE software as far as what kind of board you are using and what COM port it is using, because it can't tell directly.

Lefty

I have my IDE set to the Arduino ADK and I have the appropriate port set.

It's important to understand...I CAN upload successfully - as long as my sketch is below 30k.

So:

  1. I upload a sketch that is just under 30k - success!
  2. I add one harmless line of code...say, declare an int, or do a Serial.println...anything that will increase sketch size.
  3. Try to upload - FAILURE
  4. comment out any line to reduce sketch size again below 30k size - SUCCESS.

This is purely a size issue - I've tried it on both Windows and MAC machines with two different ADK boards...

All 4 combinations of ADK board and laptop are the same - success with small sketches, failure the moment they go over ~30k.

Post a link to Your code or .hex file?

Jeepdude2009:
I have my IDE set to the Arduino ADK and I have the appropriate port set.

It's important to understand...I CAN upload successfully - as long as my sketch is below 30k.

So:

  1. I upload a sketch that is just under 30k - success!
  2. I add one harmless line of code...say, declare an int, or do a Serial.println...anything that will increase sketch size.
  3. Try to upload - FAILURE
  4. comment out any line to reduce sketch size again below 30k size - SUCCESS.

This is purely a size issue - I've tried it on both Windows and MAC machines with two different ADK boards...

All 4 combinations of ADK board and laptop are the same - success with small sketches, failure the moment they go over ~30k.

If you get desperate, I bet you could load your sketch using the optional IDE file/upload using programmer option in the IDE and then use your UNO board loaded with the arduinoISP sketch as the programmer type selected, and wire that to your ADK board using the ISP pins.

Lefty

Arduinoisp would also be limited to 128k...

westfw:
Arduinoisp would also be limited to 128k...

Foiled again. I wonder why the Arduino folks ever upgraded from the 1280 chip to the 2560 chip if one can't get at the extra flash space?

Lefty

Jeepdude2009:
I have my IDE set to the Arduino ADK and I have the appropriate port set.

Are you quite sure of this? The IDE tells you its configuration in the green stripe at the bottom.

There could also be an installation problem, although the symptoms don't obviously point to that. I think I have some silly newbie installation problem with the latest IDE on a laptop, but I have never gotten round to looking at it.

The assorted REPRAP firmwares that run on MEGA exceed 30k.
Most people have managed to get them to work, I think.

Still no resolution.

New Bootloader: OK, today I tried out the tutorial on using an UNO to program my mega ADK...I followed the wiring diagram on the Arduino site using pins 10, 11, 12 and 13 as opposed to the one on Adafruit and elsewhere that use the ICSP pins.

I downloaded the ROBOTC bootloader hex for the mega/ADK and gave that a try (after placing it in the appropriate /hardware/arduino/bootloaders folder).

But all I get is the infamous AVRDUDE: Yikes invalid device signature message.

Trying to prove the 30k limit:
In order to rule out anything in my code, I tried a very simple sketch which consisted of nothing in the setup or loop function and contained ONLY String (capital S) declarations at the global level.
I grabbed a book from the Gutenberg project and threw it into those String declarations.

I could upload the sketch as long as it was under 30k...add one more String declaration and whammy - it failed. So this clearly ruled out anything I had in my actual code.

Trying to rule out the ADK (as opposed to the regular Mega):
Frustrated, I went to Radio Shack and bought a regular Mega (not an ADK). Guess what? Same exact issue - nothing greater than 30k will upload to it.

My last ditch option is that I ordered an actual Atmel AVR ISP programmer. Will update after I get that tomorrow.

Jeepdude2009:
Still no resolution.

New Bootloader:

I downloaded the ROBOTC bootloader hex for the mega/ADK an

Basically, ARDUINO is screwing you if you think that the 256k is going to benefit you. All you seem to get with the Mega is additional IOs, not additional usable program space.

I'm so pissed off right now, I could scream...three Mega boards that are no more capable than a 24 dollar UNO. Oh, and no response whatsoever from Arduino.

I ordered an actual Atmel AVR ISP programmer. Will update after I get that tomorrow.

The answer in my first post should have been - Yes, me, and a bazillion others.

Seems pretty clear your problem is a matter of pilot error. If the Mega boards really are as incapable as you say they are, everybody would have been complaining, and Arduino would have gone out of business years ago. Furthermore, having three Mega boards and still no resolution more or less proves it's pilot error, and two would probably have sufficed for that.

I submit the first thing you need to do is stop throwing money at the problem and try to find out why you have the problem and nobody else does. What I don't understand is why you have all these bootloaders and programmers in your agenda. Are you trying to do something so mysterious and unique that you have to have all that? You have never posted your code, I have no idea what you are trying to achieve, and the lack of response from Arduino could be because they have no idea either. Having said that, I'm not sure that posting your code will solve anything. After all, you have never said it won't compile, so it's fair to assume it's kosher, but you do say it is "very straightforward" so, in that event, why don't you just press the arrow button in your Arduino 1.0.1, or whatever, and upload the programme like everybody else does?

There is code attached to reply #3 below that you might try to load. It is about 45k, it works, and loads just like any other code. You may have to install a couple libraries first, but that is simple enough, they are free, and worth it to prove the point.

You can be pretty sure that all you have is some stupid newbie mistake that will only happen once, and all will be fine after that.

I tried out the tutorial on using an UNO to program my mega ADK

I did already mention that ArduinoISP won't program a mega2560... (though I don't think you got that far.)

As it happens, I don't have any m2560 arduinos, and my sense of duty toward community support doesn't quite go as far as going out and paying for hardware that I don't need, in order to debug other peoples' bootloader problems. However, I dug out my mega1280 and tried to upload the "Sprinter" RepRap sketch, which is about 53k. It worked fine.

Now, the mega1280 doesn't have the same bootloader as the mega2560, so that isn't really much of a test. There isn't a .hex file for the new bootloader for the 1280, so I compiled one from scratch using the source in arduino1.0.2 (this only took three tries at avr-gcc versions. Sigh.) I modified boards.txt to create the new board type, "burned bootloader" using ArduinoISP (which DOES work on a m1280!), and uploaded some new sketches. The 53k Sprinter sketch still uploads fine.
This is probably the production bootloader; there's no watchdog support in the source code, and it still has the "!!!" bug. (However, I didn't get a "huh?" response when I added !!! to the sketch. It just never completes upload.)

So I don't know what to tell you. It looks like the bootloader works fine for sketches larger than 30k here. You've repeatedly ignored requests for information from your side (.hex or source code.) I have suspicions that the m2560 doesn't really support 240kbyte sketches, but I'm pretty sure that it should work for sketches larger than 30k. As Nick points out, there have been too many MEGAs sold for a bug this serious to exist (ADKs... Perhaps less so.)

So... please provide your code?
Are you still getting the same "verbose" output with your sample sketch?

Here's something else you can try.
Connect to your Arduino via the serial monitor at 115200bps.
Hit reset on the board, and within 1 second send "!!!" (I have to pre-type the !!! and use two hands for this :slight_smile:
This should get you to the bootloader's interactive monitor, which looks like:

!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!
Arduino explorer stk500V2 by MLS
Bootloader>

It has a couple commands, but the one that's interesting is "?" Send a "?", and report the results. My 1280 says:

Bootloader>? CPU stats
Arduino explorer stk500V2 by MLS
Compiled on  = Jan 28 2013
CPU Type     = ATmega1280
__AVR_ARCH__ = 51
GCC Version  = 4.3.3
AVR LibC Ver = 1.6.7
CPU signature= 1E9703
Low fuse     = FF
High fuse    = D8
Ext fuse     = F5
Lock fuse    = CF
Bootloader>

Hi westfw...thank you for the in-depth response.

Nick, I didn't mean to offend...just very frustrated. I apologize if I did not understand your first post to mean that "many" people had succeeded. I wasn't getting anyone else saying that they could so I figured you were either lucky or using an AVR programmer (instead of the USB cable).

I will post my code first thing in the morning when I return to work. It's mostly cobbled-together bits of the Arduino examples (temperature readings from the temperature sample, COSM generated code from their website, and some NTP time-sync stuff from another example). No secrets or mystery...but I will definitely post in the AM when I can get to my machine. The storm in the northeast is preventing me from remoting into my machine to grab the offending code.

In the meantime, I did try Nick's referenced code and that did work. I have no idea why that will and a sketch containing nothing but String declarations will not (when > 30k).

I did the boot loader query and got the following: Although I'm not sure what to make of it :slight_smile:

Arduino explorer stk500V2 by MLS
Bootloader>? CPU stats
Arduino explorer stk500V2 by MLS
Compiled on = Sep 9 2010
CPU Type = ATmega2560
AVR_ARCH = 6
GCC Version = 4.3.3
AVR LibC Ver = 1.6.7
CPU signature= 1E9801
Low fuse = FF
High fuse = D0
Ext fuse = FD
Lock fuse = CF
Bootloader>

I'm not sure what to make of it

Well, one thing that has shown up on some Uno Clones is chips that apparently have the wrong bootloader loaded. (duemilanove bootloader on an Uno board.)

I think this output eliminates this as a possibility. It has the same compile date as the distributed .hex file.

Also: what OS are you using? If it's linux, you could have a weird version of avrdude in your path...

Jeepdude2009:
Nick, I didn't mean to offend...

No offense taken. Indeed I wouldn't want it to be the other way round...

I figured you were either lucky or using an AVR programmer (instead of the USB cable).

No. I'm just a newbie. I don't even know what an AVR programmer is, and I just use the cable supplied. What I'm rabbiting on about is that I don't understand why your situation is so complicated. I even think it is the cause of your problem rather than the solution.

It's mostly cobbled-together bits of the Arduino examples (temperature readings from the temperature sample, COSM generated code from their website, and some NTP time-sync stuff from another example). No secrets or mystery...

...and sounds much the same as me, except that I use an on-board clock.

In the meantime, I did try Nick's referenced code and that did work. I have no idea why that will and a sketch containing nothing but String declarations will not (when > 30k).

Success at last.
Now, it is just slightly possible that you have pointed the bone in the right direction. All I know about strings in Arduino is that scrupulously avoiding their use is a pretty good idea, and I have gotten as far as I have by doing just that. I don't know if it really is the cause of your strife, but there is a lot of talk around here of bugs and strings and it would be a good idea to trawl for that.

In the meantime, I did try Nick's referenced code and that did work. I have no idea why that will and a sketch containing nothing but String declarations will not (when > 30k).

Well you must be storing those strings into Flash memory (using PROGMEM ?) to gain that kind of sketch size, as of course there is no way to store that much user data into SRAM. There is a bug I'm told in the current compiler as to how much data can be stored by PROGMEM, as if it crosses a certain address size it compiles OK but barfs at run time. I bet that is what you are working against. If so it's not a mega2650 problem, it's a AVR gcc compiler use of PROGMEM bug. I think I've heard it's been fixed in a new version of the AVR gcc compiler but the arduino IDE is serveral version behind for gcc and no solid indication that they plan on upgrading it any time soon?

I ran up against the same problem with a mega1280 board when PROGMEM stored arrays passed the 64K mark (I think), no compile error just not execution once loaded.

The following sketch is what I was playing with. I can create a sketch to fill a 328 or a 644 chip to it's limit, but can't reach near maximum mem size for the 1280.

#include <avr/pgmspace.h>   //To store arrays into flash rather then SRAM
// Simple sketch to create large sketch sizes for testing purposes
/*
  Blink
  Turns on an LED on for one second, then off for one second, repeatedly.
 
  This example code is in the public domain.
 */
 
// Pin 13 has an LED connected on most Arduino boards.
// give it a name:
int led = 13;

/* 
 Make arraysize = to 1500 for 328P chip, 4000 for 1280P chip?,
 3600 for 644P chip, xxxx for 1284P,  etc.
*/
const int arraysize= 1500;  // value to mostly fill avalible flash capacity

long myInts0[arraysize] PROGMEM = {};  //Store initilized array into flash memory
long myInts1[arraysize] PROGMEM = {};
long myInts2[arraysize] PROGMEM = {};
long myInts3[arraysize] PROGMEM = {};

// the setup routine runs once when you press reset:
void setup() {                
  // initialize the digital pin as an output.
  pinMode(led, OUTPUT); 
  int i = random(0,arraysize);      // Work around any optimization for constant values
  Serial.print(myInts0[i]);         //  Access some random element so the array can't be optimized away.
  Serial.print(myInts1[i]);         //  Access some random element so the array can't be optimized away.
  Serial.print(myInts2[i]);         //  Access some random element so the array can't be optimized away.
  Serial.print(myInts3[i]);         //  Access some random element so the array can't be optimized away.
}

// the loop routine runs over and over again forever:
void loop() {
  
  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);               // wait for a second
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);               // wait for a second
}

Lefty

Also: what OS are you using?

At work I am using Windows 8 64 bit and at home I'm using OSX 10.8.2

For the IDE, it's Arduino 1.0.3. I'll bring this board to work tomorrow and try Nick's code there.

Thanks again for the help!

Nick - I didn't "start" with trying to upload new bootloaders...that was a move of desperation due to several other forum posts I read in my voyages that a faulty bootloader may be the problem. Trust me, I am more than happy to not mess with that. As for the programmer, my thought process was that since it bypassed the boot loader, and since the bootloader may be the culprit...that I might be able to upload a larger sketch by bypassing the "potentially" faulty bootloader.

Thanks for the tip on the String class - it sucks to have to do a lot of that work with char * though...guess I'll dust off my "C++ in a nutshell" book :slight_smile: