ISP программатор из Arduino nano

ForZe

✩✩✩✩✩✩✩
2 Май 2024
6
0
Добрый день/вечер/ночер граждане. Подскажите пожалуйста с таким вопросом.

Есть несколько Ардуинок нано и несколько mini pro. Для программирования mini pro решил пожертвовать одну из Nano под ISP программатор. Собрал мини схемку, поставил кандёр на 10uF между землёй и RST. Залил скетч из примера Arduino ISP. Всё заработало, прекрасно шьются скетчи через программатор, заливается бутлоадер и т.д. Казалось бы, вот оно счастье, и можно смело "упаковывать" новоиспечённый программатор в термоусадку от лишних внешних воздействий и пользоваться... Но... Но спустя какое-то время он перестаёт работать. При попытке залить бутлоадер через этот программатор, Arduino IDE очень долго думает и в итоге пишет следующий отчёт:
C++:
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x03
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0x03
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0x03
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0x03
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0x03
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0x03
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0x03
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0x03
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0x03
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x03
Failed programming: uploading error: exit status 1
Такая-же история при попытке залить через него скетч.

Далее, я "распаковываю" термоусадку, выпаиваю конденсатор, перезаливаю скетч Arduino ISP, проверяю, всё снова работает. На всякий случай, убрал защитный диод Шоттки с линии 5В, т.к. на нём было падение напряжения аж в 0,5В и до mini pro вместо 5В доходило 4.5-4.6В. Думал может тут какая-то проблема и программируемому девайсу питания не хватает. Поставил конденсатор на 47uF, чтобы резет точно не дёргался при заливке прошивок через программатор. Всё опять перепроверил - работает, bootloader шьётся, скетчи заливаются и т.д. Упаковал в термоусадку и убрал. Пару дней отлаживал скетч на Arduino Uno, когда скетч был готов, решил наконец собрать девайс на mini pro и снова получил от программатор ошибку как указанна под спойлером. Лечится, если опять распаковывать, убирать конденсатор, перезаливать скетч Arduino ISP. И снова всё работает, но через какое-то время программатор перестаёт функционировать.

З.Ы. Я чё-то уже не пойму в чём проблема. Для теста сделал из второй Arduino nano ещё один ISP программатор. На нём такая-же фигня. Сразу после заливки скетча Arduino ISP работает и всё отлично, через какое-то время перестаёт. Думал может в чипах дело... Но одна плата на 328P-TH, другая на 328P-KR. А проблема одна и та-же на обоих. По какой-то причине прошивка у программатора слетает чтоли... Я не могу понять в чём дело. Другие скетчи залитые в эти-же Ардуинки работают и функционируют не слетая. А вот именно с Arduino ISP такая проблема.
 

ForZe

✩✩✩✩✩✩✩
2 Май 2024
6
0
залили скетч не в программируемую ардуину, а в сам программатор.
100% нет. Разницу в заливке скетча на прямую в подключённый девайс и через "скетч/загрузить через программатор" понимаю.

Вопрос (предварительно и надеюсь окончательно) решил вчера вечером. Полазив по зарубежным форумам, оказалось, что такая проблема встречалась не только у меня, хотя и редкая. Обычно советы заканчиваются переустановкой драйверов на чипы CH340, переустановкой ПО и т.д. Но случай не тот. Все платы шьются на прямую через UART прекрасно и соответственно очень наврятли проблемы с дровами и ПО. Да и ISP-программатор пока свежесобранный шьёт отлично и как надо. Проблемы начинались почему-то на следующий день.

Если кому-то будет интересно почитать длиннющую портянку о том как решал вопрос, то спрячу под спойлер всю историю с действиями.
Я решил пойти от противного и по наблюдениям. Зашил ещё одну голую Нано. Вообще без подключения/запайки чего либо. Ей-же дал команду зашить загрузчик. Естественно, т.к. ничего к ней не подключено, Arduino IDE весело выдал сообщение:
C++:
avrdude: Yikes!  Invalid device signature.
         Double check connections and try again, or use -F to override
         this check.

Failed chip erase: uploading error: exit status 1
Логично, ведь она ничего не видит по SPI. Подключаю собранный "программатор". Так-же без подключения прошиваемой платы (просто провода в воздухе висят). Так-же, даю команду шить загрузчик. Опа, а она и не пытается определить сигнатуру чипа. Вываливается портянка :
C++:
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x03
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0x03
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0x03
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0x03
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0x03
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0x03
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0x03
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0x03
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0x03
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x03
Failed programming: uploading error: exit status 1
Потихоньку делаю обратную разборку программатора с попытками прошить загрузчик. Смотрю, когда он хотя бы попытается определить сигнатуру. И таки не прогадал. После снятия конденсатора между GND и RST, Нано всё таки выдала ошибку о битой сигнатуре. Но в чём дело? Как за сутки, отключенная от питания Нано ломает себе голову конденсатором? Причём я же его менял. Я сначала ставил кондер на 10uF, потом ставил другой на 47uF. Значит проблема не в самом конденсаторе, а в принципе в его наличии между GND и RST. В итоге притянул перемычкой RST к соседнему пину 5V, чтобы вообще ничего и никак не "дёргалось", никогда. Точнее впаял штыри под джемпер, чтобы не мучаться с паяльником в случае необходимости в очередной раз перезалить скетч.

Далее читая импортные форумы (не всегда англоязычные), наткнулся на очень схожую проблему у другого пользователя. Ему посоветовали переназначить порты 11, 12 и13, ссылаясь на то, что некоторые китайские чипы могут не правильно работать, когда одни и те-же порты являются и программатором для другого устройства и для самого себя. Там-же несколькими постами дальше кто-то посоветовал назначить на 3, 5, 6 порты MOSI, MISO и SCK соответственно, аргументировав тем, что порты поддерживающие ШИМ имеют какую-то там меньшую задержку или что-то там ещё... Короче я не осилил весь технический рассказ переводить гуглом и сделал как советуют.
C++:
#define ARDUINOISP_PIN_MOSI 3
#define ARDUINOISP_PIN_MISO 5
#define ARDUINOISP_PIN_SCK 6
Так как эти-же пины задействованы на светодиоды отвечающие за индикацию ошибки и состояния, светодиоды получили адреса 13 и 12 соответственно. А пин 3 и так был ничем не занят в скетче.
C++:
#define LED_ERR 13
#define LED_PMODE 12
Заодно хоть светодиод на 13 ноге пригодиться. Будет ошибкой моргать в случае чего. Если будет...

Долго вчитывался в комментарии к скетчу Arduino ISP. Опять пополам с переводчиком, пополам с описанием некоторых терминов... По этому понимание несколько искажено. Смутило несколько комментариев с упоминанием Uno. Ну, думаю, Нано = Уно, плюс минус одного поля ягоды, т.к. чип один и тот-же... Текст который я прочитал уже в переводе:
Если вы обнаружите, что эта проводка более // практично, есть определение USE_OLD_STYLE_WIRING. Это будет работать даже в том случае, если нет // используя Uno
Чёрт его знает как это понимать. Ну ладно, я понял так, что если раскомментировать эту строку, то получится "проводка более // практично". Раскомментировал. Залил в плату и вот теперь сижу радуюсь.

З.Ы. Что именно послужило причиной результата, я сказать точно не могу, т.к. я за вечер всё скопом проделал всё вышеописанное сразу, не делая пауз по несколько дней между тестами. Надоело по мелочам менять каждый день-два.

Наконец-то работает без глюков, шъёт быстро, пока всё что в доступе из чипов 328P (это оригинальные AU, китайские ТH, и что-то ранее не встречавшиеся KR) программируется без проблем. Прошли сутки. Подожду ещё дня 2, погоняю пока Uno и попробую снова. Если всё будет работать, то возрадуюсь окончательно.
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,871
599
44
Чтобы с подобным не мучаться проще за несколько сотен купить USB-ASP/ISP с переходником.
 

ForZe

✩✩✩✩✩✩✩
2 Май 2024
6
0
@Геннадий П, может быть. Но иногда и помучаться интересно. Это своеобразный квест. Да и приятно, когда сделано собственноручно
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
340
105
@ForZe,
Я бы начал с контроля целостности прошивки.
Когда Arduino as ISP перестает работать программатором - прочитать его прошивку и сравнить с исходными значениями.
Проблемы это не решит, но хотя бы будет известно, что и насколько портится.
 
  • Лойс +1
Реакции: ForZe

Геннадий П

★★★★★★✩
14 Апр 2021
1,871
599
44
@ForZe, Если хотите на постоянную оставить прошитую ардуину в качестве программатора, то советую убрать конденсатор в цепи между DTR и сброса контроллера, чтобы она автоматически не переводилась в режим прошивки, чтобы случайно не залить на нее другую прошивку.

1714761062439.png
 
  • Лойс +1
Реакции: ForZe

ForZe

✩✩✩✩✩✩✩
2 Май 2024
6
0
Когда Arduino as ISP перестает работать программатором - прочитать его прошивку
На сколько я понял, из контроллеров серии Mega (за другие не знаю, не изучал) можно слить только дамп прошивки через AVR Dude в виде набора машинного кода. Я не вывезу изучение и чтение машинного кода. Ардуино начал изучать всего пару месяцев назад, куда там до таких тонкостей... :(

Если хотите на постоянную оставить прошитую ардуину в качестве программатора, то советую убрать конденсатор в цепи между DTR и сброса контроллера
Эх, чуть бы раньше этот совет) Только буквально час назад упаковал опять в термоусадку... Если опять что-то случится и придётся распаковывать, то уберу обязательно. А вообще, приведенная Вами схема слегка отличается от той, что я вижу на плате. Не сильно, но есть отличия.

Вот на пример фотография платы Arduino nano из сети:
e0e3bd32_c5a7_11ea_a67c_5404a66b5ef8_e0e3bd33_c5a7_11ea_a67c_5404a66b5ef8.jpg

Вот фотография Нано, которая у меня:
IMG_20240503_224511.jpg
К ней уже присобачили диод Шоттки на линию 5В, видимо для защиты USB порта компьютера, если кому-то приспичит запрограммировать контроллер не отключив от внешнего питания. Стоит резисторная сборка на 1Ком, небольшие изменения в обвязке CH340C. На фотке из интернета, вроде стоит танталовый кондёр между GND и кнопкой Reset, а на моей плате его нет и Reset на прямую замыкает на GND при нажатии. Хотя, неверное, для классического изучения темы Ардуино и простого обывателя это уже бесполезная инфа.
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,871
599
44
А вообще, приведенная Вами схема слегка отличается от той, что я вижу на плате. Не сильно, но есть отличия.
Отличие только в версии CH340. На моей схеме с индексом G, у вас с индексом C. Тестером вызвонить от вывода сброса на контроллере.
 
  • Лойс +1
Реакции: ForZe