Почему мне пришлось программировать загрузчик Duemilanove?
В качестве волонтера организации Public Invention я разработал конструкцию на основе Atmega328, в которой я думал, что в значительной степени копирую Arduino UNO. В отличие от UNO, я выбрал микросхему USB-UART CH340, так как она входила в состав некоторых клонов UNO, которые я приобрел.
Наш проект General Alarm Device находится по адресу: https://github.com/PubInv/general-alarm-device
Летом 2022 года мы собрали 15 сборок версии 1. Когда мы решили установить в них загрузчик, мы обнаружили, что можем установить загрузчик Duemilanove, но не UNO. Мы не знаем почему.
Даже с загрузчиком Duemilanove время от времени возникают проблемы с загрузкой кода. Иногда IDE сообщает о проблеме, но код загружается. И, возможно, несколько раз нам приходилось пытаться загрузить более одного раза. Вот проблема, написанная после того, как у одного пользователя возникли трудности с загрузкой прошивки: https://github.com/PubInv/general-alarm-device/issues/127
Похожие вопросы, Это способ проверить, какой загрузчик установлен на плате?
Может ли наша корневая проблема быть связана с тем, какой загрузчик был на UNO, который мы использовали в качестве ICP?
1 ответ
Похожие вопросы. Есть ли способ проверить, какой загрузчик установлен на плате?
Некоторое время назад я написал код для обнаружения сигнатур чипов, который также сообщает об известных загрузчиках: http:// www.gammon.com.au/forum/?id=11633
Она действительно слишком длинная, чтобы писать здесь. Однако код находится по адресу https://github.com/nickgammon/arduino_sketches, в частности, в Atmega_Board_Detector. папка.
Это тот же чип процессора, у вас не должно возникнуть проблем с загрузкой, если вы используете соответствующую тактовую частоту и скорость передачи данных.
Посмотрите мои ответы здесь:
Где я могу узнать, что подходит?
Что ж, загрузчики жестко запрограммировали скорость, с которой они ожидают поступления последовательных данных. В случае Optiboot это 115200 бод, некоторые другие загрузчики могут использовать 9600, 57600 или другие скорости.
Теперь эта скорость передачи данных также зависит от тактовой частоты процессора, поскольку скорость передачи данных определяется системными часами.
Например, на Uno Optiboot "ожидает" (в том смысле, что компьютер может ожидать чего угодно), что он будет работать на плате на частоте 16 МГц и что связь будет на скорости 115200 бод.
Итак, если вы работаете на частоте 8 МГц (половина этой скорости), то скорость передачи, естественно, будет 57 600. Однако вы можете компенсировать это, отредактировав файл boards.txt
в вашей установке Arduino. и изменение скорости передачи данных, например.
uno.name=Arduino Uno
uno.vid.0=0x2341
uno.pid.0=0x0043
uno.vid.1=0x2341
uno.pid.1=0x0001
uno.vid.2=0x2A03
uno.pid.2=0x0043
uno.vid.3=0x2341
uno.pid.3=0x0243
uno.upload.tool=avrdude
uno.upload.protocol=arduino
uno.upload.maximum_size=32256
uno.upload.maximum_data_size=2048
uno.upload.speed=115200
uno.bootloader.tool=avrdude
uno.bootloader.low_fuses=0xFF
uno.bootloader.high_fuses=0xDE
uno.bootloader.extended_fuses=0xFD
uno.bootloader.unlock_bits=0x3F
uno.bootloader.lock_bits=0x0F
uno.bootloader.file=optiboot/optiboot_atmega328.hex
uno.build.mcu=atmega328p
uno.build.f_cpu=16000000L
uno.build.board=AVR_UNO
uno.build.core=arduino
uno.build.variant=standard
Измените строку "uno.upload.speed" читать 57600 в этом случае. Таким образом, программа (avrdude), которая загружается на плату, будет загружаться медленнее, а поскольку вы работаете с меньшей скоростью, все будет хорошо.
Итак, чтобы все заработало:
Узнайте, какой у вас загрузчик (путем сравнения подписей), или просто загрузите новый загрузчик известного типа. У меня есть страница о загрузке загрузчиков, которая может вам помочь.
Поищите (например, в этом файле), какую скорость передачи данных использует этот конкретный загрузчик (например, 115200 для Optiboot).
Настройте процессор на эту тактовую частоту с помощью кристалла или резонатора. (см. строку «uno.build.f_cpu», которая в данном случае равна 16000000).
Если вы решите запустить процессор на другой скорости (например, используя внутренние часы, на частоте 8 МГц), то либо используйте загрузчик, рассчитанный на 8 МГц, либо измените строку скорости загрузки в файле как уже упоминалось выше. Я предлагаю скопировать/вставить существующую запись, изменив, например, "uno" в начале каждой строки на "myboard" или что-то в этом роде, а "имя" линия, поэтому она появится в раскрывающемся меню доступных плат).
Привет, Ник, спасибо за ссылку на код, я надеюсь попробовать его в ближайшее время. Что касается «при условии, что вы используете соответствующую тактовую частоту и скорость передачи данных». Где я узнаю, что является подходящим. Вот об этом я и спрашиваю. Я не боюсь читать документацию, но понятия не имею, по каким ключевым словам искать., @Forrest Erickson
@ForrestErickson Смотрите измененный ответ., @Nick Gammon
- Будет ли загрузчик Duemilanove работать в Uno?
- Загрузка загрузчика в ATMEGA328 P
- Не удается снова загрузиться после смены платы
- Что происходит, когда код загружается с помощью загрузчика?
- Ошибка при записи загрузчика
- Что означает avrdude: Device signature = 0x000000? Неисправная проводка? Проблема с программным обеспечением? Неправильная инструкция?
- Digispark Atinny85 не распознан (проблема с загрузчиком)
- Ошибка проверки Avrdude
разница заключается в скорости передачи данных. Загрузчик Duemilanove использует гораздо меньшую скорость передачи данных. у вас есть проблема с последовательной схемой USB-TTL, @Juraj
Привет Juraj, Можете ли вы указать мне документацию для этих скоростей передачи данных. Для чего мне гуглить?, @Forrest Erickson
см. файл boards.txt для платформы AVR. (или прочитать в консоли IDE параметры команды загрузки), @Juraj