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 80 times

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

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


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

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


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

Code:
Небольшая ремарка по поводу значения фьюза Ext. Это байт в котором реально используются только младшие 3 бита. Значения остальных битов могут варьироваться. Например 0xFD это тоже валидное значение для ардуины. Поэтому надо смотреть на младшие три бита - там должна быть установлены 0й и 2й биты.


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

Attachment:
usbasp interface 01.jpg
usbasp interface 01.jpg [ 94.07 KiB | Viewed 966 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 964 times ]


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

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


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

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


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

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


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

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


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

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


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


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

В атаче версия AVRDUDEPROG с модифицированными конфигами (пониженная частота и поддержка ATMega328PB)
Attachment:
avrdudeprog33_slow_mod.zip [813.26 KiB]
Downloaded 110 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/