это наброски
_________________________________________________
Первое подключение программатора к компу, настройка прав доступа
Итак, первое подключение программатора к компу. Программатор никак еще не модернизирован, все в заводском виде. Подключаем и проверяем, как видится он на шине 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."
Добрый вечер! Не могу препрошить юсб авр через ардуино про мин ,при тесте выдаёт ошибку.
ОтветитьУдалитьavrdude: initialization failed, rc=-1
Double check connections and try again, or use -F to override