UR5FFR
http://dspview.com/

Если слетает прошивка - лечим склероз у Arduino
http://dspview.com/viewtopic.php?f=24&t=209
Page 1 of 1

Author:  Relayer [ 12 Aug 2018, 19:14 ]
Post subject:  Если слетает прошивка - лечим склероз у Arduino

Добрые китайцы продали партию клонов Arduino Nano V3 у которых самопроизвольно слетает прошивка при работе. Ресерч этой проблемы привел меня к мысли что такое возможно при неправильной установке фьюзов отвечающих за контроль питания (BOD - Brown-out detector level). Эти биты задают предельное минимальное напряжение питания. При его дальнейшем снижении контроллер отклчается. Если эти биты не выставлены или выставлены неправильно то при понижении напряжения питания контроллер быдет работать в нештатном режиме, т.к. тактовая частота превышает предельно допустимую для пониженного напряжения питания. А это приводит к "слету" прошивки.

Для чтения текущих фьюзов был составлен простенький скетч ReadFuseBits
Attachment:
File comment: скетч для чтения фьюзов
ReadFuseBits.zip [588 Bytes]
Downloaded 54 times

Скетч читает значение фьюзов и выдает его в ком-порт. После заливки его в мониторе com-порта я увидел вот что:

Code:
Low:  0xFF
High: 0xDA
Ext:  0xFF


Для плат Arduino на Atmega328P должны быть такие значения фьюзов:

Code:
Low:  0xFF
High: 0xDA
Ext:  0xF5


Тоесть фьюзы extended установлены в 0xFF - контроль питания отключен.

Для "лечения" необходимо перепрошить фьюзы. Для этого я использовал программатор USBASP

Attachment:
usbasp interface 01.jpg
usbasp interface 01.jpg [ 94.07 KiB | Viewed 564 times ]


Подключаем его к Arduino соединяя одноименные выводы программатора с выводами платы Arduino (/RES -> Reset/RST). Устанавливаем в системе драйвер для USBASP (google).
Для прошивки фьюзов удобно использовать GUI консоль для AVRDude. В моем случае дело осложнилось тем, что на платах были установлены более новые контроллеры ATMega328PB, которые имеют другую сигнатуру, из-за чего софт скачанный в сети работать не захотел. Пришлось немного подшаманить и подправить конфиги. Заодно добавил режим пониженной тактовой частоты при прошивке, т.к. дефолтное значение не соответствует factory settings, что приводит к отказы/нестабильности при прошивке.

Итак подключаем контроллер к USBASP, запускаем AVRDUDEPROG. Выбираем правильный тип контроллера и программатор USBAspSlow. Фьюзы выбираем "прямые"

Attachment:
prog_fuse_1.png
prog_fuse_1.png [ 48.44 KiB | Viewed 562 times ]


Переходим на страницу Fuses и нажимаем кнопку "Чтение"

Attachment:
prog_fuse_2.png
prog_fuse_2.png [ 42.71 KiB | Viewed 562 times ]


Если все ок то появится надпись

Attachment:
prog_fuse_3.png
prog_fuse_3.png [ 53.79 KiB | Viewed 562 times ]


И отобразаятся текущие прошитые значения фьюзов

Attachment:
prog_fuse_4.png
prog_fuse_4.png [ 48.88 KiB | Viewed 562 times ]


Выставляем extended fuse в значение 0x05

Attachment:
prog_fuse_5.png
prog_fuse_5.png [ 48.7 KiB | Viewed 562 times ]


И нажимаем кнопку "Программирование"

Attachment:
prog_fuse_6.png
prog_fuse_6.png [ 45.86 KiB | Viewed 562 times ]


Attachment:
prog_fuse_7.png
prog_fuse_7.png [ 57.42 KiB | Viewed 562 times ]


Отключаем контроллер от программатора. Все - мы изменили фьюзы отвечающие за контроль питания. Для проверки результата можно еще раз запустить скетч отображающий фьюзы и убедиться что все в порядке.

В атаче версия AVRDUDEPROG с модифицированными конфигами (пониженная частота и поддержка ATMega328PB)
Attachment:
avrdudeprog33_slow_mod.zip [813.26 KiB]
Downloaded 55 times


Полезные ссылки
1. Arduino / ATmega 328P fuse settings
2. Upgrade to ATMega328pb

Page 1 of 1 All times are UTC + 2 hours
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/