Если слетает прошивка - лечим склероз у Arduino
Posted: 12 Aug 2018, 20:14
Добрые китайцы продали партию клонов Arduino Nano V3 у которых самопроизвольно слетает прошивка при работе. Ресерч этой проблемы привел меня к мысли что такое возможно при неправильной установке фьюзов отвечающих за контроль питания (BOD - Brown-out detector level). Эти биты задают предельное минимальное напряжение питания. При его дальнейшем снижении контроллер отклчается. Если эти биты не выставлены или выставлены неправильно то при понижении напряжения питания контроллер будет работать в нештатном режиме, т.к. тактовая частота превышает предельно допустимую для пониженного напряжения питания. А это приводит к "слету" прошивки.
Для чтения текущих фьюзов был составлен простенький скетч ReadFuseBits Скетч читает значение фьюзов и выдает его в ком-порт. После заливки его в мониторе com-порта я увидел вот что:
Для плат Arduino на Atmega328P должны быть такие значения фьюзов:
Тоесть фьюзы extended установлены в 0xFF - контроль питания отключен.
Для "лечения" необходимо перепрошить фьюзы. Для этого я использовал программатор USBASP
Подключаем его к Arduino соединяя одноименные выводы программатора с выводами платы Arduino (/RES -> Reset/RST). Устанавливаем в системе драйвер для USBASP (google).
Для прошивки фьюзов удобно использовать GUI консоль для AVRDude. В моем случае дело осложнилось тем, что на платах были установлены более новые контроллеры ATMega328PB, которые имеют другую сигнатуру, из-за чего софт скачанный в сети работать не захотел. Пришлось немного подшаманить и подправить конфиги. Заодно добавил режим пониженной тактовой частоты при прошивке, т.к. дефолтное значение не соответствует factory settings, что приводит к отказы/нестабильности при прошивке.
Итак подключаем контроллер к USBASP, запускаем AVRDUDEPROG. Выбираем правильный тип контроллера и программатор USBAspSlow. Фьюзы выбираем "прямые"
Переходим на страницу Fuses и нажимаем кнопку "Чтение"
Если все ок то появится надпись
И отобразаятся текущие прошитые значения фьюзов
Выставляем extended fuse в значение 0x05
И нажимаем кнопку "Программирование"
Отключаем контроллер от программатора. Все - мы изменили фьюзы отвечающие за контроль питания. Для проверки результата можно еще раз запустить скетч отображающий фьюзы и убедиться что все в порядке.
В атаче версия AVRDUDEPROG с модифицированными конфигами (пониженная частота и поддержка ATMega328PB)
Полезные ссылки
1. Arduino / ATmega 328P fuse settings
2. Upgrade to ATMega328pb
Для чтения текущих фьюзов был составлен простенький скетч ReadFuseBits Скетч читает значение фьюзов и выдает его в ком-порт. После заливки его в мониторе com-порта я увидел вот что:
Code: Select all
Low: 0xFF
High: 0xDA
Ext: 0xFF
Code: Select all
Low: 0xFF
High: 0xDA
Ext: 0xF5
Code: Select all
Небольшая ремарка по поводу значения фьюза Ext. Это байт в котором реально используются только младшие 3 бита. Значения остальных битов могут варьироваться. Например 0xFD это тоже валидное значение для ардуины. Поэтому надо смотреть на младшие три бита - там должна быть установлены 0й и 2й биты.
Подключаем его к Arduino соединяя одноименные выводы программатора с выводами платы Arduino (/RES -> Reset/RST). Устанавливаем в системе драйвер для USBASP (google).
Для прошивки фьюзов удобно использовать GUI консоль для AVRDude. В моем случае дело осложнилось тем, что на платах были установлены более новые контроллеры ATMega328PB, которые имеют другую сигнатуру, из-за чего софт скачанный в сети работать не захотел. Пришлось немного подшаманить и подправить конфиги. Заодно добавил режим пониженной тактовой частоты при прошивке, т.к. дефолтное значение не соответствует factory settings, что приводит к отказы/нестабильности при прошивке.
Итак подключаем контроллер к USBASP, запускаем AVRDUDEPROG. Выбираем правильный тип контроллера и программатор USBAspSlow. Фьюзы выбираем "прямые"
Переходим на страницу Fuses и нажимаем кнопку "Чтение"
Если все ок то появится надпись
И отобразаятся текущие прошитые значения фьюзов
Выставляем extended fuse в значение 0x05
И нажимаем кнопку "Программирование"
Отключаем контроллер от программатора. Все - мы изменили фьюзы отвечающие за контроль питания. Для проверки результата можно еще раз запустить скетч отображающий фьюзы и убедиться что все в порядке.
В атаче версия AVRDUDEPROG с модифицированными конфигами (пониженная частота и поддержка ATMega328PB)
Полезные ссылки
1. Arduino / ATmega 328P fuse settings
2. Upgrade to ATMega328pb