Тем, кто хорошо во всем разбирается, дам только ссылку [1], и дальше можно не читать.
И, на всякий случай, расписываю процесс по шагам (на платформе Windows XP).
1. Скачайте AVRopendous-2009-02-10b.zip [2].
2. Распакуйте из архива 2 файла - AVRISP_Programmer.hex и LUFA AVR ISP Programmer.inf в произвольное удобное место. Файлы в архиве запрятаны в папке AVRopendous \ Firmware \ AVRISP_Programmer.
3. Подключите макетную плату AVR-USB162 к компьютеру через интерфейс USB. Если платка не чистая (в ней что-то записано, но bootloader еще не стерт), то введите платку в режим DFU Flip (активизация USB бутлоадера). Для этого нажмите кнопку SW1 RESET, удерживайте её, нажмите кнопку SW2 HWB и, удерживая её, отпустите кнопку SW1 RESET, потом отпустите SW2 HWB. После этой процедуры в операционной системе Windows должно появиться устройство LibUSB-Win32 Devices\AT90USB162 (см. в Диспетчере Устройств). Если не появилось, значит надо перепрошить bootloader (Вы его каким-то образом стерли).
Прошивка бутлоадера возможна с помощью программатора ISP. Если у Вас в чипе разрешен режим debugWire, то необходимо сначала отключить этот режим, чтобы заработал режим последовательного программирования ISP (в режиме debugWire технология Flip тоже не работает). Чтобы отключить debugWire, проделайте следующее.
- запустите AVR Studio. - подключите макетную плату с чипом AT90USB162 к JTAGICE mkII через коннектор ISP. - запустите отладку (чего угодно, хотя бы пустого проекта. У меня на этот случай заготовлена пустая болванка проекта). Build -> Rebuild All. Debug -> Start Debugging. - после того, как отладка успешно запустится, отключите debugWire. Это делается так - Debug -> JTAGICE mkII Options, закладка Connection, нажмите кнопку Disable debugWIRE. На запрос "... Would you like to disable debugWIRE?" ответьте Yes.
Если бутлоадер DFU FLIP прошит, то можно его активизировать (с помощью уже описанной процедуры с кнопками) и перейти к шагу 4. Если не вышло, то нужно стереть чип ISP-программатором, и этим же программатором залить прошивку AVRISP_Programmer.hex.
4. Запустите программную оболочку Flip (как её устанавливать и что это такое, см. [3]). В меню утилиты Flip выберите Device -> Select... -> AT90USB162. Далее выберите Settings -> Communication -> USB -> USB Port Connection -> Open. Программа должна "ожить" - все недоступные элементы управления (которые были серенькие) должны стать доступны - наше устройство AT90USB162 определилось и готово к прошивке.
5. Откройте файл прошивки AVRISP_Programmer.hex, который мы распаковали на шаге 2 - в меню выберите File -> Load HEX File..., и выберите наш файл AVRISP_Programmer.hex. В левой части окна программы должны стоять галки Erase, Program, Verify, а галка Blank Check должна быть неустановленной. Нажмите кнопку Run слева внизу. За несколько секунд наша платка прошьется.
6. Теперь можно закрыть программу Flip, отключить платку от USB и снова подключить (можно этого не делать, а просто нажать кнопку Start Application в правой нижней части окна программы Flip. Галка Reset должна быть установленной). После этого в системе обнаружится новое устройство, и будет предложено установить для него драйвер. Скормите операционной системе второй распакованный на шаге 2 файл - LUFA AVR ISP Programmer.inf. На предупреждение о неподписанных драйверах говорим "все равно установить". После этого в системе появится новое устройство - виртуальный последовательный порт (его также можно найти в Диспетчере Устройств). У меня порт установился как Ports (COM & LPT)\USB Virtual Serial Port (COM8). Запомните номер/имя порта (COM8), это понадобится для проверки работы программной оболочки программатора avrdude.
7. Теперь можно проверить, видится ли наша платка программой avrdude как программатор. Небольшое отступление для тех, что не в курсе, что такое avrdude. Это open-source проект, который представляет собой консольную программу, управляющую большим количеством существующих в мире программаторов. Avrdude можно свободно скачать из Интернета и скомпилировать, но лучше не париться, а просто взять её из пакета программ WinAVR (как ставить и что это такое [4]), она находится в папке c:\WinAVR-20080610\bin\ (циферки в имени означают просто дату сборки пакета WinAVR). Проверьте как теперь работает AVR-USB162 в качестве программатора - перейдите в папку c:\WinAVR-20080610\bin и вводите в командной строке:
c:\WinAVR-20080610\bin>avrdude -vv -F -P COM8 -c avr910 -p t261
Не случайно выделил COM8 жирным шрифтом - имя порта должно совпадать с тем, который у Вас определился на шаге 7. В ответ должны получить нечто наподобие:
avrdude: Version 5.5, compiled on Jun 9 2008 at 14:32:04
Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
System wide configuration file is "c:\WinAVR-20080610\bin\avrdude.conf"
Using Port : COM8
Using Programmer : avr910
AVR Part : ATTINY261
Chip Erase delay : 4000 us
PAGEL : PB3
BS2 : PB2
RESET disposition : dedicated
RETRY pulse : SCK
serial program mode : yes
parallel program mode : yes
Timeout : 200
StabDelay : 100
CmdexeDelay : 25
SyncLoops : 32
ByteDelay : 0
PollIndex : 3
PollValue : 0x53
Memory Detail :
Block Poll Page
Polled
Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack
----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
eeprom 65 10 4 0 no 128 4 32 4000 4000 0xff 0xff
flash 65 6 32 0 yes 2048 32 64 4500 4500 0xff 0xff
signature 0 0 0 0 no 3 0 0 0 0 0x00 0x00
lock 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
lfuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
hfuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
efuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
calibration 0 0 0 0 no 1 0 0 0 0 0x00 0x00
Programmer Type : avr910
Description : Atmel Low Cost Serial Programmer
Found programmer: Id = "AVR ISP"; type = S
Software Version = 2.3; Hardware Version = 1.0
Programmer supports auto addr increment.
Programmer supports the following devices:
Device code: 0x55 = ATtiny12
Device code: 0x56 = ATtiny15
Device code: 0x5e = ATtiny2313
Device code: 0x76 = ATMEGA8
Device code: 0x74 = ATMEGA6450
Device code: 0x72 = ATMEGA32
Device code: 0x45 = ATMEGA64
Device code: 0x74 = ATMEGA6450
Device code: 0x43 = ATMEGA128
Device code: 0x63 = ATMEGA162
Device code: 0x78 = ATMEGA169
Device code: 0x6c = AT90S4434
Device code: 0x38 = AT90S8515
Device code: 0x65 = (unknown)
avrdude: warning: selected device is not supported by programmer: t261
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.00s
avrdude: Device signature = 0xff0000
avrdude: Expected signature for ATTINY261 is 1E 91 0C
avrdude: safemode: lfuse reads as FF
avrdude: safemode: Verify error - unable to read hfuse properly. Programmer may
not be reliable.
avrdude: safemode: To protect your AVR the programming will be aborted
avrdude done. Thank you.
Все в порядке, наша платка заработала (как программатор avr910, "Atmel Low Cost Serial Programmer").
8. Теперь осталось немного поработать паяльником - спаять нехитрую схемку (цоколевка "мамы" стандартная для ISP-коннектора Atmel, и совпадает с цоколевкой коннекторов ISP макетных плат AVR-USB-MEGA16, AVR-USB-TINY45 и AVR-USB162). Хотя... назвать это схемой как-то язык не поворачивается, настолько она простая:
Вот готовое устройство в сборе. Как видно на фотографии - почти все сигналы (кроме RESET) берутся с разъема ISP платы, и нумерация контактов совпадает.
9. Подключите программируемое устройство к плате программатора. Если устройство потребляет мало тока, то питание для него можно отдельно не подсоединять, а взять прямо с коннектора ISP. При этом перемычка J3, установленная на плате программатора, будет переключать напряжение питания программируемого устройства - 5 или 3.3 вольт (иногда это может понадобиться). Я подключил для программирования плату AVR-USB-MEGA16.
Записывается прошивка в программируемую плату (firmware) следующей командой:
c:\myproject>c:\WinAVR-20080610\bin\avrdude.exe -vv -F -P COM8 -c avr910 -p m16 -U flash:w:main.hex
Перемычки (fuses) записываются следующей командой:
c:\myproject>c:\WinAVR-20080610\bin\avrdude.exe -v -F -P COM8 -c avr910 -p m16 -U hfuse:w:0x09:m -U lfuse:w:0xff:m
Немного пояснений по опциям командной строки avrdude. В этом примере я записывал в макетную плату AVR-USB-MEGA16 прошивку HID-устройства, управляющего светодиодом (файл main.hex). Он указывается в команде -U flash:w:main.hex. Здесь -U означает "универсальную" команду, которая сразу последовательно делает чтение/запись/проверку чипа. Опции -v и -vv включают подробный и более подробный вывод сообщений соответственно. Опция -F игнорирует слово сигнатуры, считываемое с чипа (оно уникальное для каждого типа чипа Atmel), что позволяет программировать даже те чипы, которые программатор типа avr910 не поддерживает. Опция -P COM8 задает порт подключения программатора (виртуальный COM-порт, о котором мы уже говорили). Опция -c avr910 задает тип программатора. Опция -p m16 задает тип программируемого чипа, в данном случае задан микроконтроллер ATmega16, который установлен на программируемой плате AVR-USB-MEGA16. Опции -U hfuse:w:0x09:m -U lfuse:w:0xff:m задают прошивку байтов фьюзов (старший байт здесь равен 09h, младший ffh).
10. В архиве AVRopendous-2009-02-10b.zip, который мы скачали на шаге 1, есть обновление конфига для avrdude, включающее поддержку чипа AT90USB162. Это обновление имеется в новом файле конфига avrdude.conf, который лежит в той же папке архива AVRopendous\Firmware\AVRISP_Programmer\. Это простой текстовый файл, удобный для чтения и редактирования. Тупо переписывать Ваш старый конфиг на новый не надо, сначала сравните их и посмотрите, чем они отличаются (возможно, Ваш конфиг более новый, и поддержка AT90USB162 там уже есть). Вот секция конфига, которая добавляет поддержку чипа AT90USB162 (можно просто её добавить текстовым редактором в Ваш старый конфигурационный файл avrdude.conf):
#------------------------------------------------------------
# AT90USB162
#------------------------------------------------------------
part
id = "usb162";
desc = "AT90USB162";
signature = 0x1e 0x94 0x82;
has_jtag = no;
chip_erase_delay = 9000;
pagel = 0xD7;
bs2 = 0xA0;
reset = dedicated;
pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1",
"x x x x x x x x x x x x x x x x";
chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0",
"x x x x x x x x x x x x x x x x";
timeout = 200;
stabdelay = 100;
cmdexedelay = 25;
synchloops = 32;
bytedelay = 0;
pollindex = 3;
pollvalue = 0x53;
predelay = 1;
postdelay = 1;
pollmethod = 1;
pp_controlstack =
0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F,
0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F,
0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B,
0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00;
hventerstabdelay = 100;
progmodedelay = 0;
latchcycles = 5;
togglevtg = 1;
poweroffdelay = 15;
resetdelayms = 1;
resetdelayus = 0;
hvleavestabdelay = 15;
chiperasepulsewidth = 0;
chiperasepolltimeout = 10;
programfusepulsewidth = 0;
programfusepolltimeout = 5;
programlockpulsewidth = 0;
programlockpolltimeout = 5;
idr = 0x31;
spmcr = 0x57;
rampz = 0x3b;
allowfullpagebitstream = no;
memory "eeprom"
paged = no; /* leave this "no" */
page_size = 4; /* for parallel programming */
size = 512;
min_write_delay = 9000;
max_write_delay = 9000;
readback_p1 = 0x00;
readback_p2 = 0x00;
read = " 1 0 1 0 0 0 0 0",
" x x x x x a10 a9 a8",
" a7 a6 a5 a4 a3 a2 a1 a0",
" o o o o o o o o";
write = " 1 1 0 0 0 0 0 0",
" x x x x x a10 a9 a8",
" a7 a6 a5 a4 a3 a2 a1 a0",
" i i i i i i i i";
loadpage_lo = " 1 1 0 0 0 0 0 1",
" 0 0 0 0 0 0 0 0",
" 0 0 0 0 0 a2 a1 a0",
" i i i i i i i i";
writepage = " 1 1 0 0 0 0 1 0",
" 0 0 x x x a10 a9 a8",
" a7 a6 a5 a4 a3 0 0 0",
" x x x x x x x x";
mode = 0x41;
delay = 10;
blocksize = 8;
readsize = 256;
;
memory "flash"
paged = yes;
size = 16384;
page_size = 128;
num_pages = 128;
min_write_delay = 4500;
max_write_delay = 4500;
readback_p1 = 0x00;
readback_p2 = 0x00;
read_lo = " 0 0 1 0 0 0 0 0",
" 0 a14 a13 a12 a11 a10 a9 a8",
" a7 a6 a5 a4 a3 a2 a1 a0",
" o o o o o o o o";
read_hi = " 0 0 1 0 1 0 0 0",
" 0 a14 a13 a12 a11 a10 a9 a8",
" a7 a6 a5 a4 a3 a2 a1 a0",
" o o o o o o o o";
loadpage_lo = " 0 1 0 0 0 0 0 0",
" x x x x x x x x",
" x a6 a5 a4 a3 a2 a1 a0",
" i i i i i i i i";
loadpage_hi = " 0 1 0 0 1 0 0 0",
" x x x x x x x x",
" x a6 a5 a4 a3 a2 a1 a0",
" i i i i i i i i";
writepage = " 0 1 0 0 1 1 0 0",
" 0 a14 a13 a12 a11 a10 a9 a8",
" a7 x x x x x x x",
" x x x x x x x x";
mode = 0x41;
delay = 6;
blocksize = 128;
readsize = 256;
;
memory "lfuse"
size = 1;
write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0",
"x x x x x x x x i i i i i i i i";
read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0",
"x x x x x x x x o o o o o o o o";
min_write_delay = 9000;
max_write_delay = 9000;
;
memory "hfuse"
size = 1;
write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0",
"x x x x x x x x i i i i i i i i";
read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0",
"x x x x x x x x o o o o o o o o";
min_write_delay = 9000;
max_write_delay = 9000;
;
memory "efuse"
size = 1;
write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0",
"x x x x x x x x x x x x i i i i";
read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0",
"x x x x x x x x o o o o o o o o";
min_write_delay = 9000;
max_write_delay = 9000;
;
memory "lock"
size = 1;
read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0",
"x x x x x x x x x x o o o o o o";
write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x",
"x x x x x x x x 1 1 i i i i i i";
min_write_delay = 9000;
max_write_delay = 9000;
;
memory "calibration"
size = 1;
read = "0 0 1 1 1 0 0 0 x x x x x x x x",
"0 0 0 0 0 0 0 0 o o o o o o o o";
;
memory "signature"
size = 3;
read = "0 0 1 1 0 0 0 0 x x x x x x x x",
"x x x x x x a1 a0 o o o o o o o o";
;
;
11. Для удобства можно воспользоваться графической оболочкой, которая есть для avrdude - avrdude-gui [5]. Установки приложение не требует - достаточно просто скачать и запустить его:
Программа почти работоспособна. Говорю почти, потому что у неё есть глюки, которые, правда, исправимы. Вот ошибки, что я нашел:
- неправильно подписана галочка для опции -F Verify the device signature. На самом деле опция -F выключает проверку сигнатуры чипа, т. е. следовало бы подписать "disable verify the device signature". - неправильно подставляется опция для записи байт фьюзов - неверно указывается шестнадцатеричный формат (без префикса 0x), и в конце опции пропускается суффикс :m.
Обе ошибки поправимы, поскольку можно вручную откорректировать строку "Command line:" перед нажатием кнопки Execute. Правильнее было бы, конечно, поправить исходный код и перекомпилировать программу.
К сожалению, к программе совсем нет справки (как водится у всех GPL-программ). Мне не удалось разобраться, что такое "GiveIO Driver" и 3 кнопки Install, Remove, Status.
[Ссылки]
1. avropendous AVR ISP Programmer (AVRdude-compatible) site:code.google.com. 2. AVRopendous-2009-02-10b.zip site:code.google.com. 3. Макетная плата AVR-USB162. 4. Разработка устройства USB - как начать работу с библиотеками AVR USB (V-USB) и libusb. 5. avrdude-gui site:sourceforge.net. |
Комментарии
microsin: насколько я понял - в случае, описанном в данной статье, этот "GiveIO Driver" никаким боком не нужен (LPT не используется).
RSS лента комментариев этой записи