Pages: [1]   Go Down
Author Topic: ATmega Hex Uploader  (Read 1265 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Full Member
***
Karma: 1
Posts: 196
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I asked Nick Gammon this question by IM :

Quote
Hi Nick,

I have been reading a little bit of your  "ATmega Hex uploader" code

I wanted to reuse it in a design of mine.

In your case you used a bit banged solution because you couldn t share the hardware SPI port, between the SDCARD and the other ATmega.
In my case i´m able to multiplex the SPI port, i can use the same port to read from the SDCARD and after Write on the ATmega.

Now the question...
Do you think that it would suffice (more or less) to modify your "BB_SPItransfer" function to call the "hardware" SPItransfer for the all sketch to work?
Can you give possible problems that i would have, if i would do this?

Thank you

Answer:

Quote
Just call SPI.transfer instead. They are supposed to be interchangeable.

If you have any more questions please post them to the forum, and send me a link to the thread. Thanks.

Thanks
Logged

Offline Offline
Full Member
***
Karma: 1
Posts: 196
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Nick can you help?

I have been trying to use yout sketch.

I was having problems with my hardware so to easy things and speed up diagnostics, i mounted your setup: an arduino UNO, SDCARD and arduino MEGA.

Untill the moment i´m able to run the sketch on the UNO and see the files in the SDcard. When i tried to program it, it gave me a lot of verification errors, i think that that might be because of the fuses setup or something like that.

So after that i tried to Read the memory to the card. I was expecting that the 2 files (Blink.exe and BREAD.HEX (file read) ) would be equal, but instead they were very different. I´m posting the files so ppl can compare:


Do you have any ideas for the verification errors and the files comparation?

I´m posting the results i get on the serial monitor when running the program first time:

Quote
Atmega hex file uploader.
Written by Nick Gammon.
Version 1.9
Reading SD card ...
step1

HEX files in root directory:

BLINK.HEX     :       4542 bytes.  Created: 2012-08-03 17:44:42.  Modified: 2012-08-03 16:14:42
BREAD.HEX     :     622639 bytes.  Created: 2012-08-03 17:44:42.  Modified: 2000-01-01 01:00:00
step2

--------- Starting ---------

Attempting to enter programming mode ...
Entered programming mode OK.
Signature = 0x1E 0x98 0x01
Processor = ATmega2560
Flash memory size = 262144 bytes.
LFuse = 0xFF
HFuse = 0xD8
EFuse = 0xFD
Lock byte = 0xFF
Clock calibration = 0xA8
Actions:
 [E] erase flash
 [F] modify fuses
 [L] list directory
 [R] read from flash (save to disk)
 [V] verify flash (compare to disk)
 [W] write to flash (read from disk)
Enter action:

and the verification errors when writting:

Quote
Choose disk file [  ] ...
BLINK.HEX
Processing file: BLINK.HEX
Checking file ...

###
Lowest address  = 0x0
Highest address = 0x647
Bytes to write  = 1608
No bootloader.
Suggest making high fuse = 0xD9
Attempting to enter programming mode ...
Entered programming mode OK.
Processing file: BLINK.HEX
Erasing chip ...
Writing flash ...

#######
Written.
Processing file: BLINK.HEX
Verifying flash ...
Verification error at address 0. Got: 0x00  Expected: 0x0C
Verification error at address 1. Got: 0x00  Expected: 0x94
Verification error at address 2. Got: 0x01  Expected: 0x0C
Verification error at address 4. Got: 0x02  Expected: 0x0C
Verification error at address 5. Got: 0x02  Expected: 0x94
Verification error at address 6. Got: 0x03  Expected: 0x2E
Verification error at address 7. Got: 0x03  Expected: 0x01
Verification error at address 8. Got: 0x04  Expected: 0x0C
Verification error at address 9. Got: 0x04  Expected: 0x94
Verification error at address A. Got: 0x05  Expected: 0x2E
Verification error at address B. Got: 0x05  Expected: 0x01
Verification error at address C. Got: 0x06  Expected: 0x0C
Verification error at address D. Got: 0x06  Expected: 0x94
Verification error at address E. Got: 0x07  Expected: 0x2E
Verification error at address F. Got: 0x07  Expected: 0x01
Verification error at address 10. Got: 0x08  Expected: 0x0C
Verification error at address 11. Got: 0x08  Expected: 0x94
Verification error at address 12. Got: 0x09  Expected: 0x2E
Verification error at address 13. Got: 0x09  Expected: 0x01
Verification error at address 14. Got: 0x0A  Expected: 0x0C
Verification error at address 15. Got: 0x0A  Expected: 0x94
Verification error at address 16. Got: 0x0B  Expected: 0x2E
Verification error at address 17. Got: 0x0B  Expected: 0x01
Verification error at address 19. Got: 0x0C  Expected: 0x94
Verification error at address 1A. Got: 0x0D  Expected: 0x2E
Verification error at address 1B. Got: 0x0D  Expected: 0x01
Verification error at address 1C. Got: 0x0E  Expected: 0x0C
Verification error at address 1D. Got: 0x0E  Expected: 0x94
Verification error at address 1E. Got: 0x0F  Expected: 0x2E
Verification error at address 1F. Got: 0x0F  Expected: 0x01
Verification error at address 20. Got: 0x10  Expected: 0x0C
Verification error at address 21. Got: 0x10  Expected: 0x94
Verification error at address 22. Got: 0x11  Expected: 0x2E
Verification error at address 23. Got: 0x11  Expected: 0x01
Verification error at address 24. Got: 0x12  Expected: 0x0C
Verification error at address 25. Got: 0x12  Expected: 0x94
Verification error at address 26. Got: 0x13  Expected: 0x2E
Verification error at address 27. Got: 0x13  Expected: 0x01
Verification error at address 28. Got: 0x14  Expected: 0x0C
Verification error at address 29. Got: 0x14  Expected: 0x94
Verification error at address 2A. Got: 0x15  Expected: 0x2E
Verification error at address 2B. Got: 0x15  Expected: 0x01
Verification error at address 2C. Got: 0x16  Expected: 0x0C
Verification error at address 2D. Got: 0x16  Expected: 0x94
Verification error at address 2E. Got: 0x17  Expected: 0x2E
Verification error at address 2F. Got: 0x17  Expected: 0x01
Verification error at address 30. Got: 0x18  Expected: 0x0C
Verification error at address 31. Got: 0x18  Expected: 0x94
Verification error at address 32. Got: 0x19  Expected: 0x2E
Verification error at address 33. Got: 0x19  Expected: 0x01
Verification error at address 34. Got: 0x1A  Expected: 0x0C
Verification error at address 35. Got: 0x1A  Expected: 0x94
Verification error at address 36. Got: 0x1B  Expected: 0x2E
Verification error at address 37. Got: 0x1B  Expected: 0x01
Verification error at address 38. Got: 0x1C  Expected: 0x0C
Verification error at address 39. Got: 0x1C  Expected: 0x94
Verification error at address 3A. Got: 0x1D  Expected: 0x2E
Verification error at address 3B. Got: 0x1D  Expected: 0x01
Verification error at address 3C. Got: 0x1E  Expected: 0x0C
Verification error at address 3D. Got: 0x1E  Expected: 0x94
Verification error at address 3E. Got: 0x1F  Expected: 0x2E
Verification error at address 3F. Got: 0x1F  Expected: 0x01
Verification error at address 40. Got: 0x20  Expected: 0x0C
Verification error at address 41. Got: 0x20  Expected: 0x94
Verification error at address 42. Got: 0x21  Expected: 0x2E
Verification error at address 43. Got: 0x21  Expected: 0x01
Verification error at address 44. Got: 0x22  Expected: 0x0C
Verification error at address 45. Got: 0x22  Expected: 0x94
Verification error at address 46. Got: 0x23  Expected: 0x2E
Verification error at address 47. Got: 0x23  Expected: 0x01
Verification error at address 48. Got: 0x24  Expected: 0x0C
Verification error at address 49. Got: 0x24  Expected: 0x94
Verification error at address 4A. Got: 0x25  Expected: 0x2E
Verification error at address 4B. Got: 0x25  Expected: 0x01
Verification error at address 4C. Got: 0x26  Expected: 0x0C
Verification error at address 4D. Got: 0x26  Expected: 0x94
Verification error at address 4E. Got: 0x27  Expected: 0x2E
Verification error at address 4F. Got: 0x27  Expected: 0x01
Verification error at address 50. Got: 0x28  Expected: 0x0C
Verification error at address 51. Got: 0x28  Expected: 0x94
Verification error at address 52. Got: 0x29  Expected: 0x2E
Verification error at address 53. Got: 0x29  Expected: 0x01
Verification error at address 54. Got: 0x2A  Expected: 0x0C
Verification error at address 55. Got: 0x2A  Expected: 0x94
Verification error at address 56. Got: 0x2B  Expected: 0x2E
Verification error at address 57. Got: 0x2B  Expected: 0x01
Verification error at address 58. Got: 0x2C  Expected: 0x0C
Verification error at address 59. Got: 0x2C  Expected: 0x94
Verification error at address 5A. Got: 0x2D  Expected: 0x2E
Verification error at address 5B. Got: 0x2D  Expected: 0x01
Verification error at address 5C. Got: 0x2E  Expected: 0x0C
Verification error at address 5D. Got: 0x2E  Expected: 0x94
Verification error at address 5E. Got: 0x2F  Expected: 0x4A
Verification error at address 5F. Got: 0x2F  Expected: 0x01
Verification error at address 60. Got: 0x30  Expected: 0x0C
Verification error at address 61. Got: 0x30  Expected: 0x94
Verification error at address 62. Got: 0x31  Expected: 0x2E
Verification error at address 63. Got: 0x31  Expected: 0x01
Verification error at address 64. Got: 0x32  Expected: 0x0C
Verification error at address 65. Got: 0x32  Expected: 0x94
Verification error at address 66. Got: 0x33  Expected: 0x2E

######
1604 verification error(s).
First 100 shown.
No bootloader.
Setting high fuse = 0xD9
Done.
Logged

Offline Offline
Full Member
***
Karma: 1
Posts: 196
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I Forgot to add, when i Erase the Flash, it seems to erase it, because after that i have to re-program the bootloader and after the code trough the arduino IDE.
Logged

Offline Offline
Full Member
***
Karma: 1
Posts: 196
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Adding more info...

Tried to writte the ASCIItable example, result:

Quote
--------- Starting ---------

Attempting to enter programming mode ...
Entered programming mode OK.
Signature = 0x1E 0x98 0x01
Processor = ATmega2560
Flash memory size = 262144 bytes.
LFuse = 0xFF
HFuse = 0xD8
EFuse = 0xFD
Lock byte = 0xFF
Clock calibration = 0xA8
Actions:
 [E] erase flash
 [F] modify fuses
 [L] list directory
 [R] read from flash (save to disk)
 [V] verify flash (compare to disk)
 [W] write to flash (read from disk)
Enter action:
W

Choose disk file [ ASCIIT~2.HEX ] ...
ASCIIT~2.HEX
Processing file: ASCIIT~2.HEX
Checking file ...

#####
Lowest address  = 0x0
Highest address = 0xBF1
Bytes to write  = 3058
No bootloader.
Suggest making high fuse = 0xD9
Attempting to enter programming mode ...
Entered programming mode OK.
Processing file: ASCIIT~2.HEX
Erasing chip ...
Writing flash ...

############
Written.
Processing file: ASCIIT~2.HEX
Verifying flash ...

###########
No errors found.
No bootloader.
Setting high fuse = 0xD9
Done.

But, when i try to verify/compare it with the ASCIItable.HEX, result:

Quote
--------- Starting ---------

Attempting to enter programming mode ...
Entered programming mode OK.
Signature = 0x1E 0x98 0x01
Processor = ATmega2560
Flash memory size = 262144 bytes.
LFuse = 0xFF
HFuse = 0xD9
EFuse = 0xFD
Lock byte = 0xFF
Clock calibration = 0xA8
Actions:
 [E] erase flash
 [F] modify fuses
 [L] list directory
 [R] read from flash (save to disk)
 [V] verify flash (compare to disk)
 [W] write to flash (read from disk)
Enter action:
V

Choose disk file [ ASCIIT~2.HEX ] ...
ASCIIT~2.HEX
Processing file: ASCIIT~2.HEX
Checking file ...

#####
Lowest address  = 0x0
Highest address = 0xBF1
Bytes to write  = 3058
No bootloader.
Suggest making high fuse = 0xD9
Attempting to enter programming mode ...
Entered programming mode OK.
Processing file: ASCIIT~2.HEX
Verifying flash ...
Verification error at address 0. Got: 0xFF  Expected: 0x0C
Verification error at address 1. Got: 0xFF  Expected: 0x94
Verification error at address 2. Got: 0xFF  Expected: 0x73
Verification error at address 3. Got: 0xFF  Expected: 0x00
Verification error at address 4. Got: 0xFF  Expected: 0x0C
Verification error at address 5. Got: 0xFF  Expected: 0x94
Verification error at address 6. Got: 0xFF  Expected: 0xA0
Verification error at address 7. Got: 0xFF  Expected: 0x00
Verification error at address 8. Got: 0xFF  Expected: 0x0C
Verification error at address 9. Got: 0xFF  Expected: 0x94
Verification error at address A. Got: 0xFF  Expected: 0xA0
Verification error at address B. Got: 0xFF  Expected: 0x00
Verification error at address C. Got: 0xFF  Expected: 0x0C
Verification error at address D. Got: 0xFF  Expected: 0x94
Verification error at address E. Got: 0xFF  Expected: 0xA0
Verification error at address F. Got: 0xFF  Expected: 0x00
.....
Logged

Global Moderator
Offline Offline
Brattain Member
*****
Karma: 452
Posts: 18694
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I have a slightly later version, although that shouldn't make much difference.

I seem to be able to upload the blink sketch OK:

Code:
Reading SD card ...

HEX files in root directory:

BLINKC~1.HEX  :       4616 bytes.  Created: 2012-08-05 09:28:00.  Modified: 2012-08-05 09:28:00

--------- Starting ---------

Attempting to enter programming mode ...
Entered programming mode OK.
Signature = 0x1E 0x98 0x01
Processor = ATmega2560
Flash memory size = 262144 bytes.
LFuse = 0xFF
HFuse = 0xD8
EFuse = 0xFD
Lock byte = 0xEF
Clock calibration = 0x5D
Actions:
 [E] erase flash
 [F] modify fuses
 [L] list directory
 [R] read from flash (save to disk)
 [V] verify flash (compare to disk)
 [W] write to flash (read from disk)
Enter action:
W

Choose disk file [  ] ...
BLINKC~1.HEX
Processing file: BLINKC~1.HEX
Checking file ...

###
Lowest address  = 0x0
Highest address = 0x65F
Bytes to write  = 1632
No bootloader.
Suggest making high fuse = 0xD9
Attempting to enter programming mode ...
Entered programming mode OK.
Processing file: BLINKC~1.HEX
Erasing chip ...
Writing flash ...

#######
Written.
Processing file: BLINKC~1.HEX
Verifying flash ...

######
No errors found.
No bootloader.
Setting high fuse = 0xD9
Done.

What is your hardware exactly? I am using the Mega2560 board. Are you using that? If not, what speed are you running the processor at (eg. what crystal)?

Judging by the errors, the data is not uploading correctly.

You could try slowing it down. Find this line in the sketch:

Code:
// control speed of programming
const byte BB_DELAY_MICROSECONDS = 4;

Try making the 4 larger (eg. 8) and see if that helps.

Latest version of GitHub:

https://github.com/nickgammon/arduino_sketches
Logged

Offline Offline
Full Member
***
Karma: 1
Posts: 196
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi Nick,

I send a photo of the setup i´m using, it seems a little bit sketchy, but i mounted it this way so it could resemble the most with your setup.
I´m using the UNO, the Mega as 2560 and the Ethernet daughter for the SDcard.
The UNO is using a 16Mhz clock.

Photo:
https://dl.dropbox.com/u/7216207/P1010689.JPG

In the last post i made this quote of the sketch result:
Code:
--------- Starting ---------

Attempting to enter programming mode ...
Entered programming mode OK.
Signature = 0x1E 0x98 0x01
Processor = ATmega2560
Flash memory size = 262144 bytes.
LFuse = 0xFF
HFuse = 0xD8
EFuse = 0xFD
Lock byte = 0xFF
Clock calibration = 0xA8
Actions:
 [E] erase flash
 [F] modify fuses
 [L] list directory
 [R] read from flash (save to disk)
 [V] verify flash (compare to disk)
 [W] write to flash (read from disk)
Enter action:
W

Choose disk file [ ASCIIT~2.HEX ] ...
ASCIIT~2.HEX
Processing file: ASCIIT~2.HEX
Checking file ...

#####
Lowest address  = 0x0
Highest address = 0xBF1
Bytes to write  = 3058
No bootloader.
Suggest making high fuse = 0xD9
Attempting to enter programming mode ...
Entered programming mode OK.
Processing file: ASCIIT~2.HEX
Erasing chip ...
Writing flash ...

############
Written.
Processing file: ASCIIT~2.HEX
Verifying flash ...

###########
No errors found.
No bootloader.
Setting high fuse = 0xD9
Done.

Isn´t this a correct Writting of the Flash?
After this writting when i go and try do verify the data written i get errors, could this be because of the LOCKbits and FUSES. Maybe i´m using read protection so the MCU doesn´t allow the sketch to read the written flash correctly?

I´m going to test your sugestions and see what happens.
Logged

Offline Offline
Full Member
***
Karma: 1
Posts: 196
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi,

I made a new setup not so sketchy... and this time seems that the sketch is working.

I´am able to write and verify the code.

One thing that i noticed is that when i wirte a sketch to the Mega2560, if i trie to reprogram the board via IDE i´m not able.
You are erasing the flash and with the bootloader, is that correct?

When the MCU starts the program, it starts directly from the start of the code without any bootloader?

Can you clarify this to me?

Regards
Logged

Global Moderator
Offline Offline
Brattain Member
*****
Karma: 452
Posts: 18694
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Yes, the SPI interface only has a command for erasing all the flash (as far as I can see). Thus an upload also removes the bootloader. You would need to put the bootloader back to use the IDE. But if you want to use the IDE, and you can use the IDE, why upload this way?

Quote
When the MCU starts the program, it starts directly from the start of the code without any bootloader?

Yes it changes the fuse to do that.
Logged

Offline Offline
Full Member
***
Karma: 1
Posts: 196
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Yeap, i have been reading a little bit more, you pass the high fuse to 0XD9 that enables the BOOTRST bit, and that makes it start from the code and not bootloader.

Well i need this type of writting for my remote firmware upgrade feature, i have 2 ATmega2560 and 1 ATmega328P on the same board, and i want the ATmega328P to reprogram the 2 Atmega2560.

Project: http://img717.imageshack.us/img717/7879/p1010688cs.jpg
Logged

Offline Offline
Full Member
***
Karma: 1
Posts: 196
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Another question, but a little bit different.

Untill now i was using the SD library that comes with the arduino IDE and the system was working without problems.
But, to use the ATmega_hex_uploader sketch i have to call the SdFAT library instead of the SD, at least in the ATmega328.
I wanted to use the SdFAT library just because i´m lazy smiley , but it´s giving me problems with the design and i think i have all the PORTs correctly alocated and changed.

Any ideas to what could be the problem, taking into account that the SD library currently works with the design?
Logged

Global Moderator
Offline Offline
Brattain Member
*****
Karma: 452
Posts: 18694
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

That's pretty non-specific. What problems?
Logged

Offline Offline
Full Member
***
Karma: 1
Posts: 196
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

You are right smiley. I´m going to make some more testing and post sistematic results/problems so you can help me.
Logged

Offline Offline
Full Member
***
Karma: 1
Posts: 196
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

So Lazy...

Right now the SdFat library is working on my design.

Had to eliminate the external clockout in your skecth, it used the OC1A which was one of my enable ports for the SPI bus...

At the moment i´m just missing putting the bit banged to work with the shared hardware SPI.
lets see...
Logged

Offline Offline
Full Member
***
Karma: 1
Posts: 196
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Seems to be working on my design right now, using always hardware SPI, both for programming and reading SDcard.

Thank you for the awesome sketch Nick!
Logged

Pages: [1]   Go Up
Jump to: