Как залить бутлоадер в китайскую копию arduino nano v3.0(CH340) при помощи копии UNO.

Shnemena
Offline
Зарегистрирован: 28.12.2015

Пришли 2 контроллера, китацские копии arduino nano 3 и UNO. Обе на CH340.

Драйвера встали отлично, UNO работает без проблем, а в NANO не льются скейтчи, вылетает ошибка:

avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x01
Как я понял симптом популярный, но диагноз у всех разный. Пришел к выводу, что нужно залить бутлоадер.
Отсюда вопрос, как при помощи рабочей UNO? прошить бутлоадер в NANO??
Может есть схема подключения с подробной инструкцией? Или кто-то может в кратце обрисовать, что к чему?
Заранее большое, человеческое СПАСИБО!)
sav13
sav13 аватар
Offline
Зарегистрирован: 17.06.2013

UNO - NANO

10 -> Reset

11 -> 11

12 -> 12

13 -> 13

В UNO  скетч из примеров "Файл" ->"Образцы" ->ArduinoISP

После этого программатор Arduino as ISP и можно заливать бутлоадер любой

https://www.arduino.cc/en/Tutorial/ArduinoISP

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Светодиод раза три моргает после нажатия ресета?

Shnemena
Offline
Зарегистрирован: 28.12.2015

Спасибо, попробую.

а не подскажите где найти бутлоадер для nano?

Shnemena
Offline
Зарегистрирован: 28.12.2015

trembo, моргают, мне уже писали, что если моргают то бутлоадер стоит. Но других вариантов почему не льются скейтчи у меня нет... Как уже писал, при тех же дровах, UNO работает ОК!

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Дрова не при чём
Сериал порт в дэвайсах появляется при подключении платы?

1.  Порт есть?
2.  При " вгрузить" сбрасывается? Диод моргает?
3.  Скорость в "boards.txt" стоит именно от этого загрузчика?
4.  И вообще тип платы правильно выбран?

Shnemena
Offline
Зарегистрирован: 28.12.2015

1. Порт есть, видит.

2. При выгрузке ничего не происходить в IDE прогрессбар подвисает на 100% и впишет ошибку, о которой я писал.

3. тут не проверял, можно подробней про этот пункт?

4. Тип платы "arduino nano". Процессор Atmega328.  порт корректный, рабочий.

Я пробовал менять порт, перетыкать кабель по всем USB. Жать резет перед повторной попыткой залить скейтч. Менять разные типы плат. Результат никакой.

IDE пробовал 3х версий разных

sav13
sav13 аватар
Offline
Зарегистрирован: 17.06.2013

Shnemena пишет:

Спасибо, попробую.

а не подскажите где найти бутлоадер для nano?

Если Arduino IDE поставите. Там все платы рписаны со своими загрузчиками. Просто выбираете нужную и пишите - прошить загрущикю Лично я бы поставил загрузчик от UNO - optiboot и работал бы с перешитой платой, как с Уно. Оптибут корректно работает с режимами сна и сторожевым таймером

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Не понял:
Так  на Reset   диод моргает или нет?
А на " вгрузить" моргает?

Пункт 3 - это на потом, когда сброс увидите.
И не надо ничего менять и перевтыкать.

бутлодэр просто записать, он там в меню .
Только зачем если он у вас  уже есть (если диод моргает)
Главное программатор найти.

Shnemena
Offline
Зарегистрирован: 28.12.2015

Когда втыкю кабель, постоянно светится pow и моргает L, первые 10сек быстро, потом медленнее. Всё, больше ничего не моргает. 

Когда загружаю скейтч, то L в определенный момент моргает  быстренько 3 раза и все, продолжает опять моргать медленно. А IDE пишет 

 
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x01
Shnemena
Offline
Зарегистрирован: 28.12.2015

Вылетает ошибка.

avrdude: Yikes!  Invalid device signature.

         Double check connections and try again, or use -F to override
         this check.
 
Подключаю по схеме, врое ок всё.
В IDE сначала заливаю скейтч ArduinoISP в UNO.
Затем ставлю програматор Arduino as ISP.
И пытаюсь залить тестовый скейт кнопкой "заличть через програматор". Выдаёт ошибку указаную выше.
sav13
sav13 аватар
Offline
Зарегистрирован: 17.06.2013

Shnemena пишет:

Вылетает ошибка.

avrdude: Yikes!  Invalid device signature.

         Double check connections and try again, or use -F to override
         this check.
 
Подключаю по схеме, врое ок всё.
В IDE сначала заливаю скейтч ArduinoISP в UNO.
Затем ставлю програматор Arduino as ISP.
И пытаюсь залить тестовый скейт кнопкой "заличть через програматор". Выдаёт ошибку указаную выше.

Попробуйте сперва "Записать бутлоадер"

Shnemena
Offline
Зарегистрирован: 28.12.2015

Та же ошибка

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Залить через программатор - это значит залить в ДРУГУЮ, вторую!!!

А бутлодер у вас уже есть.
Осталось выяснить какой- оптибут или стандартный и какая скорость.

Поройтесь в бордс.тхт, там не много вариантов с мега 328.
Скопируйте секцию, переименуйте её как-то и " издевайтесь" над ней меняя имя загрузчика и скорость.

Или второй Ардуиной прошейте загрузчик с известными параметрами.

Shnemena
Offline
Зарегистрирован: 28.12.2015

Не шьется загрузчик, я же выше писал) Ошибку выдает. Шить пытаюсь через UNO

Produm
Offline
Зарегистрирован: 28.06.2016

Наткнулся на эту ветку. Надо было прошить Нано от Уно. Прочитал, как сделать. в этом деле новичок. Ну так вот: кроме 4 пинов надо еще на платках соеденить проводом +5 и +5 на обоих платах, а gnd тоже. а потом уже прошивать.

std
Offline
Зарегистрирован: 05.01.2012

Yikes!  Invalid device signature

Самая мерзкая ошибка из возможных, вот все известные мне способы бороться:

1. Убедиться что все провода подключены правильно. Invalid device signature может появляться если перепутаны D11, D12, D13.

2. Убедиться что выбран нужный ведомый контроллер и нужная частота. В меню Tools>Board выбирается не та плата которой прошивают, а та, которую прошивают.

3. Убедиться что ведущий не сбрасывается. В ArduinoISP обычно соединяют Reset с плюсом через резистор 100R.

4. Возможно, ведомый уже настроен на более высокую частоту, но собран без кварца. ВСЕГДА оставляйте на своих платах пады, идущие на GND, XTAL1, XTAL2. Это даст возможность подключать туда кварц и два конденсатора. Кроме того, существует модифицированный скетч ArduinoISP, выдающий на одном из выходов 1 МГц. Можно подавать этот сигнал на XTAL1 ведомого МК.

5. Возможно, допущена ошибка при сборке. Как-то, на одной из плат Invalid device signature было вечным. Над ней уже были занесены ножницы, но мне зачем-то припёрло снять с неё кварц - видимо было лень лезть за новым. Всё встало на свои места, когда выяснилось, что вместо одного из конденсаторов 22 пФ был припаян резистор 22R. После замены на то что надо - всё прошивалось нормально.

6. Возможно, вышел из строя ISP разъём. У меня такое уже случилось один раз.

nvitek
Offline
Зарегистрирован: 15.12.2016

Всем Доброго дня! Пробую залить в NANO бутлоадер, через USBASP.  Extrim Burner с ней работает только когда выберу чип атмега32 ,  а если 328р, то стирает, но не прошивает. Да и в атмега32 можно только 2 фьюза записать. Фьюзы брал из boards.txt . Научите молодого, в чем есть проблема. Подозреваю что чип(Atmega 328P) накрылся тазом из Cu. :-( Все началось с того что, вдруг, перестали вливаться скетчи.. т.е. компиляция, заливка... и в конце, (ошибка по адресу такомуто...)

Вот вывод  при прошивке бутлоадера, не знаю как свернуть в спойлер.

D:\Arduino_ide\hardware\tools\avr/bin/avrdude -CD:\Arduino_ide\hardware\tools\avr/etc/avrdude.conf -v -patmega328p -cusbasp -Pusb -e -Ulock:w:0x3F:m -Uefuse:w:0x05:m -Uhfuse:w:0xDA:m -Ulfuse:w:0xFF:m

avrdude: Version 6.3, compiled on Sep 12 2016 at 17:24:16
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2014 Joerg Wunsch

         System wide configuration file is "D:\Arduino_ide\hardware\tools\avr/etc/avrdude.conf"

         Using Port                    : usb
         Using Programmer              : usbasp
         AVR Part                      : ATmega328P
         Chip Erase delay              : 9000 us
         PAGEL                         : PD7
         BS2                           : PC2
         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    20     4    0 no       1024    4      0  3600  3600 0xff 0xff
           flash         65     6   128    0 yes     32768  128    256  4500  4500 0xff 0xff
           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
           lock           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
           signature      0     0     0    0 no          3    0      0     0     0 0x00 0x00

         Programmer Type : usbasp
         Description     : USBasp, http://www.fischl.de/usbasp/

avrdude: auto set sck period (because given equals null)
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 = 0x1e950f (probably m328p)
avrdude: erasing chip
avrdude: auto set sck period (because given equals null)
avrdude: warning: cannot set sck period. please check for usbasp firmware update.
avrdude: reading input file "0x3F"
avrdude: writing lock (1 bytes):

Writing | ################################################## | 100% 0.00s

D:\Arduino_ide\hardware\tools\avr/bin/avrdude avrdude: 1 bytes of lock written
-CD:\Arduino_ide\hardware\tools\avr/etc/avrdude.conf avrdude: verifying lock memory against 0x3F:
-v -patmega328p avrdude: load data lock data from input file 0x3F:
-cusbasp -Pusb avrdude: input file 0x3F contains 1 bytes
-Uflash:w:D:\Arduino_ide\hardware\arduino\avr/bootloaders/atmega/ATmegaBOOT_168_atmega328.hex:i -Ulock:w:0x0F:m avrdude: reading on-chip lock data:

Reading | ################################################## | 100% 0.00s

avrdude: verifying ...
avrdude: 1 bytes of lock verified
avrdude: reading input file "0x05"
avrdude: writing efuse (1 bytes):

Writing |  ***failed;  
################################################## | 100% 0.05s

avrdude: 1 bytes of efuse written
avrdude: verifying efuse memory against 0x05:
avrdude: load data efuse data from input file 0x05:
avrdude: input file 0x05 contains 1 bytes
avrdude: reading on-chip efuse data:

Reading | ################################################## | 100% 0.00s

avrdude: verifying ...
avrdude: WARNING: invalid value for unused bits in fuse "efuse", should be set to 1 according to datasheet
This behaviour is deprecated and will result in an error in future version
You probably want to use 0xfd instead of 0x05 (double check with your datasheet first).
avrdude: 1 bytes of efuse verified
avrdude: reading input file "0xDA"
avrdude: writing hfuse (1 bytes):

Writing | ################################################## | 100% 0.00s

avrdude: 1 bytes of hfuse written
avrdude: verifying hfuse memory against 0xDA:
avrdude: load data hfuse data from input file 0xDA:
avrdude: input file 0xDA contains 1 bytes
avrdude: reading on-chip hfuse data:

Reading | ################################################## | 100% 0.00s

avrdude: verifying ...
avrdude: 1 bytes of hfuse verified
avrdude: reading input file "0xFF"
avrdude: writing lfuse (1 bytes):

Writing | ################################################## | 100% 0.00s

avrdude: 1 bytes of lfuse written
avrdude: verifying lfuse memory against 0xFF:
avrdude: load data lfuse data from input file 0xFF:
avrdude: input file 0xFF contains 1 bytes
avrdude: reading on-chip lfuse data:

Reading | ################################################## | 100% 0.00s

avrdude: verifying ...
avrdude: 1 bytes of lfuse verified

avrdude done.  Thank you.

avrdude: Version 6.3, compiled on Sep 12 2016 at 17:24:16
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2014 Joerg Wunsch

         System wide configuration file is "D:\Arduino_ide\hardware\tools\avr/etc/avrdude.conf"

         Using Port                    : usb
         Using Programmer              : usbasp
         AVR Part                      : ATmega328P
         Chip Erase delay              : 9000 us
         PAGEL                         : PD7
         BS2                           : PC2
         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    20     4    0 no       1024    4      0  3600  3600 0xff 0xff
           flash         65     6   128    0 yes     32768  128    256  4500  4500 0xff 0xff
           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
           lock           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
           signature      0     0     0    0 no          3    0      0     0     0 0x00 0x00

         Programmer Type : usbasp
         Description     : USBasp, http://www.fischl.de/usbasp/

avrdude: auto set sck period (because given equals null)
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 = 0x1e950f (probably m328p)
avrdude: NOTE: "flash" memory has been specified, an erase cycle will be performed
         To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: auto set sck period (because given equals null)
avrdude: warning: cannot set sck period. please check for usbasp firmware update.
avrdude: reading input file "D:\Arduino_ide\hardware\arduino\avr/bootloaders/atmega/ATmegaBOOT_168_atmega328.hex"
avrdude: writing flash (32670 bytes):

Writing | ################################################## | 100% -0.00s

avrdude: 32670 bytes of flash written
avrdude: verifying flash memory against D:\Arduino_ide\hardware\arduino\avr/bootloaders/atmega/ATmegaBOOT_168_atmega328.hex:
avrdude: load data flash data from input file D:\Arduino_ide\hardware\arduino\avr/bootloaders/atmega/ATmegaBOOT_168_atmega328.hex:
avrdude: input file D:\Arduino_ide\hardware\arduino\avr/bootloaders/atmega/ATmegaBOOT_168_atmega328.hex contains 32670 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 0.00s

avrdude: verifying ...
avrdude: verification error, first mismatch at byte 0x7800
         0xff != 0x0c
avrdude: verification error; content mismatch

avrdude done.  Thank you.

Ошибка при записи загрузчика.
 

sersahar
Offline
Зарегистрирован: 04.06.2014

Господа, прошу помощи! Есть 2 Nano. Задача прошить загрузчик с оптибут. Скачал с сайта папку с оптибут, добавил. В платах появились девайсы с [оптибут]. Как соединять платы? Пины с платы-программатора (одна из Нано) на разъем ICSP или встречал вариант на контакты сразу на плате?

На плату-программатор заливаю стандартый скетч с примера Arduino as ISP.  Там что нибудь править надо для Нано?

Потом соединяю платы и далее мне в Сервис/Плата/ выбирать уже Нано с оптибут или нет?

а потом Записать загрузчик.

Спасибо

wss
Offline
Зарегистрирован: 26.11.2016

Подскажите, пожалуйста, китайскую ардуину уно залить бутлоадер через ср2102 можно? Инет перелазал только ардуины про мини перепрограммируют.? Компьютер вообще не видит ардуину.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

wss пишет:

Подскажите, пожалуйста, китайскую ардуину уно залить бутлоадер через ср2102 можно? 

Нет, нельзя. Чтобы залить бутлоадер нужен программатор (например USBasp) или другая ардуина со скетчем эмулятора программатора (ArduinoISP).

wss пишет:

Компьютер вообще не видит ардуину.

Наличие бутлоадера не влияет на "видимость" ардуины компьютером. Если вы про виртуальный COM-порт в диспетчере устройств. За это отвечает микросхема-преобразователь USB-UART на плате ардуино.

wss
Offline
Зарегистрирован: 26.11.2016

Я поправлюсь. Можно ли вместо штатного усб-уарта подключить через ср2102 ?

На плате уно есть 4 отверстия Х1 , для чего они?  Не могу найти схему на уно китайский атмега 328-р

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

wss пишет:

Можно ли вместо штатного усб-уарта подключить через ср2102 ?

Можно, но к бутлоадеру это не имеет никакого отношения.

Хотя тут надо аккуратно, ибо не известно, что там со штатным. Чтобы штатный и cp2102 одновременно не выставили разный лог. уровень на TX. А то ещё коротнёт... В идеале надо брать мультиметр и прозванивать/проверять плату. Может там непропай микросхемы или флюс плохо смыт, вот и не работает штатный.

wss пишет:

На плате уно есть 4 отверстия Х1 , для чего они?  

ХЗ что там китайцы придумали, на оригинальной таких нет. Нужно хотя бы на фото глянуть.

wss пишет:

Не могу найти схему на уно китайский атмега 328-р

Китайских ардуин делают много разных, они могут слегка отличаться по схеме.

wss
Offline
Зарегистрирован: 26.11.2016

Вот .

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Ну вот видно, что отверстия Х1 идут на ножки (9, 10, 12, 13) штатного китайского USB-UART преобразователя CH340G. Смотрим распиновку и видим, что это контакты CTS, DSR, DCD, DTR. Но они всё равно не играют роли в загрузке скетчей. Их описание можно почитать тут - сигналы квитирования

wss
Offline
Зарегистрирован: 26.11.2016

JEKA_M. спасибо

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Кстати, по этой же распиновке можно проверить мультиметром наличие питания на ножках микросхемы VCC, GND. И чтобы был контакт ножек UD+, UD- микросхемы с контактами D+, D-  USB-порта 

wss
Offline
Зарегистрирован: 26.11.2016

А схема есть? питание на микросхему приходит.

контакт ножек UD+, UD- микросхемы с контактами D+, D-  USB-порта  тоже в норме все.

я уж и кварц поменял.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

wss пишет:

А схема есть?

У меня нет. В гугл картинках можно глянуть схемы - https://www.google.com/search?q=arduino+uno+ch340g+schematic&espv=2&biw=1680&bih=920&tbm=isch&tbo=u&source=univ

wss пишет:

питание на микросхему приходит.

контакт ножек UD+, UD- микросхемы с контактами D+, D-  USB-порта  тоже в норме все.

я уж и кварц поменял.

Тогда ХЗ...

Ах, да... драйвера оригинальные (китайские) на CH340G ставили? http://www.wch.cn/download/CH341SER_ZIP.html

wss
Offline
Зарегистрирован: 26.11.2016

да ставил

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

wss пишет:

да ставил

В диспетчере устройств вообще что-нибудь появляется? Хотя бы неизвестное устройство?

Вот пару схем нашёл - РАЗ, ДВА.

wss
Offline
Зарегистрирован: 26.11.2016

нашел схему , спасибо. https://i.stack.imgur.com/Rm50J.jpg Схема не та. Под номером два вроде.

wss
Offline
Зарегистрирован: 26.11.2016

Jeka_M пишет:

В диспетчере устройств вообще что-нибудь появляется? Хотя бы неизвестное устройство?

Вообще не реагирует. Даже неизвестног устройства нет. Светодиод ON горит, L -мигает, (я так понимаю атмега живая)

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

wss пишет:

Jeka_M пишет:

В диспетчере устройств вообще что-нибудь появляется? Хотя бы неизвестное устройство?

Светодиод ON горит, L -мигает, (я так понимаю атмега живая)

Да, атмега работает.

Возможно CH340G сдохла... Ещё внимательно посмотрите, как она запаяна (ключ на корпусе микрухи). Бывало, что китайцы её впаивалии перевёрнутую на 180°. Сверьтесь с картинками в интернете. Ну и остатки флюса смыть, если грязные контакты (особенно возле кварца).

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

А, и ещё - поменяйте USB кабель. Тот, что идёт в комплекте с китайской ардуиной - фигового качества.

wss
Offline
Зарегистрирован: 26.11.2016

Поменял кабель и комп увидел ардуину !!! Jeka_M, спасибо!!!

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

sav13 пишет:

Shnemena пишет:

Спасибо, попробую.

а не подскажите где найти бутлоадер для nano?

Если Arduino IDE поставите. Там все платы рписаны со своими загрузчиками. Просто выбираете нужную и пишите - прошить загрущикю Лично я бы поставил загрузчик от UNO - optiboot и работал бы с перешитой платой, как с Уно. Оптибут корректно работает с режимами сна и сторожевым таймером

После обновления менеджером плат, перестали шиться ардуины нано, оказалось, что теперь там два загрузчика и мои платы со старым )))
Так всё таки, заливать бут от UNO или в новом загрузчике нано всё поправлено???

glorius
Offline
Зарегистрирован: 12.07.2015

Была похожая проблема, скетч загружался на 100%, зависал, выдавало ошибку. Выбрал Old Bootloader все загрузилось. Все оказалось легко и просто. :-))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Дошли руки до watchdog ан нет, ни одна из моих плат не шьет загрузчик, вылетает по ошибки сей текст, в чем засада, перепробовал уже 4 платы:
 

Arduino: 1.8.8 (Windows 7), Плата:"Arduino Nano, ATmega328P"

D:\ARDUINO\arduino-1.8.8\hardware\tools\avr/bin/avrdude -CD:\ARDUINO\arduino-1.8.8\hardware\tools\avr/etc/avrdude.conf -v -patmega328p -carduino -PCOM2 -b19200 -e -Ulock:w:0x3F:m -Uefuse:w:0xFD:m -Uhfuse:w:0xDA:m -Ulfuse:w:0xFF:m 

avrdude: Version 6.3-20171130
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2014 Joerg Wunsch

         System wide configuration file is "D:\ARDUINO\arduino-1.8.8\hardware\tools\avr/etc/avrdude.conf"

         Using Port                    : COM2
         Using Programmer              : arduino
         Overriding Baud Rate          : 19200
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x15
avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0x15
Ошибка при записи загрузчика.
         AVR Part                      : ATmega328P
         Chip Erase delay              : 9000 us
         PAGEL                         : PD7
         BS2                           : PC2
         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    20     4    0 no       1024    4      0  3600  3600 0xff 0xff
           flash         65     6   128    0 yes     32768  128    256  4500  4500 0xff 0xff
           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
           lock           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
           signature      0     0     0    0 no          3    0      0     0     0 0x00 0x00

         Programmer Type : Arduino
         Description     : Arduino

avrdude: stk500_getparm(): (a) protocol error, expect=0x14, resp=0x14

avrdude: stk500_getparm(): (a) protocol error, expect=0x14, resp=0x02

avrdude: stk500_getparm(): (a) protocol error, expect=0x14, resp=0x10
         Hardware Version: 4744608
         Firmware Version: 0.4611299
         Topcard         : STK502
         Vtarget         : 1.8 V
         Varef           : 0.0 V
         Oscillator      : Off
         SCK period      : 0.1 us

avrdude: stk500_initialize(): (b) protocol error, expect=0x10, resp=0x01
avrdude: initialization failed, rc=-1
         Double check connections and try again, or use -F to override
         this check.

avrdude: stk500_disable(): protocol error, expect=0x14, resp=0x10

avrdude done.  Thank you.

Этот отчёт будет иметь больше информации с
включенной опцией Файл -> Настройки ->
"Показать подробный вывод во время компиляции"

 

Гриша
Offline
Зарегистрирован: 27.04.2014

недавно перепрошивал загрузчик, чтобы поменять фьюзы. ни одна плата не прошилась с первого раза. Лог не помню, я его просто игнорил и сразу же лил второй раз безе переподключения и перезагрузки. Т.Е. тупа ждал ошибку, и следом жал повторную загрузку... Даже не разбирался в проблеме...

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Гриша пишет:

недавно перепрошивал загрузчик, чтобы поменять фьюзы. ни одна плата не прошилась с первого раза. Лог не помню, я его просто игнорил и сразу же лил второй раз безе переподключения и перезагрузки. Т.Е. тупа ждал ошибку, и следом жал повторную загрузку... Даже не разбирался в проблеме...

и второй и третий и тд - сегодня не мой день - категорически не шьётся, ранее помню, что была бодяга - не с первого раза шился, пять плат 4 нано и 1 уно в любой комбинации облом, шнур менял, комп менял...прокладку между компом и клавиатурой только не менял )))

sadman41
Offline
Зарегистрирован: 19.10.2016

Только что менял в Нано бутлоадер. Через USBASP, правда - всё с первого раза... Даже коннектор не паял, просто воткнул 6 контактов в дырки ICSP.

Гриша
Offline
Зарегистрирован: 27.04.2014

загрузчик заливаю редко и частенько путаюсь с проводами... если с тактами все просто, то mosi - miso 50% не угадываю :))))))) и пару раз не правильно указывал на какю ногу повесил ресет. Там в скетче aduinoISP проверить что куда...

// The standard pin configuration.
#ifndef ARDUINO_HOODLOADER2

#define RESET     10 // Use pin 10 to reset the target rather than SS
#define LED_HB    9
#define LED_ERR   8
#define LED_PMODE 7

// Uncomment following line to use the old Uno style wiring
// (using pin 11, 12 and 13 instead of the SPI header) on Leonardo, Due...

// #define USE_OLD_STYLE_WIRING

#ifdef USE_OLD_STYLE_WIRING

#define PIN_MOSI	11
#define PIN_MISO	12
#define PIN_SCK		13

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

я не пойму почему он на скорости 19200 льёт, пробовал поставить 57600, орёт
 

Arduino: 1.8.7 (Windows 7), Плата:"Arduino Nano, ATmega328P"

C:\ARDUINO\arduino-1.8.7\hardware\tools\avr/bin/avrdude -CC:\ARDUINO\arduino-1.8.7\hardware\tools\avr/etc/avrdude.conf -v -patmega328p -carduino -PCOM3 -b19200 -e -Ulock:w:0x3F:m -Uefuse:w:0xFD:m -Uhfuse:w:0xDA:m -Ulfuse:w:0xFF:m 

avrdude: Version 6.3-20171130
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2014 Joerg Wunsch

         System wide configuration file is "C:\ARDUINO\arduino-1.8.7\hardware\tools\avr/etc/avrdude.conf"

         Using Port                    : COM3
         Using Programmer              : arduino
         Overriding Baud Rate          : 19200
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0xfa
avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0xff
avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0xff
avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0xff
avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0xff
avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0xff
avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0xff
avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0xff
avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0xff
avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0xff

Ошибка при записи загрузчика.
avrdude done.  Thank you.

Этот отчёт будет иметь больше информации с
включенной опцией Файл -> Настройки ->
"Показать подробный вывод во время компиляции"

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

в распиновке я уверен, уже 100 раз перепроверил, раньше шил и сдается мне что что-то правил в скетче

bwn
Offline
Зарегистрирован: 25.08.2014

ua6em пишет:

я не пойму почему он на скорости 19200 льёт, пробовал поставить 57600, орёт

Лить он будет на скорости, которая указана в board.txt для заливаемого загрузчика. Контакты пациента = контактам врача + 10  = reset пациента. Для унов-нанов нумерация пинов одинаковая.
Живой ArduinoISP из 1.6.4:

// ArduinoISP version 04m3
// Copyright (c) 2008-2011 Randall Bohn
// If you require a license, see
//     http://www.opensource.org/licenses/bsd-license.php
//
// This sketch turns the Arduino into a AVRISP
// using the following arduino pins:
//
// pin name:    not-mega:         mega(1280 and 2560)
// slave reset: 10:               53
// MOSI:        11:               51
// MISO:        12:               50
// SCK:         13:               52
//
// 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
//
// 23 July 2011 Randall Bohn
// -Address Arduino issue 509 :: Portability of ArduinoISP
// http://code.google.com/p/arduino/issues/detail?id=509
//
// 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.
// - Use pins_arduino.h (should also work on Arduino Mega)
//
// 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

#include "pins_arduino.h"
#define RESET     SS

#define LED_HB    9
#define LED_ERR   8
#define LED_PMODE 7
#define PROG_FLICKER true

#define HWVER 2
#define SWMAJ 1
#define SWMIN 18

// STK Definitions
#define STK_OK      0x10
#define STK_FAILED  0x11
#define STK_UNKNOWN 0x12
#define STK_INSYNC  0x14
#define STK_NOSYNC  0x15
#define CRC_EOP     0x20 //ok it is a space...

void pulse(int pin, int times);

void setup() {
  Serial.begin(19200);
  pinMode(LED_PMODE, OUTPUT);
  pulse(LED_PMODE, 2);
  pinMode(LED_ERR, OUTPUT);
  pulse(LED_ERR, 2);
  pinMode(LED_HB, OUTPUT);
  pulse(LED_HB, 2);
}

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(20);
}


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 spi_init() {
  uint8_t x;
  SPCR = 0x53;
  x = SPSR;
  x = SPDR;
}

void spi_wait() {
  do {
  }
  while (!(SPSR & (1 << SPIF)));
}

uint8_t spi_send(uint8_t b) {
  uint8_t reply;
  SPDR = b;
  spi_wait();
  reply = SPDR;
  return reply;
}

uint8_t spi_transaction(uint8_t a, uint8_t b, uint8_t c, uint8_t d) {
  uint8_t n;
  spi_send(a);
  n = spi_send(b);
  //if (n != a) error = -1;
  n = spi_send(c);
  return spi_send(d);
}

void empty_reply() {
  if (CRC_EOP == getch()) {
    Serial.print((char)STK_INSYNC);
    Serial.print((char)STK_OK);
  }
  else {
    error++;
    Serial.print((char)STK_NOSYNC);
  }
}

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);
  }
}

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])
  // following are 16 bits (big endian)
  param.eeprompoll = beget16(&buff[10]);
  param.pagesize   = beget16(&buff[12]);
  param.eepromsize = beget16(&buff[14]);

  // 32 bits flashsize (big endian)
  param.flashsize = buff[16] * 0x01000000
                    + buff[17] * 0x00010000
                    + buff[18] * 0x00000100
                    + buff[19];

}

void start_pmode() {
  spi_init();
  // following delays may not work on all targets...
  pinMode(RESET, OUTPUT);
  digitalWrite(RESET, HIGH);
  pinMode(SCK, OUTPUT);
  digitalWrite(SCK, LOW);
  delay(50);
  digitalWrite(RESET, LOW);
  delay(50);
  pinMode(MISO, INPUT);
  pinMode(MOSI, OUTPUT);
  spi_transaction(0xAC, 0x53, 0x00, 0x00);
  pmode = 1;
}

void end_pmode() {
  pinMode(MISO, INPUT);
  pinMode(MOSI, INPUT);
  pinMode(SCK, INPUT);
  pinMode(RESET, INPUT);
  pmode = 0;
}

void universal() {
  int w;
  uint8_t ch;

  fill(4);
  ch = spi_transaction(buff[0], buff[1], buff[2], buff[3]);
  breply(ch);
}

void flash(uint8_t hilo, int addr, uint8_t data) {
  spi_transaction(0x40 + 8 * hilo,
                  addr >> 8 & 0xFF,
                  addr & 0xFF,
                  data);
}
void commit(int addr) {
  if (PROG_FLICKER) prog_lamp(LOW);
  spi_transaction(0x4C, (addr >> 8) & 0xFF, addr & 0xFF, 0);
  if (PROG_FLICKER) {
    delay(PTIME);
    prog_lamp(HIGH);
  }
}

//#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;
}


void write_flash(int length) {
  fill(length);
  if (CRC_EOP == getch()) {
    Serial.print((char) STK_INSYNC);
    Serial.print((char) write_flash_pages(length));
  }
  else {
    error++;
    Serial.print((char) STK_NOSYNC);
  }
}

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;
}

void program_page() {
  char result = (char) STK_FAILED;
  int length = 256 * getch();
  length += getch();
  char memtype = getch();
  // flash memory @here, (length) bytes
  if (memtype == 'F') {
    write_flash(length);
    return;
  }
  if (memtype == 'E') {
    result = (char)write_eeprom(length);
    if (CRC_EOP == getch()) {
      Serial.print((char) STK_INSYNC);
      Serial.print(result);
    }
    else {
      error++;
      Serial.print((char) STK_NOSYNC);
    }
    return;
  }
  Serial.print((char)STK_FAILED);
  return;
}

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
  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();
  length += 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;
}

void read_signature() {
  if (CRC_EOP != getch()) {
    error++;
    Serial.print((char) STK_NOSYNC);
    return;
  }
  Serial.print((char) STK_INSYNC);
  uint8_t high = spi_transaction(0x30, 0x00, 0x00, 0x00);
  Serial.print((char) high);
  uint8_t middle = spi_transaction(0x30, 0x00, 0x01, 0x00);
  Serial.print((char) middle);
  uint8_t low = spi_transaction(0x30, 0x00, 0x02, 0x00);
  Serial.print((char) low);
  Serial.print((char) STK_OK);
}
//////////////////////////////////////////
//////////////////////////////////////////


////////////////////////////////////
////////////////////////////////////
int avrisp() {
  uint8_t data, low, high;
  uint8_t ch = getch();
  switch (ch) {
    case '0': // signon
      error = 0;
      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':
      fill(20);
      set_parameters();
      empty_reply();
      break;
    case 'E': // extended parameters - ignore for now
      fill(5);
      empty_reply();
      break;

    case 'P':
      start_pmode();
      empty_reply();
      break;
    case 'U': // set address (word)
      here = getch();
      here += 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 't'
      read_page();
      break;

    case 'V': //0x56
      universal();
      break;
    case 'Q': //0x51
      error = 0;
      end_pmode();
      empty_reply();
      break;

    case 0x75: //STK_READ_SIGN 'u'
      read_signature();
      break;

      // expecting a command, not CRC_EOP
      // this is how we can get back in sync
    case CRC_EOP:
      error++;
      Serial.print((char) STK_NOSYNC);
      break;

      // anything else we will return STK_UNKNOWN
    default:
      error++;
      if (CRC_EOP == getch())
        Serial.print((char)STK_UNKNOWN);
      else
        Serial.print((char)STK_NOSYNC);
  }
}

Да, регулярно заливка со второго раза.
Еще раз по алгоритму: Соединили провода, залили ArduinoISP в доктора, выбрали требуемый загрузчик в меню IDE, нажали "записать загрузчик".

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

bwn пишет:

Да, регулярно заливка со второго раза.
Еще раз по алгоритму: Соединили провода, залили ArduinoISP в доктора, выбрали требуемый загрузчик в меню IDE, нажали "записать загрузчик".

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

Да и аппаратно по пину 13 и светодиоду на нём непонятки (сигнал SCK)

b707
Offline
Зарегистрирован: 26.05.2017

Гриша пишет:

загрузчик заливаю редко и частенько путаюсь с проводами...

я тоже загрузчик редко шью, зато часто - сами скетчи через ISP. У меня отдельная Нана под это выделена. На ней уже загружен Ардуино-как-ИСП, а провода собраны в коннектор 2х3, соответствующий ISP-разъему. Втыкаешь и сразу прошиваешь.

Все всегда шьется с первого раза, если нет других ошибок.

b707
Offline
Зарегистрирован: 26.05.2017

ua6em пишет:

видимо в скетче есть косяк с которым никто не разбирался

 

нет там никакого косяка, все работает как часы.

У меня несколько активных проектов, где я МК шью не через загрузчик, а через ИСП этим самым скетчем. Этой технологияей пользуюсь иногда десятками раз в день, когда код отлаживаю.

bwn
Offline
Зарегистрирован: 25.08.2014

Похвастаюсь. Под 28-лапый DIP и TQFP32. Коричневый разъем - UART и I2C. Белый - SPI и питание для других чипов или на плате прошить. В нанке ArduinoISP. Шьется все и всегда, последний раз 20 паленых атмег168 - 10AU. Все прошились, все живые и на 16МГц работают. Сразу тестовый скетч на основные шины, проверка пинов, EEPROM. 

Гриша
Offline
Зарегистрирован: 27.04.2014

нуууу вариант скачать старое ПО 1.8.3 точно без багов

и еще раз проверить провода (перечитать инструкцию)