LINUX.ORG.RU

arduino vs usbasp. то ли лыжи не едут

 , usbasp


1

1

Доброго времени суток

Взял народный программатор usbasp (скорее всего, китайский клон), чтобы извращаться с arduino более плотно. Там же два чипа, а через icsp можно по spi достучаться до них обоих напрямую. Будет весело (спойлер: было, но не так, как я представлял)

Линукс новую игрушку видит. Через udev добавил симлинк

SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="05dc", MODE="0660", SYMLINK+="USBasp", OWNER="router"

пнул

udevadm control --reload-rules
udevadm trigger

пока все хорошо

итак,

  • atmega328p-pu, основной чип, разъём ICSP
  • atmega16u2-mu, вспомогательный чип, разъём ICSP1 (на плате маркировки нет. есть только в datasheet. в общем тот, что ближе к USB)

отлично, avrdude согласен работать с обоими чипами:

# когда подключаюсь к ICSP, т.е. к основному чипу
avrdude -p atmega328p -c usbasp -P /dev/USBasp -v -n
avrdude -p atmega328p -c usbasp -P /dev/USBasp -v -U flash:r:/tmp/program.hex:i


# когда подключаюсь к ICSP1, т.е. ко вспомогательному чипу
avrdude -p atmega16u2 -c usbasp -P /dev/USBasp -v -n
avrdude -p atmega16u2 -c usbasp -P /dev/USBasp -v -U flash:r:/tmp/program_16u2.hex:i

Теперь пора подружить ide с новым программатором usbasp

снова подключаю usbasp к основному чипу (atmega328p, ICSP)

пока в arduino пустая программа

void loop() {
  delay(1000);

пусть помигает лампочкой. тривиально

void setup() {
  // put your setup code here, to run once:
  pinMode(13, OUTPUT);
}

void loop() {
  //delay(1000);

  // put your main code here, to run repeatedly:
  digitalWrite(13, HIGH);
  delay(100);
  digitalWrite(13, LOW);
  delay(1000);
}
  1. tools - programmer - usbasp (по дефолту было AVRISP mkii)
  2. upload . не работает. ок, тогда
  3. sketch - upload using programmer

upload using programmer проходит. начинает мигать лампочка

проблема

а вот дальше происходит что-то непонятное:

отключаю usbasp, подключаю к плате обычный usb кабель

и arduino отказывается делать upload

avrdude тоже отказывается работать:

router@calypso:~$ avrdude -p atmega328p -c arduino -P /dev/ttyACM0 -v -n

avrdude: Version 7.1
         Copyright the AVRDUDE authors;
         see https://github.com/avrdudes/avrdude/blob/main/AUTHORS

         System wide configuration file is /etc/avrdude.conf
         User configuration file is /home/router/.avrduderc
         User configuration file does not exist or is not a regular file, skipping

         Using Port                    : /dev/ttyACM0
         Using Programmer              : arduino
avrdude stk500_recv() error: programmer is not responding
avrdude stk500_getsync() warning: attempt 1 of 10: not in sync: resp=0x00
avrdude stk500_recv() error: programmer is not responding
avrdude stk500_getsync() warning: attempt 2 of 10: not in sync: resp=0x00
avrdude stk500_recv() error: programmer is not responding
avrdude stk500_getsync() warning: attempt 3 of 10: not in sync: resp=0x00
avrdude stk500_recv() error: programmer is not responding
avrdude stk500_getsync() warning: attempt 4 of 10: not in sync: resp=0x00

лампочка мигает, т.е. программа, которую я до этого залил через usbasp, выполняется

очень интересно. отключаю usb кабель, подключаю usbasp к основному чипу (atmega328p, ICSP)

через avrdude пробую прогнать verify (сравнить с дампом, который я сделал до изменения программы)

router@calypso:~$ avrdude -p atmega328p -c usbasp -P /dev/USBasp -v -U flash:v:/tmp/program.hex:i

[...]

Reading | ################################################## | 100% 8.18 s

avrdude avr_verify() warning: verification mismatch
        device 0xff != input 0x04 at addr 0x0254 (error)
        device 0xff != input 0x01 at addr 0x0255 (error)
        device 0xff != input 0x30 at addr 0x0256 (error)
        device 0xff != input 0x91 at addr 0x0257 (error)
        device 0xff != input 0x00 at addr 0x0258 (error)
        device 0xff != input 0x01 at addr 0x0259 (error)
        device 0xff != input 0x23 at addr 0x025a (error)
        device 0xff != input 0xe0 at addr 0x025b (error)
        device 0xff != input 0x23 at addr 0x025c (error)
        device 0xff != input 0x0f at addr 0x025d (error)
        suppressing further verification errors
avrdude do_op() error: verification mismatch

для очистки совести подключаюсь к второму чипу (atmega16u2, ICSP1), прогоняю верификацию и на нём - там всё в порядке

снова подключаюсь к основному чипу (atmega328p, ICSP) и через avrdude заливаю старый дамп

router@calypso:~$ avrdude -p atmega328p -c usbasp -P /dev/USBasp -v -U flash:w:/tmp/program.hex:i

[...]

avrdude: auto set sck period (because given equals null)
avrdude: AVR device initialized and ready to accept instructions
avrdude: device signature = 0x1e950f (probably m328p)
avrdude: Note: flash memory has been specified, an erase cycle will be performed.
         To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: auto set sck period (because given equals null)
avrdude: reading input file /tmp/program.hex for flash
         with 32768 bytes in 1 section within [0, 0x7fff]
         using 256 pages and 0 pad bytes
avrdude: writing 32768 bytes flash ...

Writing | ################################################## | 100% 11.58 s

avrdude: 32768 bytes of flash written
avrdude: verifying flash memory against /tmp/program.hex

Reading | ################################################## | 100% 8.00 s

avrdude: 32768 bytes of flash verified

avrdude done.  Thank you.

отключаю usbasp, подключаю плату обычным usb кабелем. Теперь снова с ней работает и arduino ide, и avrdude

для очистки совести воспроизвожу проблему

  1. подключаю программатор usbasp к основному чипу (atmega328p, ICSP)
  2. через arduino ide залил новую программу. вижу, что она начала работать
  3. отключаю usbasp, подключаю плату обычным usb кабелем. программа выполняется
  4. проблема. arduino ide отказывается что-либо прошивать. avrdude отказывается работать с платой

  1. отключаю обычный usb, подключаю usbasp к основному чипу, заливаю старый дамп
  2. отключаю программатор usbasp, подключаю обычный usb
  3. все работает

WTF?

Я не менял ничего на вспомогательном чипе atmega16u2, который обеспечивает работу с usb, поддержку cdc acm, поддержку dfu. и прошивку основного чипа без дополнительных программаторов

Насколько я понимаю, я менял исключительно программу для основного чипа

Каким образом это могло привести к тому, что штатный программатор - вспомогательный чип atmega16u2 - отказывался работать с основным (до возвращения старого дампа)?

★★★★★

Последнее исправление: router (всего исправлений: 1)
Ответ на: комментарий от EAT_INSIDE

И как-то странно. Новая программа при подключении usb кабеля начинает выполняться, по миганию лампочки видно. Т.е. оно иногда может работать и без загрузчика, но прошить при этом нельзя?

router ★★★★★
() автор топика
Ответ на: комментарий от router

Я не знаю, какая именно у тебя плата, но инфа 95%, что «управляющий» чип - не программатор, а usb-uart, общающийся с бутлоадером. Луркай optiboot.

У avrdude есть цель «-p arduino» для этого протокола.

При прошивке через uart бутлоадер вроде технически не может себя затереть. А вот при заливке руками через SPI ты сделал полный вайп флеша и занулил его.

В arduono ide раньше юыла ф-цич прошивки бутлоадера через spi, если он тебе нужен

EAT_INSIDE
()
Ответ на: комментарий от router

Когда пользовательский загрузчик затёрт, на его месте FFки, что для AVR nop. Чип просто делает ничто до тех пор, пока до прошивки не доберётся, что ты сейчас имеешь.

Optiboot, в зависимости от конфига, чекает условия и либо падает в режим обновления прошивки, либо запускает её. Если не ошибаюсь, по лефолту он полсекунды ждёт на uart первого пакета от прошивальщика, при таймауте ребутает чип уже в основную прошивку.

EAT_INSIDE
()
Последнее исправление: EAT_INSIDE (всего исправлений: 1)
Ответ на: комментарий от EAT_INSIDE

Вот оно что. Спасибо, пойду читать код загрузчика

router ★★★★★
() автор топика
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.