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.
Fork of mAVRISP by
main.cpp@3:df6782d01720, 2015-01-31 (annotated)
- 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?
User | Revision | Line number | New 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 | */ |