Добрые китайцы продали партию клонов Arduino Nano V3 у которых самопроизвольно слетает прошивка при работе. Ресерч этой проблемы привел меня к мысли что такое возможно при неправильной установке фьюзов отвечающих за контроль питания (BOD - Brown-out detector level). Эти биты задают предельное минимальное напряжение питания. При его дальнейшем снижении контроллер отклчается. Если эти биты не выставлены или выставлены неправильно то при понижении напряжения питания контроллер будет работать в нештатном режиме, т.к. тактовая частота превышает предельно допустимую для пониженного напряжения питания. А это приводит к "слету" прошивки.
Для чтения текущих фьюзов был составлен простенький скетч ReadFuseBits
Attachment:
File comment: скетч для чтения фьюзов
ReadFuseBits.zip [588 Bytes]
Downloaded 243 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 [ 94.07 KiB | Viewed 3363 times ]
Подключаем его к Arduino соединяя одноименные выводы программатора с выводами платы Arduino (/RES -> Reset/RST). Устанавливаем в системе драйвер для USBASP (google).
Для прошивки фьюзов удобно использовать GUI консоль для AVRDude. В моем случае дело осложнилось тем, что на платах были установлены более новые контроллеры ATMega328PB, которые имеют другую сигнатуру, из-за чего софт скачанный в сети работать не захотел. Пришлось немного подшаманить и подправить конфиги. Заодно добавил режим пониженной тактовой частоты при прошивке, т.к. дефолтное значение не соответствует factory settings, что приводит к отказы/нестабильности при прошивке.
Итак подключаем контроллер к USBASP, запускаем AVRDUDEPROG. Выбираем правильный тип контроллера и программатор USBAspSlow. Фьюзы выбираем "прямые"
Attachment:
prog_fuse_1.png [ 48.44 KiB | Viewed 3361 times ]
Переходим на страницу Fuses и нажимаем кнопку "Чтение"
Attachment:
prog_fuse_2.png [ 42.71 KiB | Viewed 3361 times ]
Если все ок то появится надпись
Attachment:
prog_fuse_3.png [ 53.79 KiB | Viewed 3361 times ]
И отобразаятся текущие прошитые значения фьюзов
Attachment:
prog_fuse_4.png [ 48.88 KiB | Viewed 3361 times ]
Выставляем extended fuse в значение 0x05
Attachment:
prog_fuse_5.png [ 48.7 KiB | Viewed 3361 times ]
И нажимаем кнопку "Программирование"
Attachment:
prog_fuse_6.png [ 45.86 KiB | Viewed 3361 times ]
Attachment:
prog_fuse_7.png [ 57.42 KiB | Viewed 3361 times ]
Отключаем контроллер от программатора. Все - мы изменили фьюзы отвечающие за контроль питания. Для проверки результата можно еще раз запустить скетч отображающий фьюзы и убедиться что все в порядке.
В атаче версия AVRDUDEPROG с модифицированными конфигами (пониженная частота и поддержка ATMega328PB)
Attachment:
AVRDude_slow_mod.zip [812.9 KiB]
Downloaded 54 times
Полезные ссылки
1.
Arduino / ATmega 328P fuse settings2.
Upgrade to ATMega328pb