Прошиваем ардуину из 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
амая печаль отражена на этом фото:
Честно говоря, не совсем понял что за печаль. Ошибок в коде я не вижу…
То, что объекты создаются для всех доступных УАРТ даже если Вам они не нужны?
Или я чего не замечаю?
печаль в том, что 3 строчки в ардуиноIDE родили кучу подключенного кода в дебаге, в котором ногу сломишь. причем, самое смешное в том, что на ардуине-то в принципе люди кодят потому, что им не нравится С, а тут сплошь С и С++ ))
Понятно. Просто загрузив таким образом elf в отладку, Вы увидели внутреннюю реализацию, которая до этого была скрыта.
ардуине-то в принципе люди кодят потому, что им не нравится С, а тут сплошь С и С++ ))Ну, на самом деле они кодят на С++. Только не знают этого :) Просто, для снижения порога вхождения, там используются самые простые средства данного языка.
По строке, с которой вызывается дудка. Когда возник тот же вопрос, я набросал exe-шник, который на консоль выплёвывал параметры, с которыми был запущен. В понедельник прицеплю, он у меня на работе валяется. Кстати, оказалось, что разные arduino плат работают на разных скоростях. Е.м.н.и.п., 57600 и 115200 было.
Кстати, оказалось, что разные arduino плат работают на разных скоростях. Е.м.н.и.п., 57600 и 115200 было.В таком случае, скорость должна быть указана в конфиге плат. Мона там и смотреть.
В понедельник прицеплю, он у меня на работе валяется.Элементарно же пишется на любом языке. На дельфи скажем — единственная строчка WriteLn(GetCommandLine). В консольном С, ЕМНИП, в main передается массив и количество аргументов — тоже простейший код в духе for(int i = 0; i < argn; i++) printf("%s ", arg[i]).
Комментарии (10)
RSS свернуть / развернуть