9 февраля 2014 г.

Первый уровень

это наброски
_________________________________________________





Первое подключение программатора к компу, настройка прав доступа

Итак, первое подключение программатора к компу. Программатор никак еще не модернизирован, все в заводском виде. Подключаем и проверяем, как видится он на шине USB ...

$ lsusb
Bus 002 Device 006: ID 16c0:05dc VOTI shared ID for use with libusb

Кажется все в порядке, среди прочих строк видим и наш ID 16c0:05dc. 16с0 - это код производителя, а 05dc - это код устройства. USBasp так и должен определяться системой.



Теперь пробуем запустить утилиту для работы с программатором - avrdude (не подключая никакого микроконтроллера, и даже не имея файла с прошивкой)

$ avrdude -p t2313 -c usbasp -U flash:w:Example.hex
avrdude: Warning: cannot query manufacturer for device: error sending control message: Operation not permitted
avrdude: error: could not find USB device "USBasp" with vid=0x16c0 pid=0x5dc

Выдается ошибка на отсутствие прав доступа. Исправим это. Нужно создать файл с правилом для udev, файл должен располагаться тут:
       /etc/udev/rules.d/10-usbasp.rules

в нем должна быть строка описывающая само правило:
SUBSYSTEM=="usb", SYSFS{idVendor}=="16c0", SYSFS{idProduct}=="05dc", GROUP="adm", MODE="0666"

Она означает, что мы дали пользователям, входящим в группу adm, права доступа 666 (запись и чтение) к устройству 16c0:05dc. На моем LinuxMint 15 пользователь под которым я работаю уже входил в группу adm (администраторы), поэтому в правиле указал именно её. Прописывание группы users и добавление себя в неё (как многие советуют) желаемого результата не давало, без sudo не запускалось :(

Итого, нам требуется дать в консоле такую команду:
$ echo 'SUBSYSTEM=="usb", SYSFS{idVendor}=="16c0", SYSFS{idProduct}=="05dc", GROUP="adm", MODE="0666"' | sudo tee /etc/udev/rules.d/10-usbasp.rules

Перезапустим сервис udev, чтобы правило вступило в силу:
$ sudo restart udev


Отсоединяем USBasp от порта, выходим из учетки, потом заходим снова и подсоединяем USBasp. Avrdude должен начать запускаться без sudo. [смутно помню потребовалось ли выходить из учетки, или после рестарта udev все уже заработало...]







Пробуем работать с avrdude
Подключаем любой МК, попробуем считать его сигнатуру:

$ avrdude -c usbasp -p t13 -F

avrdude: warning: cannot set sck period. please check for usbasp firmware update.
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.00s
avrdude: Device signature = 0x1e9007
avrdude: safemode: Fuses OK
avrdude done.  Thank you.

Видим что все как-бы в порядке... , программа выдала варнинг, но успешно считала сигнатуру. Кстати, 0x1e9007 это TINY13. 




Попытаемся прошить какой-нибудь микроконтроллер
Программатор упорно не хочет шить, ругается на ошибку верификации после записи, и
опять выводит варнинг...

$ avrdude -c usbasp -p t13   -Uflash:w:blink_led.hex:a

avrdude: warning: cannot set sck period. please check for usbasp firmware update.
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.00s
avrdude: Device signature = 0x1e9007
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
         To disable this feature, specify the -D option.
avrdude: current erase-rewrite cycle count is 167772159 (if being tracked)
avrdude: erasing chip
avrdude: warning: cannot set sck period. please check for usbasp firmware update.
avrdude: reading input file "blink_led.hex"
avrdude: input file blink_led.hex auto detected as Intel Hex
avrdude: writing flash (628 bytes):
Writing | ################################################## | 100% 0.34s
avrdude: 628 bytes of flash written
avrdude: verifying flash memory against hex.hex:
avrdude: load data flash data from input file hex.hex:
avrdude: input file blink_led.hex auto detected as Intel Hex
avrdude: input file blink_led.hex contains 628 bytes
avrdude: reading on-chip flash data:
Reading | ################################################## | 100% 0.18s
avrdude: verifying ...
avrdude: verification error, first mismatch at byte 0x0000
         0x09 != 0xff
avrdude: verification error; content mismatch
avrdude: safemode: Verify error - unable to read lfuse properly. Programmer may not be reliable.
avrdude: safemode: Verify error - unable to read lfuse properly. Programmer may not be reliable.
avrdude: safemode: Sorry, reading back fuses was unreliable. I have given up and exited programming mode
avrdude done.  Thank you.


В данном месте стоило бы попытаться замкнуть 25-ю ножку МК программатора на землю (отсутствующая перемычка JP3), это бы включило пониженную частоту тактирования SCK, и наверняка подопытная TINY13 прошилась бы... но я избрал другой путь - перепрошить сам программатор стандартной прошивкой.

Решение принято - перепрошить сам программатор. Каким образом? Будем использовать имеющийся Arduino UNO.




Arduino UNO в качестве программатора
Запускаю среду разработки ARDUINO IDE
$ sudo ./arduino    (без sudo не давался доступ для смены порта)

выбираю плату (arduino UNO)
выбираю порт (/dev/ttyACM0)
заливаю в ардуину стандартный скетч ArduinoISP

Как рекомендуют подключаю конденсатор емкостью 10 мкф между RESET и GND на ардуине. 

Чтобы перестраховаться и не угробить USBasp программатор, пробую прошить TINY13.
Устанавливаю TINY13 на макетку. Подключаю от 10...13 выводов ардуины  к ней сигналы. Схема включения такова:
10: RESET
11: MOSI
12: MISO
13: SCK

Нахожу готовую прошивку для TINY13, мигающую светодиодом - blink_led.hex. Прошиваю:
$ sudo avrdude -p t13 -P /dev/ttyACM0 -c avrisp -b 19200 -U flash:w:blink_led.hex

Оп... и замигал светодиодик. Кажется что-то начинает получаться...




Теперь прошиваю МК в USBasp через Arduino UNO

для теста дал такую команду
$ sudo avrdude  -c avrisp -P /dev/ttyACM0 -b 19200 -p m8 -v
Шьем последнюю доступную прошивку взятую c сайта usbasp
$ sudo avrdude -c avrisp -P /dev/ttyACM0 -b 19200 -p m8 -U flash:w:usbasp.atmega8.2011-05-28.hex -v


Прошивается все успешно, но все дальнейшие попытки общаться нового USBasp с различными МК приводят к перманентным фатальным ошибкам:

$ avrdude -c usbasp -p atmega8 

avrdude: error: programm enable: target doesn't answer. 1 
avrdude: initialization failed, rc=-1
         Double check connections and try again, or use -F to override
         this check.

Находясь в грустных мыслях о загубленном программаторе, все же пробую замкнуть 25-ю ножку МК USBasp на землю, впаиваю перемычку. Частота SCK понизилась, и в таком режиме все подключаемые МК начали видеться и программироваться нормально.


Финальная модификация программатора
1) впаял джампер JP2 - чтобы в будущем при перепрограммировании не мучаться с проволочками...
2) впаял джампер JP3 - установил его около USB разъема, приклеим к плате суперклеем, в пластиковом корпусе сделал отверстие под джампер

::::::::::::::::::::::::
:::::::фото:::::::::
::::::::::::::::::::::::


ВЫВОДЫ
- JP3 нужно было сразу установить, а не мучить программатор перепрошивкой; подключаемые микроконтроллеры наверняка увиделись бы и с исходной китайской прошивкой USBasp.
- на низкой частоте SCK скорость прошивки МК кажется слишком медленной, впрочем так оно и есть. Без перемычки JP3 скорость программирования ~5 КБайт/с, с перемычкой на Slow SCK ~0,1 КБайт/с.
- радует, что со стандартной прошивкой перестали выводиться варнинги "cannot set sck period. please check for usbasp firmware update."







1 комментарий:

  1. Добрый вечер! Не могу препрошить юсб авр через ардуино про мин ,при тесте выдаёт ошибку.
    avrdude: initialization failed, rc=-1
    Double check connections and try again, or use -F to override

    ОтветитьУдалить