mAVRISP
An mbed can be used for In-System Programming [ISP] of AVR microcontrollers over a simple three-wire SPI interface.
The current version uses the simple AVR910 protocol to flash the Atmel chip.
The programmer should work with any AVR microcontrollers that support In-System Programming.
Example¶
This example will run through programming an ATmega328 with the mAVRISP program.
The Arduino IDE can be used to compile code for the ATmega328. The example Blink program that comes with the Arduino IDE can be compiled by first selecting the appropriate target [in this case an ATmega328 (running at the default internal 8MHz oscillator)]:
And then selecting Sketch -> Verify/Compile:
Under Windows XP the resulting output files can be found in the following directory:
\Documents and Settings\username\Local Settings\Temp\build[number].tmp
This directory will contain a .HEX file with the same name as the sketch. In this case, the name of the file is Blink.cpp.hex. This can be converted to a raw binary file using the free tool hex2bin. Note that you will have to rename the file from name.cpp.hex to name.hex:
The ATmega328 and mbed are now connected up as follows:
Put the AVR binary and the mAVRISP binary [in that order - otherwise the mbed will try to run the AVR binary!] onto the mbed. Ensure that the AVR binary is either appropriately named according to the #define PATH_TO_BINARY in AVR910.h or pass in the name you're using to the program method (see below).
If you open up your favourite serial terminal program you should see the following output when you reset the mbed:
Put an LED and appropriate resistor across digital pin 13 on the ATmega328 and watch it blink!
Hello World!¶
Import program
00001 /** 00002 * Program an AVR with an mbed. 00003 */ 00004 00005 #include "AVR910.h" 00006 00007 LocalFileSystem local("local"); 00008 Serial pc(USBTX, USBRX); 00009 AVR910 mAVRISP(p5, p6, p7, p8); //mosi, miso, sclk, nreset. 00010 00011 int main() { 00012 00013 int success = -1; 00014 int response = 0; 00015 00016 //Read the vendor code [0x1E == Atmel]. 00017 response = mAVRISP.readVendorCode(); 00018 00019 if (response == ATMEL_VENDOR_CODE) { 00020 pc.printf("Microcontroller is an Atmel [0x%02x]\n", response); 00021 } else if (response == DEVICE_LOCKED) { 00022 pc.printf("Device is locked\n"); 00023 return -1; 00024 } else { 00025 pc.printf("Microcontroller is not an Atmel\n"); 00026 return -1; 00027 } 00028 00029 //Read part family and flash size - see datasheet for code meaning. 00030 response = mAVRISP.readPartFamilyAndFlashSize(); 00031 00032 if (response == 0xFF) { 00033 pc.printf("Device code erased or target missing\n"); 00034 } else if (response == 0x01) { 00035 pc.printf("Device locked\n"); 00036 return -1; 00037 } else { 00038 pc.printf("Part family and flash size code is: 0x%02x\n", response); 00039 } 00040 00041 //Read part number. 00042 response = mAVRISP.readPartNumber(); 00043 00044 if (response == 0xFF) { 00045 pc.printf("Device code erased or target missing\n"); 00046 } else if (response == 0x02) { 00047 pc.printf("Device locked\n"); 00048 return -1; 00049 } else { 00050 pc.printf("Part number code is: 0x%02x\n", response); 00051 } 00052 00053 //Open binary file to write to AVR. 00054 FILE *fp = fopen(PATH_TO_BINARY, "rb"); 00055 00056 if (fp == NULL) { 00057 pc.printf("Failed to open binary. Please check the file path\n"); 00058 return -1; 00059 } else { 00060 //Program it! 00061 pc.printf("Binary file opened successfully\n"); 00062 success = mAVRISP.program(fp, 00063 ATMEGA328P_PAGESIZE, 00064 ATMEGA328P_NUM_PAGES); 00065 fclose(fp); 00066 } 00067 00068 if (success < 0) { 00069 printf("Programming failed.\n"); 00070 } else { 00071 printf("Programming was successful!\n"); 00072 } 00073 00074 }
Wiring¶
Atmel Pin | mbed Pin |
MOSI | p5 |
MISO | p6 |
SCK | p7 |
nRESET | p8 |
VCC | Vout |
AVCC | Vout |
AREF | Vout |
GND | GND |
API¶
Import program
Public Member Functions |
|
AVR910 (PinName mosi, PinName miso, PinName sclk, PinName nReset) | |
Constructor.
|
|
int | program (FILE *binary, int pageSize, int numPages=1) |
Program the AVR microcontroller connected to the mbed.
|
|
void | setFrequency (int frequency) |
Set the frequency of the SPI communication.
|
|
int | readVendorCode (void) |
Read the vendor code of the device.
|
|
int | readPartFamilyAndFlashSize (void) |
Read the part family and flash size of the device.
|
|
int | readPartNumber (void) |
Read the part number.
|