"Сердцем" Bit-Bang программатора является микросхема FD232RL (та самая, которая связывает через USB, Arduino с компьютером). Микроконтроллер ATmega никакого участия в процессе программирования не принимает, на его место мы ставим чистый и не прошитый котроллер, который будем пробовать запрограммировать .
Для данного программатора подойдут только USB версии Arduino, на которых разведен разъем X3. Разьем выделил красным цветом на фотографии.
Для сборки Вам потребуются разъемы 1x4, 2x6 и несколько проводов. Можно использовать, например пару Audio-кабелей от CD-ROM – у них удобные разборные разъемы, и в таком случае можно обойтись даже без паяльника.
Работа с программатором Arduino Bit-Bang
В состав пакета WinAVR входит мощная утилита AVRDUDE. Она позволяет
загружать программы и данные в память микроконтроллера, а также
считывать их оттуда. AVRDUDE использует SPI-интерфейс. Существуют
версии для Windows и Linux.
Скачайте архив с с программой avrdude. Распакуйте архив в какую-нибудь папку.
Подсоедините программатор к USB порту.
В режиме командной строки перейдите в папку с avrdude. Теперь можно запускать avrdude с соответствующими ключами:
-q - уменьшает объем выводимой на экран отладочной информации
-C avrdude.conf - указывает расположение .conf файла (в нашем случае он в той же папке)
-p m168 - выбор типа микроконтроллера ATmega168
-c diecimila - выбор программатора (он описан под таким именем в .conf файле)
-P ft0 - выбор порта. Выбрано первое устройство с чипом FTDI
-e - Команда на предварительную очистку памяти программ
-U flash:w:ATmegaBOOT_168_diecimila.hex - указывает на .hex файл с прошивкой
22.10.2009, 09:06
il74
Re: Программатор из Arduino
Вот решил здесь написать. У меня почему то не получается программатор данным способом (не знаю почем?), пробовал прошить ATmega8, использовал другой метод (прошивка в программе Arduino IDE 0017)с ним bootloader шьется на ура (не забывать про настройки в программе Arduino IDE 0017), но потом все, дальше стандартные прошивки заливаются (arduino) а вот прошивки для WinAVR и AVRStudio - нет, хотя там используется тот же язык, но все время натыкаюсь на ошибки и никак не могу их преодолеть (пытаюсь залить прошивку вот отсюда) Подскажите без программатора уже не залить? не может ли влиять разница в кварцевых резонатарах по схеме 14, 7456МГц, а в ардуино -16 МГц или же просто надо где то подправить какой-то код?
22.10.2009, 11:55
Chip
Re: Программатор из Arduino
А ты возьми HEX фаил созданый в AVRStudio и им прошей при помощи программы AVRDUDE она идет в комплекте с Arduino IDE 0017
22.10.2009, 12:21
il74
Re: Программатор из Arduino
Цитата:
Сообщение от Chip
А ты возьми HEX фаил созданый в AVRStudio и им прошей при помощи программы AVRDUDE она идет в комплекте с Arduino IDE 0017
В том то и дело что пробовал я данным способом, и даже брал AVRDUDE ССG с виндой который дружит, но после заливки HEX файла все ATmega8 в ауте, то есть уже Fuse блоки не читаются из чего я делаю выводы. что она глюкнула, но после повторной заливки бутлоадера она опять все воспринимает. наверное руки неотдуда растут :)
22.10.2009, 12:30
Chip
Re: Программатор из Arduino
Ну так если после второй заливки все работает, зачем себе голову забивать :)
22.10.2009, 13:28
il74
Re: Программатор из Arduino
Цитата:
Сообщение от Chip
Ну так если после второй заливки все работает, зачем себе голову забивать :)
Извини Chip, может я не правильно изъяснился, никак правильно не заливаются вышеуказанные прошивки :confused:, остался только через программатор или LPT порт, а те прошивки (*.pde), что чисто для Arduino идут на ура:)
22.10.2009, 14:02
Chip
Re: Программатор из Arduino
У меня все заливается по вышеуказаной методике.
Я про pde yничего не писал , hex имею ввиду.
22.10.2009, 19:07
il74
Re: Программатор из Arduino
Цитата:
Сообщение от Chip
У меня все заливается по вышеуказаной методике.
Я про pde yничего не писал , hex имею ввиду.
я и говорю что после заливки HEX файлов ( например вот отсюда http://www.softservice.com.pl/corolla/avc/simpleaux.php), то все ATmega8 в ауте, и уже ничего не воспринимает ( не читается не заливается), только если с нуля все затереть и залить Bootloader то работает как ARDUINO, но как мне надо не работает, я все таки думаю что виной кварц (по схеме 14, 756 Мгц, а в ArDUINO - 16 МГц) буду собирать программатор на LPT +4 резистора на 150 ОМ
23.10.2009, 10:10
s705
Re: Программатор из Arduino
Цитата:
Сообщение от il74
я и говорю что после заливки HEX файлов ( например вот отсюда http://www.softservice.com.pl/corolla/avc/simpleaux.php), то все ATmega8 в ауте, и уже ничего не воспринимает ( не читается не заливается), только если с нуля все затереть и залить Bootloader то работает как ARDUINO, но как мне надо не работает, я все таки думаю что виной кварц (по схеме 14, 756 Мгц, а в ArDUINO - 16 МГц) буду собирать программатор на LPT +4 резистора на 150 ОМ
Да не запускается из за кварца, но 5 проводков тебе тоже не помогут. Дело в том что в прошивке у тебя указано 14, 756 и ее надо править на 16000.
25.10.2009, 19:42
il74
Re: Программатор из Arduino
Цитата:
Сообщение от s705
Да не запускается из за кварца, но 5 проводков тебе тоже не помогут. Дело в том что в прошивке у тебя указано 14, 756 и ее надо править на 16000.
Все не так:), я собрал на макетке схему вот отсюда http://www.softservice.com.pl/corolla/avc/simpleaux.php, и мне нужно прошить Atmegу, а программатора нет, поэтому решил попробовать прошить ее на Ардуино, используюя ее в качетчве ардуино, но получается программировать только для самого Carduino:).
25.10.2009, 19:52
Chip
Re: Программатор из Arduino
Не проблема , я ардуиной прошивал контроллеры Atmega, нужно только в конфигурации указывать тип контроллера, за это отвечает ключ -p
30.12.2009, 12:25
(vS)
Re: Программатор из Arduino
Цитата:
Сообщение от Chip
-U flash:w:ATmegaBOOT_168_diecimila.hex - указывает на .hex файл с прошивкой
а под МЕГА8 случайно нет лоадера?
30.12.2009, 12:58
KotKin
Re: Программатор из Arduino
есть. он идет в комплекте с прогой Arduinio IDE и лежит в папке arduino-0017\hardware\bootloaders\atmega8
// this sketch turns the Arduino into a AVRISP
// using the following pins:
// 10: slave reset
// 11: MOSI
// 12: MISO
// 13: SCK
// Put an LED (with resistor) on the following pins:
// 9: Heartbeat - shows the programmer is running
// 8: Error - Lights up if something goes wrong (use red if that makes sense)
// 7: Programming - In communication with the slave
//
// February 2009 by Randall Bohn
// - Added support for writing to EEPROM (what took so long?)
// Windows users should consider WinAVR's avrdude instead of the
// avrdude included with Arduino software.
//
// January 2008 by Randall Bohn
// - Thanks to Amplificar for helping me with the STK500 protocol
// - The AVRISP/STK500 (mk I) protocol is used in the arduino bootloader
// - The SPI functions herein were developed for the AVR910_ARD programmer
// - More information at http://code.google.com/p/mega-isp
int error=0;
int pmode=0;
// address for reading and writing, set by 'U' command
int here;
uint8_t buff[256]; // global block storage
#define beget16(addr) (*addr * 256 + *(addr+1) )
typedef struct param {
uint8_t devicecode;
uint8_t revision;
uint8_t progtype;
uint8_t parmode;
uint8_t polling;
uint8_t selftimed;
uint8_t lockbytes;
uint8_t fusebytes;
int flashpoll;
int eeprompoll;
int pagesize;
int eepromsize;
int flashsize;
}
parameter;
parameter param;
// this provides a heartbeat on pin 9, so you can tell the software is running.
uint8_t hbval=128;
int8_t hbdelta=8;
void heartbeat() {
if (hbval > 192) hbdelta = -hbdelta;
if (hbval < 32) hbdelta = -hbdelta;
hbval += hbdelta;
analogWrite(LED_HB, hbval);
delay(40);
}
void loop(void) {
// is pmode active?
if (pmode) digitalWrite(LED_PMODE, HIGH);
else digitalWrite(LED_PMODE, LOW);
// is there an error?
if (error) digitalWrite(LED_ERR, HIGH);
else digitalWrite(LED_ERR, LOW);
// light the heartbeat LED
heartbeat();
if (Serial.available()) {
avrisp();
}
}
uint8_t getch() {
while(!Serial.available());
return Serial.read();
}
void readbytes(int n) {
for (int x = 0; x < n; x++) {
buff[x] = Serial.read();
}
}
#define PTIME 30
void pulse(int pin, int times) {
do {
digitalWrite(pin, HIGH);
delay(PTIME);
digitalWrite(pin, LOW);
delay(PTIME);
}
while (times--);
}
void breply(uint8_t b) {
if (CRC_EOP == getch()) {
Serial.print((char)STK_INSYNC);
Serial.print((char)b);
Serial.print((char)STK_OK);
}
else {
Serial.print((char)STK_NOSYNC);
}
}
void get_version(uint8_t c) {
switch(c) {
case 0x80:
breply(HWVER);
break;
case 0x81:
breply(SWMAJ);
break;
case 0x82:
breply(SWMIN);
break;
case 0x93:
breply('S'); // serial programmer
break;
default:
breply(0);
}
}
void set_parameters() {
// call this after reading paramter packet into buff[]
param.devicecode = buff[0];
param.revision = buff[1];
param.progtype = buff[2];
param.parmode = buff[3];
param.polling = buff[4];
param.selftimed = buff[5];
param.lockbytes = buff[6];
param.fusebytes = buff[7];
param.flashpoll = buff[8];
// ignore buff[9] (= buff[8])
//getch(); // discard second value
// WARNING: not sure about the byte order of the following
// following are 16 bits (big endian)
param.eeprompoll = beget16(&buff[10]);
param.pagesize = beget16(&buff[12]);
param.eepromsize = beget16(&buff[14]);
//#define _current_page(x) (here & 0xFFFFE0)
int current_page(int addr) {
if (param.pagesize == 32) return here & 0xFFFFFFF0;
if (param.pagesize == 64) return here & 0xFFFFFFE0;
if (param.pagesize == 128) return here & 0xFFFFFFC0;
if (param.pagesize == 256) return here & 0xFFFFFF80;
return here;
}
uint8_t write_flash(int length) {
if (param.pagesize < 1) return STK_FAILED;
//if (param.pagesize != 64) return STK_FAILED;
int page = current_page(here);
int x = 0;
while (x < length) {
if (page != current_page(here)) {
commit(page);
page = current_page(here);
}
flash(LOW, here, buff[x++]);
flash(HIGH, here, buff[x++]);
here++;
}
commit(page);
return STK_OK;
}
uint8_t write_eeprom(int length) {
// here is a word address, so we use here*2
// this writes byte-by-byte,
// page writing may be faster (4 bytes at a time)
for (int x = 0; x < length; x++) {
spi_transaction(0xC0, 0x00, here*2+x, buff[x]);
delay(45);
}
return STK_OK;
}
void program_page() {
char result = (char) STK_FAILED;
int length = 256 * getch() + getch();
if (length > 256) {
Serial.print((char) STK_FAILED);
return;
}
char memtype = getch();
for (int x = 0; x < length; x++) {
buff[x] = getch();
}
if (CRC_EOP == getch()) {
Serial.print((char) STK_INSYNC);
if (memtype == 'F') result = (char)write_flash(length);
if (memtype == 'E') result = (char)write_eeprom(length);
Serial.print(result);
}
else {
Serial.print((char) STK_NOSYNC);
}
}
uint8_t flash_read(uint8_t hilo, int addr) {
return spi_transaction(0x20 + hilo * 8,
(addr >> 8) & 0xFF,
addr & 0xFF,
0);
}
char flash_read_page(int length) {
for (int x = 0; x < length; x+=2) {
uint8_t low = flash_read(LOW, here);
Serial.print((char) low);
uint8_t high = flash_read(HIGH, here);
Serial.print((char) high);
here++;
}
return STK_OK;
}
char eeprom_read_page(int length) {
// here again we have a word address
for (int x = 0; x < length; x++) {
uint8_t ee = spi_transaction(0xA0, 0x00, here*2+x, 0xFF);
Serial.print((char) ee);
}
return STK_OK;
}
void read_page() {
char result = (char)STK_FAILED;
int length = 256 * getch() + getch();
char memtype = getch();
if (CRC_EOP != getch()) {
Serial.print((char) STK_NOSYNC);
return;
}
Serial.print((char) STK_INSYNC);
if (memtype == 'F') result = flash_read_page(length);
if (memtype == 'E') result = eeprom_read_page(length);
Serial.print(result);
return;
}
//////////////////////////////////////////
//////////////////////////////////////////
////////////////////////////////////
////////////////////////////////////
int avrisp() {
uint8_t data, low, high;
uint8_t ch = getch();
switch (ch) {
case '0': // signon
empty_reply();
break;
case '1':
if (getch() == CRC_EOP) {
Serial.print((char) STK_INSYNC);
Serial.print("AVR ISP");
Serial.print((char) STK_OK);
}
break;
case 'A':
get_version(getch());
break;
case 'B':
readbytes(20);
set_parameters();
empty_reply();
break;
case 'E': // extended parameters - ignore for now
readbytes(5);
empty_reply();
break;
case 'P':
start_pmode();
empty_reply();
break;
case 'U':
here = getch() + 256 * getch();
empty_reply();
break;
case 0x60: //STK_PROG_FLASH
low = getch();
high = getch();
empty_reply();
break;
case 0x61: //STK_PROG_DATA
data = getch();
empty_reply();
break;
case 0x64: //STK_PROG_PAGE
program_page();
break;
case 0x74: //STK_READ_PAGE
read_page();
break;
case 'V':
universal();
break;
case 'Q':
error=0;
end_pmode();
empty_reply();
break;
// expecting a command, not CRC_EOP
// this is how we can get back in sync
case CRC_EOP:
Serial.print((char) STK_NOSYNC);
break;
// anything else we will return STK_UNKNOWN
default:
if (CRC_EOP == getch())
Serial.print((char)STK_UNKNOWN);
else
Serial.print((char)STK_NOSYNC);
}
}
avrdude.exe: BitBang OK
avrdude.exe: pin assign miso 3 sck 5 mosi 6 reset 7
avrdude.exe: drain OK
ft245r: bitclk 230400 -> ft baud 115200
avrdude.exe: ft245r_program_enable: failed
avrdude.exe: initialization failed, rc=-1
Double check connections and try again, or use -F to override
this check.
avrdude.exe done. Thank you.
Соответственно перепроверил соединения - ошибки быть не может. Также пробовал прошить через оболочку Arduino (версия 0018) - нет пункта меню Tools > Burn Bootloader > w/ FTDI Bitbang(метод описан здесь: http://www.geocities.jp/arduino_diec..._w_ide_en.html)
Как быть? Найти плату-прошивальщик, другую ардуину или спаять программатор самому не представляется возможным - познания в построении устройств заканчиваются на знаниях "что куда подключить", да и то по руководству. Я программист. Спасите-помогите, пытливый ум хочет чего-нить сотворить....
А интересно если в ставить в Arduino Duemilanova Atmega8 будет работать или нет ?
02.11.2010, 22:06
Chip
Re: Программатор из Arduino
Если прошить соответствующий бутлодер, то конечно будет работать
03.11.2010, 01:44
dragon
Re: Программатор из Arduino
Цитата:
Сообщение от SpawnUA
Попробовал, вот:
Device signature = 0xffffff
Судя по всему проверка не прошла :(
Нет контакта между мегой и программатором. При контрольном считывании - считывается висящий в воздухе контакт с уровнем логической 1.
проверь соединения между ножками микросхем
06.11.2010, 13:56
ParadoX_Tver
Re: Программатор из Arduino
Ну я так понимаю прошивка бута это ещё не всё. Подскажите как выставить fuse ?
18.03.2011, 00:45
Chip
Re: Программатор из Arduino
Для владельцев Arduino Nano.
Имея одну прошитую Carduino можно сделать из нее программатор
Подробности здесь
26.05.2011, 17:56
ASSAD
Re: Программатор из Arduino
Как прошить carduinom nano V5 ... микроконтроллер Attiny 2313, если можно схему?
27.05.2011, 00:34
SBorovkov
Re: Программатор из Arduino
точно так же как и ардуину. Нужно подсоединить mosi miso sck reset Vcc gnd. Первые 4 вывода - разъем X3. питание - с выводов arduino.
У нано очень неудобно расположен разъем X3, но если хорошенько прицелиться, припаяться можно.
27.05.2011, 01:30
ASSAD
Re: Программатор из Arduino
А не схему не могли бы нарисовать? а то я в этих штучках не очень разбираюсь?
Вот такой скетч пойдет
Код HTML:
// this sketch turns the Arduino into a AVRISP
// using the following pins:
// 10: slave reset
// 11: MOSI
// 12: MISO
// 13: SCK
// Put an LED (with resistor) on the following pins:
// 9: Heartbeat - shows the programmer is running
// 8: Error - Lights up if something goes wrong (use red if that makes sense)
// 7: Programming - In communication with the slave
//
// October 2010 by Randall Bohn
// - Write to EEPROM > 256 bytes
// - Better use of LEDs:
// -- Flash LED_PMODE on each flash commit
// -- Flash LED_PMODE while writing EEPROM (both give visual feedback of writing progress)
// - Light LED_ERR whenever we hit a STK_NOSYNC. Turn it off when back in sync.
//
// October 2009 by David A. Mellis
// - Added support for the read signature command
//
// February 2009 by Randall Bohn
// - Added support for writing to EEPROM (what took so long?)
// Windows users should consider WinAVR's avrdude instead of the
// avrdude included with Arduino software.
//
// January 2008 by Randall Bohn
// - Thanks to Amplificar for helping me with the STK500 protocol
// - The AVRISP/STK500 (mk I) protocol is used in the arduino bootloader
// - The SPI functions herein were developed for the AVR910_ARD programmer
// - More information at http://code.google.com/p/mega-isp
int error=0;
int pmode=0;
// address for reading and writing, set by 'U' command
int here;
uint8_t buff[256]; // global block storage
#define beget16(addr) (*addr * 256 + *(addr+1) )
typedef struct param {
uint8_t devicecode;
uint8_t revision;
uint8_t progtype;
uint8_t parmode;
uint8_t polling;
uint8_t selftimed;
uint8_t lockbytes;
uint8_t fusebytes;
int flashpoll;
int eeprompoll;
int pagesize;
int eepromsize;
int flashsize;
}
parameter;
parameter param;
// this provides a heartbeat on pin 9, so you can tell the software is running.
uint8_t hbval=128;
int8_t hbdelta=8;
void heartbeat() {
if (hbval > 192) hbdelta = -hbdelta;
if (hbval < 32) hbdelta = -hbdelta;
hbval += hbdelta;
analogWrite(LED_HB, hbval);
delay(40);
}
void loop(void) {
// is pmode active?
if (pmode) digitalWrite(LED_PMODE, HIGH);
else digitalWrite(LED_PMODE, LOW);
// is there an error?
if (error) digitalWrite(LED_ERR, HIGH);
else digitalWrite(LED_ERR, LOW);
// light the heartbeat LED
heartbeat();
if (Serial.available()) {
avrisp();
}
}
uint8_t getch() {
while(!Serial.available());
return Serial.read();
}
void fill(int n) {
for (int x = 0; x < n; x++) {
buff[x] = getch();
}
}
#define PTIME 30
void pulse(int pin, int times) {
do {
digitalWrite(pin, HIGH);
delay(PTIME);
digitalWrite(pin, LOW);
delay(PTIME);
}
while (times--);
}
void prog_lamp(int state) {
if (PROG_FLICKER)
digitalWrite(LED_PMODE, state);
}
void breply(uint8_t b) {
if (CRC_EOP == getch()) {
Serial.print((char)STK_INSYNC);
Serial.print((char)b);
Serial.print((char)STK_OK);
}
else {
error++;
Serial.print((char)STK_NOSYNC);
}
}
void get_version(uint8_t c) {
switch(c) {
case 0x80:
breply(HWVER);
break;
case 0x81:
breply(SWMAJ);
break;
case 0x82:
breply(SWMIN);
break;
case 0x93:
breply('S'); // serial programmer
break;
default:
breply(0);
}
}
//#define _current_page(x) (here & 0xFFFFE0)
int current_page(int addr) {
if (param.pagesize == 32) return here & 0xFFFFFFF0;
if (param.pagesize == 64) return here & 0xFFFFFFE0;
if (param.pagesize == 128) return here & 0xFFFFFFC0;
if (param.pagesize == 256) return here & 0xFFFFFF80;
return here;
}
uint8_t write_flash_pages(int length) {
int x = 0;
int page = current_page(here);
while (x < length) {
if (page != current_page(here)) {
commit(page);
page = current_page(here);
}
flash(LOW, here, buff[x++]);
flash(HIGH, here, buff[x++]);
here++;
}
commit(page);
return STK_OK;
}
#define EECHUNK (32)
uint8_t write_eeprom(int length) {
// here is a word address, get the byte address
int start = here * 2;
int remaining = length;
if (length > param.eepromsize) {
error++;
return STK_FAILED;
}
while (remaining > EECHUNK) {
write_eeprom_chunk(start, EECHUNK);
start += EECHUNK;
remaining -= EECHUNK;
}
write_eeprom_chunk(start, remaining);
return STK_OK;
}
// write (length) bytes, (start) is a byte address
uint8_t write_eeprom_chunk(int start, int length) {
// this writes byte-by-byte,
// page writing may be faster (4 bytes at a time)
fill(length);
prog_lamp(LOW);
for (int x = 0; x < length; x++) {
int addr = start+x;
spi_transaction(0xC0, (addr>>8) & 0xFF, addr & 0xFF, buff[x]);
delay(45);
}
prog_lamp(HIGH);
return STK_OK;
}
char flash_read_page(int length) {
for (int x = 0; x < length; x+=2) {
uint8_t low = flash_read(LOW, here);
Serial.print((char) low);
uint8_t high = flash_read(HIGH, here);
Serial.print((char) high);
here++;
}
return STK_OK;
}
char eeprom_read_page(int length) {
// here again we have a word address
int start = here * 2;
for (int x = 0; x < length; x++) {
int addr = start + x;
uint8_t ee = spi_transaction(0xA0, (addr >> 8) & 0xFF, addr & 0xFF, 0xFF);
Serial.print((char) ee);
}
return STK_OK;
}
void read_page() {
char result = (char)STK_FAILED;
int length = 256 * getch() + getch();
char memtype = getch();
if (CRC_EOP != getch()) {
error++;
Serial.print((char) STK_NOSYNC);
return;
}
Serial.print((char) STK_INSYNC);
if (memtype == 'F') result = flash_read_page(length);
if (memtype == 'E') result = eeprom_read_page(length);
Serial.print(result);
return;
}
// this sketch turns the Arduino into a AVRISP
// using the following pins:
// 10: slave reset
// 11: MOSI
// 12: MISO
// 13: SCK
// Put an LED (with resistor) on the following pins:
// 9: Heartbeat - shows the programmer is running
// 8: Error - Lights up if something goes wrong (use red if that makes sense)
// 7: Programming - In communication with the slave
//
// October 2010 by Randall Bohn
// - Write to EEPROM > 256 bytes
// - Better use of LEDs:
// -- Flash LED_PMODE on each flash commit
// -- Flash LED_PMODE while writing EEPROM (both give visual feedback of writing progress)
// - Light LED_ERR whenever we hit a STK_NOSYNC. Turn it off when back in sync.
//
// October 2009 by David A. Mellis
// - Added support for the read signature command
//
// February 2009 by Randall Bohn
// - Added support for writing to EEPROM (what took so long?)
// Windows users should consider WinAVR's avrdude instead of the
// avrdude included with Arduino software.
//
// January 2008 by Randall Bohn
// - Thanks to Amplificar for helping me with the STK500 protocol
// - The AVRISP/STK500 (mk I) protocol is used in the arduino bootloader
// - The SPI functions herein were developed for the AVR910_ARD programmer
// - More information at http://code.google.com/p/mega-isp
int error=0;
int pmode=0;
// address for reading and writing, set by 'U' command
int here;
uint8_t buff[256]; // global block storage
#define beget16(addr) (*addr * 256 + *(addr+1) )
typedef struct param {
uint8_t devicecode;
uint8_t revision;
uint8_t progtype;
uint8_t parmode;
uint8_t polling;
uint8_t selftimed;
uint8_t lockbytes;
uint8_t fusebytes;
int flashpoll;
int eeprompoll;
int pagesize;
int eepromsize;
int flashsize;
}
parameter;
parameter param;
// this provides a heartbeat on pin 9, so you can tell the software is running.
uint8_t hbval=128;
int8_t hbdelta=8;
void heartbeat() {
if (hbval > 192) hbdelta = -hbdelta;
if (hbval < 32) hbdelta = -hbdelta;
hbval += hbdelta;
analogWrite(LED_HB, hbval);
delay(40);
}
void loop(void) {
// is pmode active?
if (pmode) digitalWrite(LED_PMODE, HIGH);
else digitalWrite(LED_PMODE, LOW);
// is there an error?
if (error) digitalWrite(LED_ERR, HIGH);
else digitalWrite(LED_ERR, LOW);
// light the heartbeat LED
heartbeat();
if (Serial.available()) {
avrisp();
}
}
uint8_t getch() {
while(!Serial.available());
return Serial.read();
}
void fill(int n) {
for (int x = 0; x < n; x++) {
buff[x] = getch();
}
}
#define PTIME 30
void pulse(int pin, int times) {
do {
digitalWrite(pin, HIGH);
delay(PTIME);
digitalWrite(pin, LOW);
delay(PTIME);
}
while (times--);
}
void prog_lamp(int state) {
if (PROG_FLICKER)
digitalWrite(LED_PMODE, state);
}
void breply(uint8_t b) {
if (CRC_EOP == getch()) {
Serial.print((char)STK_INSYNC);
Serial.print((char)b);
Serial.print((char)STK_OK);
}
else {
error++;
Serial.print((char)STK_NOSYNC);
}
}
void get_version(uint8_t c) {
switch(c) {
case 0x80:
breply(HWVER);
break;
case 0x81:
breply(SWMAJ);
break;
case 0x82:
breply(SWMIN);
break;
case 0x93:
breply('S'); // serial programmer
break;
default:
breply(0);
}
}
//#define _current_page(x) (here & 0xFFFFE0)
int current_page(int addr) {
if (param.pagesize == 32) return here & 0xFFFFFFF0;
if (param.pagesize == 64) return here & 0xFFFFFFE0;
if (param.pagesize == 128) return here & 0xFFFFFFC0;
if (param.pagesize == 256) return here & 0xFFFFFF80;
return here;
}
uint8_t write_flash_pages(int length) {
int x = 0;
int page = current_page(here);
while (x < length) {
if (page != current_page(here)) {
commit(page);
page = current_page(here);
}
flash(LOW, here, buff[x++]);
flash(HIGH, here, buff[x++]);
here++;
}
commit(page);
return STK_OK;
}
#define EECHUNK (32)
uint8_t write_eeprom(int length) {
// here is a word address, get the byte address
int start = here * 2;
int remaining = length;
if (length > param.eepromsize) {
error++;
return STK_FAILED;
}
while (remaining > EECHUNK) {
write_eeprom_chunk(start, EECHUNK);
start += EECHUNK;
remaining -= EECHUNK;
}
write_eeprom_chunk(start, remaining);
return STK_OK;
}
// write (length) bytes, (start) is a byte address
uint8_t write_eeprom_chunk(int start, int length) {
// this writes byte-by-byte,
// page writing may be faster (4 bytes at a time)
fill(length);
prog_lamp(LOW);
for (int x = 0; x < length; x++) {
int addr = start+x;
spi_transaction(0xC0, (addr>>8) & 0xFF, addr & 0xFF, buff[x]);
delay(45);
}
prog_lamp(HIGH);
return STK_OK;
}
char flash_read_page(int length) {
for (int x = 0; x < length; x+=2) {
uint8_t low = flash_read(LOW, here);
Serial.print((char) low);
uint8_t high = flash_read(HIGH, here);
Serial.print((char) high);
here++;
}
return STK_OK;
}
char eeprom_read_page(int length) {
// here again we have a word address
int start = here * 2;
for (int x = 0; x < length; x++) {
int addr = start + x;
uint8_t ee = spi_transaction(0xA0, (addr >> 8) & 0xFF, addr & 0xFF, 0xFF);
Serial.print((char) ee);
}
return STK_OK;
}
void read_page() {
char result = (char)STK_FAILED;
int length = 256 * getch() + getch();
char memtype = getch();
if (CRC_EOP != getch()) {
error++;
Serial.print((char) STK_NOSYNC);
return;
}
Serial.print((char) STK_INSYNC);
if (memtype == 'F') result = flash_read_page(length);
if (memtype == 'E') result = eeprom_read_page(length);
Serial.print(result);
return;
}
Но при желании можно самому написать программу и скетч для прошивки Flash микросхем
07.09.2011, 12:58
BlkDem
Re: Программатор из Arduino
Ниасилю на текущем этапе развития :(
Собрал "шило" для LPT. Работает. Но хотелось по-универсальнее что-то...
29.10.2011, 01:02
XsanderS
Re: Программатор из Arduino
А че ATMEGA 328 с помощью avrdude не прошить? Кстати в IDE arduino есть функция в закладках Tools типа BrunBootloader. Я так понемаю достаточно воткнуть чистую атмегу в Arduino, соеденить разем х3 с пинами Atmega, выбрать в Tools->Board нужный борт, в данном случае Duemilanove or Nano /w Atmega 328 и остается только хлопать в ладоши? или я не правильно понял?
27.11.2011, 07:25
mebitek
Re: Программатор из Arduino
Это так?
А то я моск себе уже вскрыл????????????????????????
27.11.2011, 09:07
mebitek
Re: Программатор из Arduino
А то покупаешь за 1300 у нас в ниф-нипе, тдык она ещё и не шьнтся!!!!!
27.11.2011, 10:00
mebitek
Re: Программатор из Arduino
Нфига это схема не работает!!!!!!!!!!!!!!!!!!!!!!!!
тыщы раз роверял!!!!!!!!!!!!!!!!!