A fork of mAVRISP by Aaron Berk. This version does not use a local file system to hold the AVR program. Instead it uses a serial connection to a PC and a python script to send the AVR program to the mbed.

Dependencies:   mbed

Fork of mAVRISP by Aaron Berk

Committer:
jeroenmbed
Date:
Sat Jan 31 21:54:05 2015 +0000
Revision:
3:df6782d01720
Parent:
1:276f6df4be7a
Child:
4:ceee1eb7062e
IT WORKS!!! I can now program an atmega328 with ISP via the mbed. No bootloader.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
aberk 0:3066745764a5 1 /**
aberk 0:3066745764a5 2 * Program an AVR with an mbed.
aberk 0:3066745764a5 3 */
aberk 0:3066745764a5 4
aberk 0:3066745764a5 5 #include "AVR910.h"
aberk 0:3066745764a5 6
jeroenmbed 3:df6782d01720 7 //LocalFileSystem local("local");
aberk 0:3066745764a5 8 Serial pc(USBTX, USBRX);
jeroenmbed 3:df6782d01720 9 //AVR910 mAVRISP(PA_7, PA_6, PA_5, PB_6); //mosi, miso, sclk, nreset.
jeroenmbed 3:df6782d01720 10 //AVR910 mAVRISP(PB_5, PB_4, PB_3, PA_10); //mosi, miso, sclk, nreset.
jeroenmbed 3:df6782d01720 11 AVR910 mAVRISP(PB_15, PB_14, PB_13, PB_2); //mosi, miso, sclk, nreset.
aberk 0:3066745764a5 12
jeroenmbed 3:df6782d01720 13 DigitalOut working(LED1);
jeroenmbed 3:df6782d01720 14
aberk 0:3066745764a5 15
jeroenmbed 3:df6782d01720 16 int main()
jeroenmbed 3:df6782d01720 17 {
jeroenmbed 3:df6782d01720 18 working = 1;
aberk 0:3066745764a5 19 int success = -1;
aberk 0:3066745764a5 20 int response = 0;
aberk 1:276f6df4be7a 21
jeroenmbed 3:df6782d01720 22 pc.printf("Starting\n");
jeroenmbed 3:df6782d01720 23
aberk 0:3066745764a5 24 //Read the vendor code [0x1E == Atmel].
aberk 0:3066745764a5 25 response = mAVRISP.readVendorCode();
jeroenmbed 3:df6782d01720 26 printf("vendorcode=%d\n",response);
aberk 0:3066745764a5 27 if (response == ATMEL_VENDOR_CODE) {
aberk 0:3066745764a5 28 pc.printf("Microcontroller is an Atmel [0x%02x]\n", response);
aberk 0:3066745764a5 29 } else if (response == DEVICE_LOCKED) {
aberk 0:3066745764a5 30 pc.printf("Device is locked\n");
aberk 0:3066745764a5 31 return -1;
aberk 0:3066745764a5 32 } else {
aberk 0:3066745764a5 33 pc.printf("Microcontroller is not an Atmel\n");
aberk 0:3066745764a5 34 return -1;
aberk 0:3066745764a5 35 }
aberk 1:276f6df4be7a 36
aberk 0:3066745764a5 37 //Read part family and flash size - see datasheet for code meaning.
aberk 0:3066745764a5 38 response = mAVRISP.readPartFamilyAndFlashSize();
aberk 0:3066745764a5 39
aberk 0:3066745764a5 40 if (response == 0xFF) {
aberk 0:3066745764a5 41 pc.printf("Device code erased or target missing\n");
aberk 0:3066745764a5 42 } else if (response == 0x01) {
aberk 0:3066745764a5 43 pc.printf("Device locked\n");
aberk 0:3066745764a5 44 return -1;
aberk 0:3066745764a5 45 } else {
aberk 0:3066745764a5 46 pc.printf("Part family and flash size code is: 0x%02x\n", response);
aberk 0:3066745764a5 47 }
aberk 0:3066745764a5 48
aberk 0:3066745764a5 49 //Read part number.
aberk 0:3066745764a5 50 response = mAVRISP.readPartNumber();
aberk 0:3066745764a5 51
aberk 0:3066745764a5 52 if (response == 0xFF) {
aberk 0:3066745764a5 53 pc.printf("Device code erased or target missing\n");
aberk 0:3066745764a5 54 } else if (response == 0x02) {
aberk 0:3066745764a5 55 pc.printf("Device locked\n");
aberk 0:3066745764a5 56 return -1;
aberk 0:3066745764a5 57 } else {
aberk 0:3066745764a5 58 pc.printf("Part number code is: 0x%02x\n", response);
aberk 0:3066745764a5 59 }
aberk 1:276f6df4be7a 60
aberk 0:3066745764a5 61 //Open binary file to write to AVR.
jeroenmbed 3:df6782d01720 62 //FILE *fp = fopen(PATH_TO_BINARY, "rb");
jeroenmbed 3:df6782d01720 63 printf("@");
jeroenmbed 3:df6782d01720 64
jeroenmbed 3:df6782d01720 65 int hs, ls;
jeroenmbed 3:df6782d01720 66 while (!pc.readable());
jeroenmbed 3:df6782d01720 67 hs = pc.getc();
jeroenmbed 3:df6782d01720 68 printf("hs=%d\n",hs);
jeroenmbed 3:df6782d01720 69 while (!pc.readable());
jeroenmbed 3:df6782d01720 70 ls = pc.getc();
jeroenmbed 3:df6782d01720 71 printf("ls=%d\n",ls);
jeroenmbed 3:df6782d01720 72 int fileSize = (hs<<8) + ls;
jeroenmbed 3:df6782d01720 73 printf ("file size = %d\n", fileSize);
aberk 1:276f6df4be7a 74
jeroenmbed 3:df6782d01720 75 printf("#");
jeroenmbed 3:df6782d01720 76
jeroenmbed 3:df6782d01720 77 char *myFile;
jeroenmbed 3:df6782d01720 78 myFile = new char [fileSize];
jeroenmbed 3:df6782d01720 79 int readChar=0;
jeroenmbed 3:df6782d01720 80 while (readChar < fileSize) {
jeroenmbed 3:df6782d01720 81 if (pc.readable()) {
jeroenmbed 3:df6782d01720 82 myFile[readChar]=pc.getc();
jeroenmbed 3:df6782d01720 83 readChar++;
jeroenmbed 3:df6782d01720 84 }
jeroenmbed 3:df6782d01720 85 }
jeroenmbed 3:df6782d01720 86 for (int i=0; i<fileSize; i++) {
jeroenmbed 3:df6782d01720 87 printf("r %d: 0x%02x\n",i, myFile[i]);
aberk 0:3066745764a5 88 }
jeroenmbed 3:df6782d01720 89 wait_ms(1000);
jeroenmbed 3:df6782d01720 90 success = mAVRISP.programData(myFile, fileSize, ATMEGA328P_PAGESIZE, ATMEGA328P_NUM_PAGES);
jeroenmbed 3:df6782d01720 91
jeroenmbed 3:df6782d01720 92 // if (fp == NULL) {
jeroenmbed 3:df6782d01720 93 // pc.printf("Failed to open binary. Please check the file path\n");
jeroenmbed 3:df6782d01720 94 // return -1;
jeroenmbed 3:df6782d01720 95 // } else {
jeroenmbed 3:df6782d01720 96 // //Program it!
jeroenmbed 3:df6782d01720 97 // pc.printf("Binary file opened successfully\n");
jeroenmbed 3:df6782d01720 98 // success = mAVRISP.program(fp,
jeroenmbed 3:df6782d01720 99 // ATMEGA328P_PAGESIZE,
jeroenmbed 3:df6782d01720 100 // ATMEGA328P_NUM_PAGES);
jeroenmbed 3:df6782d01720 101 // fclose(fp);
jeroenmbed 3:df6782d01720 102 // }
aberk 1:276f6df4be7a 103
aberk 1:276f6df4be7a 104 if (success < 0) {
aberk 0:3066745764a5 105 printf("Programming failed.\n");
aberk 1:276f6df4be7a 106 } else {
aberk 0:3066745764a5 107 printf("Programming was successful!\n");
aberk 0:3066745764a5 108 }
aberk 1:276f6df4be7a 109
aberk 0:3066745764a5 110 }
jeroenmbed 3:df6782d01720 111
jeroenmbed 3:df6782d01720 112 /* Python file for on the pc:
jeroenmbed 3:df6782d01720 113 import serial
jeroenmbed 3:df6782d01720 114 import sys
jeroenmbed 3:df6782d01720 115 import os
jeroenmbed 3:df6782d01720 116
jeroenmbed 3:df6782d01720 117 fileName=sys.argv[1]
jeroenmbed 3:df6782d01720 118 fileSize=os.path.getsize(fileName)
jeroenmbed 3:df6782d01720 119
jeroenmbed 3:df6782d01720 120 serdev='/dev/ttyACM0'
jeroenmbed 3:df6782d01720 121 s = serial.Serial(serdev)
jeroenmbed 3:df6782d01720 122
jeroenmbed 3:df6782d01720 123 while True:
jeroenmbed 3:df6782d01720 124 if s.readable():
jeroenmbed 3:df6782d01720 125 c = s.read()
jeroenmbed 3:df6782d01720 126 if '@' in c:
jeroenmbed 3:df6782d01720 127 print "Start sending file size\n"
jeroenmbed 3:df6782d01720 128 hs = (fileSize>>8) & 0xff
jeroenmbed 3:df6782d01720 129 s.write(chr(hs))
jeroenmbed 3:df6782d01720 130 ls = fileSize & 0xff
jeroenmbed 3:df6782d01720 131 s.write(chr(ls))
jeroenmbed 3:df6782d01720 132 if '#' in c:
jeroenmbed 3:df6782d01720 133 print "Start sending file\n"
jeroenmbed 3:df6782d01720 134 with open(fileName, "rb") as f:
jeroenmbed 3:df6782d01720 135 byte = f.read(1)
jeroenmbed 3:df6782d01720 136 while byte != "":
jeroenmbed 3:df6782d01720 137 # while not s.writable():
jeroenmbed 3:df6782d01720 138 # pass
jeroenmbed 3:df6782d01720 139 # print "send: 0x",format(ord(byte),'02x')
jeroenmbed 3:df6782d01720 140 s.write(byte)
jeroenmbed 3:df6782d01720 141 byte = f.read(1)
jeroenmbed 3:df6782d01720 142 else:
jeroenmbed 3:df6782d01720 143 sys.stdout.write(c)
jeroenmbed 3:df6782d01720 144 */
jeroenmbed 3:df6782d01720 145
jeroenmbed 3:df6782d01720 146 /* avr test file:
jeroenmbed 3:df6782d01720 147 #define F_CPU 1000000UL // 1 MHz
jeroenmbed 3:df6782d01720 148 #include <avr/io.h>
jeroenmbed 3:df6782d01720 149 #include <util/delay.h>
jeroenmbed 3:df6782d01720 150
jeroenmbed 3:df6782d01720 151 int main(void)
jeroenmbed 3:df6782d01720 152 {
jeroenmbed 3:df6782d01720 153 // Set Port D pins as all outputs
jeroenmbed 3:df6782d01720 154 DDRD = 0xff;
jeroenmbed 3:df6782d01720 155
jeroenmbed 3:df6782d01720 156 // Set all Port D pins as HIGH
jeroenmbed 3:df6782d01720 157 while (1) {
jeroenmbed 3:df6782d01720 158 PORTD = 0xFF;
jeroenmbed 3:df6782d01720 159 _delay_ms(500.);
jeroenmbed 3:df6782d01720 160 PORTD = 0x00;
jeroenmbed 3:df6782d01720 161 _delay_ms(500.);
jeroenmbed 3:df6782d01720 162 }
jeroenmbed 3:df6782d01720 163 return 1;
jeroenmbed 3:df6782d01720 164 }
jeroenmbed 3:df6782d01720 165 */