Главная arrow Программирование arrow AVR arrow Как из макетки AVR-USB162 сделать ISP программатор, совместимый с avrdude Tuesday, December 12 2017  
ГлавнаяКонтактыАдминистрированиеПрограммированиеСсылки
UK-flag-ico.png English Version
GERMAN-flag-ico.png Die deutsche Version
map.gif карта сайта
нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

Поделиться:

Как из макетки AVR-USB162 сделать ISP программатор, совместимый с avrdude Версия для печати
Написал microsin   
20.04.2009

Тем, кто хорошо во всем разбирается, дам только ссылку, и дальше можно не читать - http://code.google.com/p/avropendous/wiki/AVR_ISP_Programmer.

И, на всякий случай, расписываю процесс по шагам (на платформе Windows XP).

1. Скачиваем AVRopendous-2009-02-10b.zip release по ссылке http://avropendous.googlecode.com/files/AVRopendous-2009-02-10b.zip (ссылку для скачки можно также найти на страничке http://code.google.com/p/avropendous/wiki/AVR_ISP_Programmer, она там первая).

2. Распаковываем из архива 2 файла - "AVRISP_Programmer.hex" и "LUFA AVR ISP Programmer.inf", кладем их в произвольное удобное место. Файлы в архиве запрятаны в папке AVRopendous\Firmware\AVRISP_Programmer\.

3. Подключаем макетку AVR-USB162 к компьютеру через интерфейс USB. Если платка не чистая (в ней что-то записано, но bootloader еще не стерт), то вводим платку в режим DFU Flip. Для этого нажимаем кнопку SW1 RESET, удерживаем её, нажимаем кнопку SW2 HWB и, удерживая её, отпускаем кнопку SW1 RESET, потом отпускаем SW2 HWB. После этой процедуры у нас в системе должно появиться устройство LibUSB-Win32 Devices\AT90USB162 (см. в Диспетчере Устройств). Если не появилось, значит надо перепрошить bootloader (Вы его каким-то образом стерли).

Если же у Вас в чипе разрешен режим debugWire, то необходимо сначала отключить этот режим, чтобы заработал режим последовательного программирования ISP (в режиме debugWire технология Flip тоже не работает. Как все запущено, однако!..). Чтобы отключить debugWire делаем следующее.
- запускаем AVR Studio.
- подключаем платку макетки с чипом AT90USB162 к JTAGICE mkII
- запускаем отладку (чего угодно, хотя бы пустого проекта. У меня на этот случай заготовлена пустая болванка проекта). Build -> Rebuild All. Debug -> Start Debugging.
- после того, как отладка успешно запустится, отключаем debugWire. Это делается так - Debug -> JTAGICE mkII Options, закладка Connection, жмем кнопку Disable debugWIRE. На запрос "... Would you like to disable debugWIRE?" отвечаем Yes. 

После этого можно попытаться войти в режим Flip (ранее указанной процедурой с кнопками) и перейти к шагу 4. Если не вышло, то стереть чип ISP-программатором, и этим же программатором залить прошивку AVRISP_Programmer.hex.

4. Запускаем программную оболочку Flip (как её устанавливать и что это такое, см. тут - http://microsin.ru/content/view/685/44/. В меню выбираем 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 (как ставить и что это такое, см. тут - http://microsin.ru/content/view/613/44/), она находится в папке c:\WinAVR-20080610\bin\ (циферки в имени означают просто дату сборки пакета WinAVR). Проверяем, работает ли наша платка как программатор (переходим в папку 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  Max
W   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ---
-- ---------
           eeprom        65    10     4    0 no        128    4     32  4000  40
00 0xff 0xff
           flash         65     6    32    0 yes      2048   32     64  4500  45
00 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  45
00 0x00 0x00
           lfuse          0     0     0    0 no          1    0      0  4500  45
00 0x00 0x00
           hfuse          0     0     0    0 no          1    0      0  4500  45
00 0x00 0x00
           efuse          0     0     0    0 no          1    0      0  4500  45
00 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, и совпадает с цоколевкой коннекторов макеток AVR-USB-MEGA16, AVR-USB-TINY45 и AVR-USB162). Хотя... назвать это схемой как-то язык не поворачивается, настолько она простая:
AVR_ISP_Programmer01.JPG

Вот готовое устройство в сборе. Как видно на фотографии - почти все сигналы (кроме RESET) берутся с разъема ISP платы, и нумерация контактов совпадает.
AVR_ISP_Programmer02_IMG_8354.jpg

9. Подключаем программируемое устройство к плате программатора. Если устройство потребляет мало тока, то питание для него можно отдельно не подсоединять, а взять прямо с коннектора ISP. При этом перемычка J3, установленная на плате программатора, будет переключать напряжение питания программируемого устройства - 5 или 3.3 вольт (иногда это может понадобиться). Я подключил для программирования плату AVR-USB-MEGA16.

 AVR_ISP_Programmer03_IMG_8340.jpg  AVR_ISP_Programmer04_IMG_8358.jpg

Записываем прошивку в программируемую плату (firmware) следующей командой:
c:\asm\avrusb-20080513\examples\hid-custom-rq\firmware>c:\WinAVR-20080610\bin\avrdude.exe -vv -F -P COM8 -c avr910 -p m16 -U flash:w:main.hex 

Записываем перемычки (fuses) следующей командой:
c:\asm\avrusb-20080513\examples\hid-custom-rq\firmware>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, см. http://sourceforge.net/projects/avrdude-gui/, там же найдете ссылку на загрузку. Установки приложение не требует - достаточно просто запустить его:
avrdude-gui01.JPG
Программа почти работоспособна. Говорю почти, потому что у неё есть глюки, которые, правда, исправимы. Вот ошибки, что я нашел:
- неправильно подписана галочка для опции -F Verify the device signature. На самом деле опция -F выключает проверку сигнатуры чипа, т. е. следовало бы подписать "disable verify the device signature".
- неправильно подставляется опция для записи байт фьюзов - неверно указывается шестнадцадцатеричный формат (без префикса 0x), и в конце опции пропускается суффикс :m.

Обе ошибки поправимы, поскольку можно вручную откорректировать строку "Command line:" перед нажатием кнопки Execute. Правильнее было бы, конечно, поправить исходный код и перекомпилировать программу.

К сожалению, к программе совсем нет справки (как водится у всех GPL-программ). Мне не удалось разобраться, что такое "GiveIO Driver" и 3 кнопки Install, Remove, Status.

Последнее обновление ( 15.05.2010 )
 

Комментарии  

  1. #2 Денис
    2013-01-3020:38:36 Подключил AVR-USB162, в системе нормально определяется, как Атмел УСБ. Вроде с этим всё нормально. Скачал прошивку, чтобы сделать ISP программатор, влил её. На всякий случай прочитал записанное ещё раз, посмотрел что у Флипа в буфере (чтобы убедится,что записалась). Жму Start Application и ничего. В ДУ ничего виртуального не появляется. Чтобы снова иметь доступ к платке, делаю как в ответе на вопрос QUES003. Снова перепрошиваю макетку, предварительно стерев. И опять двадцать пять. Чего забыл или не так сделал? Программатор первый и пока единственный

    microsin: Вы пытаетесь задавать вопросы про статью 4-летней давности, да еще задаете их так, что никакой чудо-телепат не догадается, что на самом деле у Вас происходит, и что Вы делаете не так. Может быть все что угодно, к примеру частота кварца не подходит к Вашей прошивке. Маленький совет - сделайте лучше из Вашей макетки AVR-USB162 клон программатора AVRISP-mkII. В интернете полно информации, как это сделать.
  2. #1 Angell
    2009-10-0616:22:41 GiveIO Driver - это драйвер доступа к портам. Он необходим в NT системах. В общем если он не стоит, то общаться с lpt портом не получится.

    microsin: насколько я понял - в случае, описанном в данной статье, этот "GiveIO Driver" никаким боком не нужен (LPT не используется).

Добавить комментарий

:D:lol::-);-)8):-|:-*:oops::sad::cry::o:-?:-x:eek::zzz:P:roll::sigh:

Защитный код
Обновить

< Пред.   След. >

Top of Page
 
microsin © 2017