Восстановление загрузчиков Arduino UNO R3

Обсуждаем Arduino, Raspberry Pi и другие электронные компоненты и проекты DIY
Ответить
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1020
Зарегистрирован: 22 окт 2010, 23:57

Восстановление загрузчиков Arduino UNO R3

Сообщение Mr.Kubikus »

Всем привет!

Последнее время от клиентов часто стали поступать рекламации на платы Arduino UNO Rev3. Расследование показало, что иногда с завода платы приходят с чистыми микроконтроллерами. То есть вообще без загрузчиков. После подключения к USB такая глючная плата определяется в системе как ATmega 16U2 и никакие установки драйверов не помогают:
device-manager-1.png
device-manager-1.png (7.58 КБ) 54474 просмотра
Не расстраивайтесь, такие платы подлежат реанимации. Надо всего лишь прошить соответствующие загрузчики в чипы. У себя в офисе для этого мы используем программатор AVR-ISP500:
08702-03-L-1.jpg
08702-03-L-1.jpg (18.55 КБ) 54474 просмотра
Если отдельного ISP программатора нет, то можно соорудить его из живой ардуины.

Все необходимое для восстановления загрузчиков есть в комплекте Arduino IDE. Ниже я опишу, как восстанавливаю загрузчики на Arduino UNO R3.

1. Для начала я запускаю cmd.exe (у меня windows 7) и иду во вложенную папку hardware\tools\avr в том месте, где у меня хранится Arduino IDE (у меня это c:\arduino\arduino-1.0.3). Копирую в эту папку файл Arduino-usbserial-atmega16u2-Uno-Rev3.hex из папки hardware\arduino\firmwares\atmegaxxu2и файл optiboot_atmega328.hex из папки hardware\arduino\bootloaders\optiboot. Эти файлы мы будем заливать в контроллеры.
2. Подключаю программатор к разъему ICSP контроллера 16U2 (ближний к USB)
3. Подаю питание на Arduino через USB от компа.
4. Из командной строки запускаю avrdude:

bin\avrdude -F -p at90usb162 -C etc\avrdude.conf -P COM32 -c avrispv2 -U flash:w:Arduino-usbserial-atmega16u2-Uno-Rev3.hex -U lfuse:w:0xFF:m -U hfuse:w:0xD9:m -Uefuse:w:0xF4:m -U lock:w:0x0F:m

Начинается процесс прошивки 16U2:

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.05s

avrdude: Device signature = 0x1e9489
avrdude: Expected signature for AT90USB162 is 1E 94 82
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: reading input file "Arduino-usbserial-atmega16u2-Uno-Rev3.hex"
avrdude: input file Arduino-usbserial-atmega16u2-Uno-Rev3.hex auto detected as I
ntel Hex
avrdude: writing flash (4034 bytes):

Writing | ################################################## | 100% 12.19s

avrdude: 4034 bytes of flash written
avrdude: verifying flash memory against Arduino-usbserial-atmega16u2-Uno-Rev3.he
x:
avrdude: load data flash data from input file Arduino-usbserial-atmega16u2-Uno-R
ev3.hex:
avrdude: input file Arduino-usbserial-atmega16u2-Uno-Rev3.hex auto detected as I
ntel Hex
avrdude: input file Arduino-usbserial-atmega16u2-Uno-Rev3.hex contains 4034 byte
s
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 11.43s

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

Writing | ################################################## | 100% 0.02s

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.01s

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

Writing | ################################################## | 100% 0.02s

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

Reading | ################################################## | 100% 0.01s

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

Writing | ################################################## | 100% 0.01s

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

Reading | ################################################## | 100% 0.02s

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

Writing | ################################################## | 100% 0.03s

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

Reading | ################################################## | 100% 0.01s

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

avrdude: safemode: Fuses OK

avrdude done. Thank you.

5. Отключаю кабель программатора и подключаю его к разъему ICSP ATmega328.
6. Из командной строки запускаю avrdude:

bin\avrdude -F -p m328p -C etc\avrdude.conf -P COM32 -c avrispv2 -U flash:w:optiboot_atmega328.hex -U lfuse:w:0xFF:m -U hfuse:w:0xDE:m -U efuse:w:0x05:m -U lock:w:0x0F:m

Теперь прошивается загрузчик в ATmega328:

C:\arduino\arduino-1.0\hardware\tools\avr>bin\avrdude -F -p m328p -C etc\avrdude
.conf -P COM32 -c avrispv2 -U flash:w:optiboot_atmega328.hex -U lfuse:w:0xFF:m -
U hfuse:w:0xDE:m -U efuse:w:0x05:m -U lock:w:0x0F:m

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.05s

avrdude: Device signature = 0x1e950f
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: reading input file "optiboot_atmega328.hex"
avrdude: input file optiboot_atmega328.hex auto detected as Intel Hex
avrdude: writing flash (32768 bytes):

Writing | ################################################## | 100% 2.53s

avrdude: 32768 bytes of flash written
avrdude: verifying flash memory against optiboot_atmega328.hex:
avrdude: load data flash data from input file optiboot_atmega328.hex:
avrdude: input file optiboot_atmega328.hex auto detected as Intel Hex
avrdude: input file optiboot_atmega328.hex contains 32768 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 92.45s

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

Writing | ################################################## | 100% 0.02s

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.02s

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

Writing | ################################################## | 100% 0.02s

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

Reading | ################################################## | 100% 0.01s

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

Writing | ################################################## | 100% 0.03s

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.01s

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

Writing | ################################################## | 100% 0.03s

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

Reading | ################################################## | 100% 0.01s

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

avrdude: safemode: Fuses OK

avrdude done. Thank you.

Все готово. Теперь ардуина определяется в системе как COM3(Arduino UNO) и нормально прошивается из Arduino IDE.

Посты по схожим темам:
Реанимация Arduino
Не получается подключить Arduino rev3 к компьютеру
С уважением, Григорий
GitHub FB ВК
DrMort
Сообщения: 6
Зарегистрирован: 17 фев 2014, 19:30

Re: Восстановление загрузчиков Arduino UNO R3

Сообщение DrMort »

Очень похожая ситуация. Имеется в наличии две Uno R3. Одна из них в какой то момент перестала определяться при подключении к компьютеру, хотя старый скетч в ней есть и работает. Покурив поисковики обнаружил эту и подобные темы. Для программатора ISP решил использовать вторую ардуину, залил в неё скетч и соединил с глючной ардуиной. AvrDude читает старую прошивку, меняет фьюзы, но отказывается заливать новую прошивку. Ошибка:
avrdude: stk500_paged_write(): (a) protocol error? expect=0x14, resp=0x64
avrdude: stk500_cmd(): programmer is out of sync

Сигнатура контроллера верная. Сопротивление в 120 ом устанавливал. Не до конца понял куда его устанавливать, поэтому пробовал поставить между reset и землёй как на программаторе, так и на программируемом микроконтроллере.

Ничего не помогает, я запутался и прошу помощи.
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1020
Зарегистрирован: 22 окт 2010, 23:57

Re: Восстановление загрузчиков Arduino UNO R3

Сообщение Mr.Kubikus »

А какой чип вы прошиваете на плате Arduino UNO R3 - 16U2 или ATmega328 ?
С уважением, Григорий
GitHub FB ВК
DrMort
Сообщения: 6
Зарегистрирован: 17 фев 2014, 19:30

Re: Восстановление загрузчиков Arduino UNO R3

Сообщение DrMort »

16U2
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1020
Зарегистрирован: 22 окт 2010, 23:57

Re: Восстановление загрузчиков Arduino UNO R3

Сообщение Mr.Kubikus »

Как выглядит команда, которую вы набираете в командной строке?
С уважением, Григорий
GitHub FB ВК
DrMort
Сообщения: 6
Зарегистрирован: 17 фев 2014, 19:30

Re: Восстановление загрузчиков Arduino UNO R3

Сообщение DrMort »

avrdude -c avrisp -p m16u2 -P COM13 -b 19200 -U flash:w:arduino-usbserial-atmega16u2-uno-rev3.hex
DrMort
Сообщения: 6
Зарегистрирован: 17 фев 2014, 19:30

Re: Восстановление загрузчиков Arduino UNO R3

Сообщение DrMort »

Нет мыслей?
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1020
Зарегистрирован: 22 окт 2010, 23:57

Re: Восстановление загрузчиков Arduino UNO R3

Сообщение Mr.Kubikus »

Привет! Мыслей пока нет. Могу попробовать повторить вашу конфигурацию у себя и попробовать прошить firmware. Еще актуально?
С уважением, Григорий
GitHub FB ВК
DrMort
Сообщения: 6
Зарегистрирован: 17 фев 2014, 19:30

Re: Восстановление загрузчиков Arduino UNO R3

Сообщение DrMort »

Актуально, но не понимаю чем поможет и как можно повторить конфигурацию.
DrMort
Сообщения: 6
Зарегистрирован: 17 фев 2014, 19:30

Re: Восстановление загрузчиков Arduino UNO R3

Сообщение DrMort »

Могу кстати скринов поприкладывать
Ответить