Прошиваем ардуину из BASCOM AVR

Собственно, на написание этого поста меня сподвигло полное отсутствие вменяемой информации по проблеме, связанной с ошибками дудки в паре Arduino UNO + BASCOM AVR, с которой я сегодня провозился часа три. Итак, по порядку.

Преамбула

Изначально была задача читать из АЦП MCP3208 (далее, просто «АЦП») по SPI и писать прочитанное на флешку — по той же шине. Из железа — Arduino UNO, самопальная платка с распаянным АЦП и ардуиношилд с разъемом SD-карточки.

На флешку писать получилось с полпинка. Был небольшой затык, связанный с длиной (и, подозреваю, сечением) китайских проводков, идущих в комплекте с макеткой — писался мусор — но потом я распаял всё как надо старыми добрыми советскими проводками, по случаю выдранными из какой-то радиолы старше меня, и запись прошла корректно.

А вот с АЦП образовалась проблема. Ни накопанная в интернетах ардуиновская библиотека, ни примеры кода у меня почему-то не заработали. Читались одни нули, хотя простой мультик показывал на одном из входов положенные туда 3В.
За отсутствием под рукой лог.анализатора (дело было на работе) решил подебажить ардуиновский elf-файл AVR-студией — и тут предо мной разверзлись врата ада ардуинокода. Фик с тем, что elf ардуины надо вытаскивать из глубокой задницы винды, это я нашёл довольно быстро. Самая печаль отражена на этом фото:

для моего «проекта» из нескольких строчек ардуинокоманд, это было слишком.

Увиденное также натолкнуло на мысль о «легкости» отладки в том случае, когда к дефолтному SD.init() добавятся команды SPI-библиотеки на общение с АЦП. Которому, к слову, нужны вполне определённые настройки SPI (MODE0,0 и не слишком высокая частота обмена, емнип) и они может быть даже расходятся с настройками SPI, зашитыми в SD-библиотеку.

В общем, я подумал, и решил обойтись BASCOM'ом. Он прост, быстр, и легок в отладке.
И да, всё так и оказалось, кроме одного: баскомовский прошивальщик не хотел шить ардуину.

Амбула

АрдуиноIDE шьёт плату дудкой (avrdude). Bascom шьёт дудкой. SinaProg шьёт дудкой тоже. Беру SinaProg, настраиваю на программер «Ардуино», её порт и ту скорость, что у порта в Диспетчере устройств и… Ни фига.
Копаю интернет на предмет ошибки ( avrdude: stk500_getsync(): not in sync: resp=0xYY — вместо YY цифры могут быть любыми, в зависимости от скорости, выставленной в настройках прошивальщика). Раскапываю почти что ничего — типа советов проверить провода, отключить JTAG, отсоединить всё, что могло висеть на пине RX ардуины, и т.п. Это всё не мои случаи, включая «отключение JTAG» — ведь сама ардуиноIDE как-то шьёт плату!..

Затем раскапываю в ардуиноIDE волшебную галку, открывающую выдачу лога прошивки в окно IDE. Но беда-беда, дудка выплёвывает столько, что начало лога (с командой дудке) неизменно затирается последующей выдачей. Ищу настройки размера буфера лога. Что-то меняю, безрезультатно.
Вспоминаю, что где-то видел лог в файле. Нахожу — в той же заднице, что и elf-файл прошивки, сгенеренный силами ардуиноIDE.

Открываю этот лог, нахожу (!!!) командную строку дудки, закидываю в свой батник, правлю пути к баскомовскому хексу, заодно правлю явно неправильную скорость порта, пытаюсь прошиться — ТА ЖЕ ОШИБКА.

Долго думаю. Проверяю скорость порта в Диспетчере устройств. Меняю её. Пишу ту же в командной строке. ОШИБКА.

Плюю на всё, ставлю 115200, что были в логе ардуиноIDE, шью — УСПЕХ!
Ставлю 115200 в SinaProg — УСПЕХ. Ставлю 115200 в настройках прошивальщика BASCOM AVR — УСПЕХ.

В итоге настройки прошивальщика Bascom принимают такой вид:


— и всё работает. Порт только нужно ставить тот, на котором плата висит у вас.

PS Пост написан для того лишь только, чтобы очередной страдалец шел не моим путем проб и ошибок, а — коротким и сразу к успеху. Можете минусить, главное не бейте стирайте.

PPS С чтением MCP3208 всё ещё вожусь. Но тут хоть прогресс есть.
  • +2
  • 15 октября 2014, 20:10
  • AntEkb

Комментарии (10)

RSS свернуть / развернуть
амая печаль отражена на этом фото:

Честно говоря, не совсем понял что за печаль. Ошибок в коде я не вижу…
То, что объекты создаются для всех доступных УАРТ даже если Вам они не нужны?
Или я чего не замечаю?
0
  • avatar
  • e_mc2
  • 16 октября 2014, 19:39
печаль в том, что 3 строчки в ардуиноIDE родили кучу подключенного кода в дебаге, в котором ногу сломишь. причем, самое смешное в том, что на ардуине-то в принципе люди кодят потому, что им не нравится С, а тут сплошь С и С++ ))
0
Понятно. Просто загрузив таким образом elf в отладку, Вы увидели внутреннюю реализацию, которая до этого была скрыта.

ардуине-то в принципе люди кодят потому, что им не нравится С, а тут сплошь С и С++ ))
Ну, на самом деле они кодят на С++. Только не знают этого :) Просто, для снижения порога вхождения, там используются самые простые средства данного языка.
0
для снижения порога вхождения
собственно, я предпочёл туда не входить вовсе )
0
Я бы еще сказал, что эта реализация совсем не страшная. На макросах С и тем более шаблонах С++ можно сделать куда более страшные вещи :)
0
(вспомнил про троллейбус из буханки черного хлеба)
0
«Но зачем?»? Ну, это уже зависит от задачи.
0
По строке, с которой вызывается дудка. Когда возник тот же вопрос, я набросал exe-шник, который на консоль выплёвывал параметры, с которыми был запущен. В понедельник прицеплю, он у меня на работе валяется. Кстати, оказалось, что разные arduino плат работают на разных скоростях. Е.м.н.и.п., 57600 и 115200 было.
+1
вот полезная кстати штука: переименовывай файл как тебе надо, подкидывай в нужное место и смотри :)
0
Кстати, оказалось, что разные arduino плат работают на разных скоростях. Е.м.н.и.п., 57600 и 115200 было.
В таком случае, скорость должна быть указана в конфиге плат. Мона там и смотреть.
В понедельник прицеплю, он у меня на работе валяется.
Элементарно же пишется на любом языке. На дельфи скажем — единственная строчка WriteLn(GetCommandLine). В консольном С, ЕМНИП, в main передается массив и количество аргументов — тоже простейший код в духе for(int i = 0; i < argn; i++) printf("%s ", arg[i]).
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.