Avrdude: Arduino UNO as isp

Тема в разделе "Микроконтроллеры AVR", создана пользователем jvune, 27 фев 2017.

  1. jvune

    jvune Нуб

    Коллеги, мне нужно научиться прошивать одну плату при помощи другой с использованием avrdude. В сети есть довольно много материалов, рассказывающих, как это сделать. Например, вот это видео:


    Делаю всё то же самое, но в качестве прошиваемого устройства использую pro mini. Соединяю как рекомендуется здесь: https://www.arduino.cc/en/Tutorial/ArduinoISP 13-13 12-12 11-11 10-rst. Через Arduino IDE - всё заливается: uno выступает в качестве программатора, код уходит на mini.
    Пытаюсь сделать через: avrdude -c arduino -p m328p -P COM2 -u -U flash:w:blink.hex - код упорно заливается на саму uno!
    Запускаю под виндой.
    Что я делаю не так?
     
  2. Для прошивки пустого МК параметр -с должен быть avrisp, скорость должна быть 19200 (-b 19200). НО, сильно подозреваю, что после такой прошивки загрузчик pro mini будет затерт.
     
  3. jvune

    jvune Нуб

    Андрей, спасибо!

    До этого пробовал задавать разные программаторы, неизменно получал avrdude: stk500_getsync(): not in sync: resp=0x00

    Помогло добавление -b 19200(хотя, я думал, что это стандарт)

    В итоге, рабтает и
    avrdude -c stk500v1 -b 19200 -p m328p -P COM2 -u -U flash:w:blink.hex, и
    avrdude -c avrisp -b 19200 -p m328p -P COM2 -u -U flash:w:blink.hex, и даже
    avrdude -c arduino -b 19200 -p m328p -P COM2 -u -U flash:w:blink.hex.
    Баудрейд убираешь - опять на программатор всё пишется. Мистика. )
     
  4. Т.е.
    • ArduinoISP устанавливает скорость последовательного интерфейса 19200
    • Программирование самой платы Arduino UNO выполняется на скорости 115200
    • Действия зависят от этой скорости
    Домысел конечно, но может быть при скорости 115200 программирующий контроллер 16U2 считает, что команды предназначены ему, перезагружает основной контроллер и заливает в него код?
     
    jvune нравится это.
  5. AlexU

    AlexU Гуру

    Дополнительный контроллер 16U2 ни чего не программирует. Он выполняет роль преобразователя USB <-> USART. Программированием занимается загрузчик (bootlaoder), зашитый в основной контроллер ATmega328P. Но этот загрузчик ожидает, что данные от мк-преобразователя 16U2 по USART будут приходить на скорости 115200. Если скорость будет другая, то загрузчик запустит пользовательский код. И если в качестве пользовательского кода будет зашит скетч ArduinoISP, то USART будет настроен на скорость 19200.
    Это потому, что по умолчанию avrdude работает на скорости 115200. Вся мистика улетучится, если покопаетесь в исходниках загрузчика 'optiboot' (он используется для ATmega328P) и скетча ArduinoISP.
     
    jvune нравится это.
  6. 2 AlexU
    Вопрос по поводу 16U2. Понятно, что это не ICSP-программатор, но по идее он же должен распознавать команды программирования и выполнять сброс основного контроллера?
     
  7. rkit

    rkit Гуру

    При установке com-соединения сбрасывает автоматически. Специальной команды нет.
     
  8. AlexU

    AlexU Гуру

    Ни чего 16U2 не распознаёт -- он через себя шлёт данные в оба направления без какой-либо обработки. Имеется в виду без обработки пользовательских данных, а так данные упаковываются/распаковываются в/из USB-пакеты или USART-пакеты. Но как уже сообщили выше, при открытии COM-порта, микроконтроллер 16U2 производит сброс микроконтроллера ATmega328P -- на ногу RESET этого основного контроллера подаётся сигнал перезагрузки. Сигнал перезагрузки подаётся всегда при открытии COM-порта, не зависимо от того, для чего этот порт был открыт -- для программирования или просто для обмена. И это нужно учитывать в своих прошивках, если планируется обмен данными по USART с основным микроконтроллером.

    Дополнительно хочу сказать, что из 16U2 можно сделать ICSP-программатор без особых усилий (даже паять ничего не придётся). Например можно сделать клон Atmel AVRISP mk II и с помощью этого клона шить ATmega'и и ATtiny'ки. Вообще 16U2 это микроконтроллер лишь немного уступающий ATmega328P в памяти. А так возможности почти те же и работает на тех же 16 МГц (только у 16U2 частота более стабильная, т.к. используется кварц, а не дешёвый керамический резонатор, как у основной ATmega328P).
     
    jvune нравится это.
  9. Airbus

    Airbus Радиохулиган Модератор

    Зачем эти исскуственные роды?Можно же спвять нормальный прогер на тини 45 или 2313 ну или на меге 8.А можно купить за 120 рублей на ебае если лень паять.Зачем уродовать ардуины снося бутлоадер и лоча кристал?Ну да теоретически можно но это все равно что на Оке перевозить мебель можно но неудобно.
     
  10. AlexU

    AlexU Гуру

    У многих пользователей оригинальная Arduino UNO -- это плата с микроконтроллером ATmega328P, а моя оригинальная Arduino UNO -- это двух-микроконтроллерная плата ATmega328P + ATmega16U2, можно сказать, с удвоенной производительностью. Именно это хотел сказать в дополнении в предыдущем посте, а Вы прочитали только про возможность сделать из неё AVRISP программатор.
     
  11. Если я правильно понял, главный модуль программы для 16u2 Arduino-usbserial.c (https://github.com/arduino/Arduino/...no/avr/firmwares/atmegaxxu2/arduino-usbserial) и в главном цикле он
    • Читает байт из USB (если есть) и помещает его в буфер USBtoUSART_Buffer
    • Передает данные из буфера USARTtoUSB_Buffer в USB (если данные есть и либо их много, либо произошло переполнение таймера)
    • Передает один байт из буфера USBtoUSART_Buffer в USART (если буфер не пуст)
    В прерывании ISR(USART1_RX_vect) поступивший байт помещается в буфер USARTtoUSB_Buffer.
    Состояние вывода сброса меняется в EVENT_CDC_Device_ControLineStateChanged().
    Где выполняется задание скорости работы USART пока не нашел. Ну и USB - пока черный ящик.
     
  12. AlexU

    AlexU Гуру

    Там же функция 'EVENT_CDC_Device_LineEncodingChanged'. Эти две функции (EVENT_CDC_Device_ControLineStateChanged и EVENT_CDC_Device_LineEncodingChanged) -- это функции-обработчики, так называемых, пакетов управления. Когда программа на компьютере открывает COM-порт и конфигурирует его (скорость, чётность, стоповые биты и т.п.), драйвер, обслуживающий такой порт, формирует USB-пакеты управления и отправляет их устройству. И устройство в соответствии с данными из этих пакетов настраивает параметры USART интерфейса. EVENT_CDC_Device_ControLineStateChanged -- это пакет управления линией DTR у обычных USBtoSerial преобразователях.
     
  13. Airbus

    Airbus Радиохулиган Модератор

    Да я всё нормально понял-вопрос не в том.А в том что уже много лет народ пытается сделать из Ардуино программатор но делает это настолько коряво и безруко что меня аж передёргивает. Там есть очень много нюансов которые надо соблюсти я и сам сделал под это дело шилд с 3мя панельками но потом подумал "а зачем?" есть же нормальные устройства. Вот предлагаю совместными усилиями описать что и как делать пошагово (и самое главное-чего делать не надо!) чтоб из Ардуино сделать полноценный AVRISP программатор. И как потом прошить AVR микроконтроллер. Только так чтоб было понятно любому Нубу. Видео просто жесть какие то команды привет от MS-DOS да и ещё под линукс. Тут не только начинающий не разберётся тут и опытный решит "а ну её накуй". Немного путано но надеюсь вы меня поняли?
    Есть у меня и такая тоже и знаю о её больших возможностях но вот только перешивать ATmega16U2 не хотелось бы без крайней необходимости. да и начинающим это тоже не под силу.
     
  14. AlexU

    AlexU Гуру

    Написать конечно можно, но на эту тему уже столько написано-переписано, что смысла особого нет. Получиться что-то вроде -- "Смотрите как я сделал", а в ответ "О, очередной умник нашёлся". Да и Arduino тратить на это дело -- это расточительство. На том же Али программаторы USBASP менее 100 руб "за пачку";).
     
  15. Airbus

    Airbus Радиохулиган Модератор

    Проблема вот в чем (лично для меня)прошился Арлуино как usbasp дальше чем шить?Дудка в чистом виде не шьет ее надо тюнинговать после тюнинга с другими программаторами не работает.Да из сред не шьет ни из Кодвижн ни из Студии.Какой программой заливать НЕХ?А тема реально была бы интересна и не только нубам.Написать ее и в ФАК.
     
    Последнее редактирование: 3 мар 2017
  16. Есть вопросы.

    2AlexU
    Имеется ввиду перепрошивка 16U2 на плате Arduino и подключение прошиваемого контроллера к разъему ICSP 16U2? Что это даст по сравнению с Arduino as ISP и по сравнению с готовой дешевой платой USBASP?

    Чем отличается и что дает AVRISP по сравнению с USBASP?
     
  17. AlexU

    AlexU Гуру

    Честно говоря, с USBASP дел не имел -- собрал клон AVRISP mk II, хватает "за глаза". Но насколько знаю основные проблемы с USBASP связаны с тем, что китайцы продают их с устаревшими прошивками, поэтому avrdude ругается на них.
    Ни чего особого не даст и в контексте перепрошивания мк AVRISP от USBASP ни чем не отличается. Основанием для того, чтобы сделать из 16U2 программатор, может служить только то, что под рукой нет программатора или другой свободной Arduino на основе AVR с USB разъёмом, а плату (мк) хочется восстановить поскорее. Например, купили Arduino UNO (оригинальную) и случайно сожгли основной мк (ATmega328), купить его и поменять не проблема, но нужно восстановить бутлоадер, а под рукой кроме этой UNO больше ни чего нет. Вот тут-то и спасёт мк 16U2 -- без каких-либо доп. затрат сможете восстановить основной контроллер за несколько минут, кликая мышкой или нажимая кнопки на клавиатуре.
     
  18. Почти мой случай, в другой теме я писал об этом. Испортил m328, но не совсем - по крайней мере процессор остался работоспособным и другой контроллер я прошивал с его помощью.