This project addresses a simple need: duplicate a working AVR (Arduino) microcontroller firmware: including bootloader, user programming, eeprom, and fuses. You can create one copy or as many as you want. If you have an AVR-ISP device, you essentially have a chip copy machine. While we think about using the ISP for downloading (burning/flashing) the uC, the hardware interface is also capable of reading the information.
Caveat:You must have access to an AVR-ISP programmer.
I personally use an old UNO running ArduinoISP and a ZIF shield from Adafruit: http://www.adafruit.com/products/462 but one could also use something like:
Examples are all relative to the contents of my %temp% variable - remember to change for your specific environment!
To Read and create a disk file image:
avrdude -c arduino -P com9 -p ATMEGA328P -b 19200 -U flash:r:%temp%\backup_flash.bin:r
avrdude -c arduino -P com9 -p ATMEGA328P -b 19200 -U eeprom:r:%temp%\backup_eeprom.bin:r
avrdude -c arduino -P com9 -p ATMEGA328P -b 19200 -U hfuse:r:%temp%\backup_hfuse.bin:r
avrdude -c arduino -P com9 -p ATMEGA328P -b 19200 -U lfuse:r:%temp%\backup_lfuse.bin:r
avrdude -c arduino -P com9 -p ATMEGA328P -b 19200 -U efuse:r:%temp%\backup_efuse.bin:r
To Write a disk file image into the ATmega328 microcontroller (no line breaks):
avrdude -c arduino -P com9 -p ATMEGA328P -b 19200 -U flash:w:\Users\owner\AppData\Local\Temp\backup_flash.bin
avrdude -c arduino -P com9 -p ATMEGA328P -b 19200 -U eeprom:w:\Users\owner\AppData\Local\Temp\backup_eeprom.bin
avrdude -c arduino -P com9 -p ATMEGA328P -b 19200 -U hfuse:w:\Users\owner\AppData\Local\Temp\backup_hfuse.bin
avrdude -c arduino -P com9 -p ATMEGA328P -b 19200 -U lfuse:w:\Users\owner\AppData\Local\Temp\backup_lfuse.bin
avrdude -c arduino -P com9 -p ATMEGA328P -b 19200 -U efuse:w:\Users\owner\AppData\Local\Temp\backup_efuse.bin
There are no line-breaks in the commands above, the Hackster editor does the line wrapping automatically!>
I am only describing how to clone the ATmega328P-PU which is used in the Arduino UNO. The process lends itself to any Arduino microcontroller but the exact parameters for the commands will vary. You will need to do research for other processors and other ISP programmers other than the ArduinoISP running on UNO with the Adafruit shield.
Other things you MUST know prior to being successful:
- The USB/Serial communications port for your AVR-ISP burner, generally denoted as comX
- The AVR device name for the Atmel microcontroller, the UNO uses ATMEGA328P
- The exact location where you intend on writing the temporary image files, I used %temp%
- The exact location where you intend on reading the temporary image files... without drive letter
So, let's get started with the explanation of how this all works!
Software:Software? If you have the Arduino environment on your PC, the software AVRDUDE is already loaded! If you need software, then download and install from this link: http://arduino.cc/en/Main/SoftwareExamples of how the AVRDUDE software can be used from a command line is located here:
Batch file (script):You will need to either type the commands below in a command window under your OS to read a working Arduino microcontroller flash, eeprom, and fuses. The commands create Intel HEX files which represent the exact information contained in the Arduino 328 microcontroller (UNO example.)
Within Windows, the user's temporary files location is denoted by an environmental variable automatically set and named %temp% and this resolves to a long path (for grins, type this in a command window: echo %temp% and press the ENTER key.) In my case on my particular PC running Vista, the %temp% is equivalent to: C:\Users\owner\AppData\Local\Temp but your path will likely be very different. Now is a good time to open the command prompt (Start / Run... / CMD and press Enter) ... on Win8 you can go through the help system to get a run command line, then type CMD to open the environment. Other OS provide the feature, but you will need to research of non-Windows.
There is a BUG (or if not a bug an very annoying feature) of AVRDUDE that allows the reading path to have the "C:" drive in the path variable but the writing path must exclude the "C:". So, while you can use %temp% for creating the binary files, you must type the path without the C: for the write process. OR, if you are a super DOS freak, you know you can create your own parameter to pass... I will not explain all of this here because I wish to keep this write-up simple..
Here is a link and sample batch file that will give you an idea of how to construct a proper path without the drive letter so that you can completely mechanize the record & write processes without having to hard-code the path:
Sample preamble to create a path without the leading drive letter:
echo Temporary Directory= %tempdir%
REM echo Modified Path= %tempdir:~2%
echo Temporary Directory= %newpath%
You can use this procedure to quickly create chips with a bootloader and the program and the correct fuse settings and use that chip on a breadboard. And while you cannot de-compile to source code from an Arduino, you could certainly copy whatever program and data is contained in a working UNO microcontroller and insert the chip into another UNO (official or clone) board. Otherwise, it is just fun to know that you can duplicate all aspects of the software environment.
Warning: some non-official "Arduino" boards may come with the lock-bit set in the chip in which case you will NOT be able to copy the flash program. See: http://support.atmel.no/bin/customer.exe?action=viewKbEntry&id=394