Приветствую всех, кто каким-то чудом нашел этот блог. Формат данного блога свободный и в нем я стараюсь делиться различными полезностями, размышлениями о различных событиях, своим творчеством.

Ищу IDE для ATtiny13A. Arduino IDE не предлагать!

Всем привет. В этой статье я очень хочу затронуть заблуждения, с которыми я столкнулся на старте изучения программирования микроконтроллеров семейства Tiny (в частности Attiny13a), связанное с выбором IDE и не только. Совокупность таких заблуждений можно заметить вокруг способа программирования и прошивки этого микроконтроллера через Arduino IDE. Что же я имею в виду?

Есть, например, заблуждение, что Arduino IDE, в которой можно без проблем программировать подобные микроконтроллеры, воспринимает только “ардуиновский код”. Более прошаренные могут подразумевать именно структуру кода с якобы обязательным void setup() и void loop() в файле .ino. Конкретно вспомнил видео, где, как мне показалось, мужик удивился тому, что Arduino IDE проглотила код на чистом C.

Возможно я неправильно интерпретировал видео и мужик все же на тот момент знал, что этот код скомпилируется без проблем и просто показывает своим зрителям, что Arduino IDE может работать с чистым C. Тем не менее заблуждение такое есть и люди, услышав про “ардуиновский код”, представляют, что для Ардуино есть свой специальный язык программирования. Я обязательно объясню, почему это не так.

Все же речь идет прежде всего об Attiny13a и ему подобных (в статье я их иногда буду называть тиньками). То неверное представление об “ардуиновском коде” породило еще одно заблуждение. А конкретно заблуждение о том, что эти микроконтроллеры (Attiny13a) нужно программировать чуть ли не только в Atmel Studio, а если и в чем-нибудь другом, то никак не в Arduino IDE. По крайней мере примерно такие комментарии я видел на ютубе и под некоторыми статьями, посвященными этому микроконтроллеру. Особенно порадовал этот комментарий:

Тут уже претензии к фреймворку Core13, позволяющему использовать ардуиновские команды (по сути функции) в коде. Реализация этих функций получилась достаточно тяжеловесной и человек просто по незнанию использовал эти функции, получив в итоге на выходе тяжеленькую прошивку.

Здесь я должен сразу отметить, что Arduino IDE - достаточно бедная среда для разработки и очевидно, что среда Atmel Studio для микроконтроллеров семейства Tiny будет по удобству разработки все же получше. Я лишь хочу показать на своем примере, что Atmel Studio - далеко не обязательная среда программирования, когда у вас уже есть установленная Arduino IDE. То есть касается это в основном тех, кто работает и с ардуинками, и с тиньками, кто без особых усилий может написать программу без помощи всплывающих подсказок в IDE. По крайней мере я не могу сказать, что лично мне эти подсказки как-то помогают, скорее в случае с микроконтроллерами я не ощущаю разницы между “кодить в IDE” и “кодить в обычном текстовом редакторе”. Именно по этой причине я на своей практике убедился, что Arduino IDE очень даже хватает для полноценной разработки программ для таких микроконтроллеров и что нет смысла дополнительно устанавливать Atmel Studio, который к тому же в 5-6 раз тяжелее Arduino IDE.

Самое основное забыл отметить: то, для чего и пишется эта вся статья. Когда я имею в виду, что нет разницы, в какой среде программировать и прошивать микроконтроллер, я также подразумеваю, что в Atmel Studio, как и в Arduino IDE встроен один и тот же компилятор. Если вы думайте, что результат компиляции одного и того же сишного кода в этих IDE будет разным, то вы ошибайтесь. Наверное на этой ноте можно закончить статью, но нет. Давайте я постараюсь объяснить, как такое стало возможно, а также расскажу про особенности ардуиновского кода и как я к этому всему пришел.

Предыстория такова, что в своем увлечении схемотехникой работу с микроконтроллерами всегда обходил стороной (да, такое бывает). Но вдруг появилось аж целых два проекта, в которых микроконтроллер необходим, причем чем дешевле - тем лучше. Я никогда не имел дело с микроконтроллерами, разве что в универе, помню, были пары по микропроцессорам… Первый проект касался моей основной работы и руководитель производства мне подсказал, что при таких обстоятельствах я без проблем могу попробовать освоить один из самых дешевых микроконтроллеров: Attiny13а. И в итоге я его освоил.

Самый главный вопрос в начале пути освоения данного микроконтроллера: в чем программировать и как прошивать. По крайней мере главный для меня, т.к. синтаксис чистого C после написания и отладки досовских программ мною более или менее освоен. В ютубе самое популярное решение заключается в том, чтобы в Arduino IDE прошить плату ардуино, будь то нано, уно или какая другая, как программатор ISP, а уже через этот программатор в том же Arduino IDE прошивать Attiny13а, предварительно скачав для этого ардуиновский фреймворк Core13. У меня давно чесались руки поизучать всем известную ардуинку, по этому без всяких колебаний приобрел и ардуино нано.

Как итог: все получилось и через какое-то время один из проектов был успешно завершен. Над вторым проектом еще идет работа и его успешное завершение - вопрос времени.

Проблема выбора IDE началась с вопроса: “Нужно ли мне для программирования микроконтроллеров семейства Tiny что-то более профессиональное, чем Arduino IDE?”. На этот вопрос, помимо комментариев на ютубе и под статьями, меня подтолкнула статья “Переходим от Arduino к программированию Attiny13 на C”, а конкретно эта фраза:

Раз решили программировать «по-взрослому», то и среда разработки нужна «взрослая». Идём на сайт Atmel-a, и скачиваем свежую версию Atmel Studio.

В этой статье я ознакамливался с информацией о замене некоторых ардуиновских функций, предоставляемых Core13, на более оптимальные базовые, описанные в даташите, т.к. в моем первом проекте, как и во втором, в микроконтроллере нужно было реализовать достаточно большую программу с достаточно большими возможностями. Сама эта фраза вполне справедливая, однако когда ты работаешь и с ардуинками, и с тиньками, ресурсы компа можно немножечко и поберечь)

Свой код я писал в Arduino IDE и помню были некоторые ошибки, при которых в консоли ругался avrdude - программа, предназначенная для прошивки микроконтроллеров AVR ATmega и ATtiny. В статье же автор предлагает использовать этот же avrdude после написания и сборки проекта в Atmel Studio. “Учитывая то, что в Arduino IDE без проблем компилируется код, написанный в Atmel Studio, не сложно догадаться, что компилятор и в той, и в другой IDE один и тот же.” - подумал я и рассмотрел каталоги этих IDE.

И в том и в другом случае я нашел папку тех самых компиляторов (да, их несколько). Путь к компиляторам у Arduino IDE -

...\Arduino\hardware\tools\avr\bin\

а у Atmel Studio -

...\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\

Содержимое этих папок практически идентичное, только версии компиляторов могут отличаться. Вот вам для сравнения:

Atmel Studio Arduino IDE
$ tree
.
├── avr-addr2line.exe
├── avr-ar.exe
├── avr-as.exe
├── avr-c++.exe
├── avr-c++filt.exe
├── avr-cpp.exe
├── avr-elfedit.exe
├── avr-gcc-5.4.0.exe
├── avr-gcc-ar.exe
├── avr-gcc.exe
├── avr-gcc-nm.exe
├── avr-gcc-ranlib.exe
├── avr-gcov.exe
├── avr-gcov-tool.exe
├── avr-gdb.exe
├── avr-gdb-py.exe
├── avr-g++.exe
├── avr-gprof.exe
├── avr-ld.bfd.exe
├── avr-ld.exe
├── avr-man
├── avr-nm.exe
├── avr-objcopy.exe
├── avr-objdump.exe
├── avr-ranlib.exe
├── avr-readelf.exe
├── avr-size.exe
├── avr-strings.exe
└── avr-strip.exe

0 directories, 29 files
$ tree
.
├── arduinoOTA.exe
├── avr-addr2line.exe
├── avr-ar.exe
├── avr-as.exe
├── avr-c++.exe
├── avr-c++filt.exe
├── avr-cpp.exe
├── avrdude.exe
├── avr-elfedit.exe
├── avr-gcc-4.9.2.exe
├── avr-gcc-ar.exe
├── avr-gcc.exe
├── avr-gcc-nm.exe
├── avr-gcc-ranlib.exe
├── avr-gcov.exe
├── avr-gdb.exe
├── avr-g++.exe
├── avr-gprof.exe
├── avr-ld.bfd.exe
├── avr-ld.exe
├── avr-man
├── avr-nm.exe
├── avr-objcopy.exe
├── avr-objdump.exe
├── avr-ranlib.exe
├── avr-readelf.exe
├── avr-run.exe
├── avr-size.exe
├── avr-strings.exe
├── avr-strip.exe
├── giveio.sys
├── install_giveio.bat
├── libiconv-2.dll
├── libusb0.dll
├── loaddrv.exe
├── remove_giveio.bat
└── status_giveio.bat

0 directories, 37 files

Как вы знайте, для ардуино есть свой набор комманд, функций. Прикол Arduino IDE в этом случае, если кратко, заключается в том, что весь дополнительный синтаксис ардуиновского кода прописан в

...\Arduino\hardware\arduino\avr\cores\arduino\

(в дальнейшем cores\arduino\), а распиновка для вашей конкретной платы ардуино при выборе учитывается в

...\Arduino\hardware\arduino\avr\variants\

и когда вы собираете свой проект (т.е. нажимайте “Проверить”), проект собирается в папке

C:\Users\{ваш юзернэйм}\AppData\Local\Temp\build{рандомные символы}.tmp\

И вот как раз в этой папке, где собрался проект, можно наблюдать, как все без исключения файлы из папки cores\arduino\ включены в ваш проект. Ваш код в файле .ino в немного измененном виде находится в файле {название проекта}.cpp. Он “немного изменен” специально для дальнейшей компиляции через gcc или g++.

Что, не поняли? Прикол в содержимом cores\arduino\. Ардуиновские команды в этой папке прописаны так, будто бы вы написали код на Atmel Studio для, например, ATmega328P (микроконтроллер в Arduino Nano и не только). Ну т.е. по сути тот самый “ардуиновский код” - это не что иное, как обычный c++. Надеюсь, так понятнее.

По точно такому же принципу реализован фреймворк “Сore13” для той самой Attiny13a. В папке ардуиновского фреймворка, помимо файлов с кодом реализованных под Attiny13a ардуиновских команд, можно найти файлы настроек boards.txt и platform.txt. В первом, как я понял, прописаны свойства микроконтроллера и значения фьюзов, во втором - параметры и команды для компиляции и прошивки. Думаю, при особых навыках по подобию такого фреймворка можно без проблем сделать свои собственные и для других типов микроконтроллеров.

До всего вышеописанного я догадался, когда мне нужно было реализовать прием данных по UART. Реализация программного UART для микроконтроллера Attiny13a была взята из интернета в виде сишных файлов и помню, выдавало ошибки, когда я пытался код main.c перенести в файл проекта .ino с подключенными файлами заголовков из той же директории. Arduino IDE требует в проекте обязательное наличие файла проекта .ino и, помню, он ругался, когда я пытался сделать из .ino строгое подобие main.c. В этом случае самым удачным решением было оставить этот файл пустым и работать с сишными файлами (.c, .h). Как итог я обнаружил, что компилятор в таком случае подхватывал только сишные файлы. Да, дополнительные файлы тоже будут включены, но неиспользуемые файлы при конечной компиляции, как и в случае с ардуино, будут проигнорированы.

Для сравнения почему бы не скомпилировать “блинк” из представленной выше статьи в этих двух IDE? В общем:

Arduino IDE:

Atmel Studio:

И в том, и в другом случае прошивка занимает 82 байта памяти микроконтроллера, с чем я вас и поздравляю.

Все же можно без проблем в файле .ino писать сишный код, но у меня, помню, возникали некоторые проблемы с подключением других сишных файлов (заголовков) и как итог - содержимое моих проектов в Arduino IDE для Attiny13 состоит из файлов main.c, других , .h и обязательного, но не нужного мне файла .ino. В этом случае файл с расширением .ino вы можете либо оставить пустым, либо вносить в него заметки, комментарии, как это делаю я.

В итоге приходим к тому, что нет разницы, через что компилировать прошивку и прошивать микроконтроллер. Но есть разница, какое IDE все же использовать для кодинга и отладки! Вопрос удобства разработки далеко не на последнем месте и тут уже зависит от потребностей человека. Если он профессионально занимается программированием микроконтроллеров, реализует достаточно сложные алгоритмы, то тут действительно необходим Atmel Studio, т.к. он имеет весьма широкие возможности в плане инструментов, вариантов отладки, по сравнению с достаточно бедной Arduino IDE.

В общем так как в начале этой статьи я написал про выбор IDE, то давайте в заключение попробую ответить на вопрос “А что же можно выбрать?”, исходя из того, что я знаю. Ни на чем не настаиваю, но вдруг это кому-то поможет. Я могу не знать обо всем многообразии IDE и если упустил что-то действительно важное, вы всегда можете написать это важное в комментариях. В своих представлениях я все же попробую обобщить IDE в группы и предоставить описание в общих чертах. В итоге мои сформированные представления о том, что можно выбрать, делятся на всего 4 пункта. Поехали!

1. Для профи, новичков и любителей, которые хотят стать профи, просто любителей, для коммерческих проектов и тому подобное. Да, сюда можно отнести что угодно, но я имею в виду именно Atmel Studio и ему подобные среды, которые именно специализированы под разработку программ для микроконтроллеров. “Ему подобные среды” - это, например, IAR Embedded Workbench, CodeVision, уже устаревший WINAVR.

2. Для ардуинщиков, ютуберов DIYщиков, просто DIYщиков, новичков ардуинщиков. В общем для всех. В основном и для тех, кому жалко ардуинки на маленькую программку типа “умный светильник” и прочее, для тех, кому не нужно парится с оптимизацией кода, вполне хватит одной Arduino IDE и для ардуинок, и для AVR микроконтроллеров семейства Tiny или других семейств. Ведь помимо фреймворка для ATtiny13 можно без проблем найти фреймворки и для других микроконтроллеров семейства Tiny. Например, здесь. Или самому написать.

3. Для любителей, профи, просто DIYщиков, но скорее всего уже не для всех. В общем знакомый мне подсказал, что для Visual Studio Code для работы с микроконтроллерами существуют специальные плагины. Я где-то также увидел, что что-то подобное есть и в Sublime Text. В общем подобные связки сторонних IDE со специальными плагинами - очень удобная штука в разработке и пожалуй это то, что я скорее всего буду использовать в дальнейшем при работе с микроконтроллерами.

4. Для ТруЪ Программистов, истинных профи! Простой текстовый редактор, компилятор avr gcc и avrdude. И все! И это вроде даже и не шутка, когда-то давно примерно так это все и делалось. Уверен, что такие люди до сих пор есть.

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

Несмотря на то, что в статье я старался сгладить спорные моменты, все равно есть ощущение, что за счет акцента на выбор IDE эти моменты все же остались. Порой даже закрадываются мысли, что если эту статью опубликовать, например, на хабре, то в комментариях люди могут поделиться на два или более лагеря, спорящих о нужности или не нужности того или иного IDE. Я уже сделал вывод, что это может зависеть и от человека, и от ситуации в целом. Основной посыл - компилятор у двух IDE один и тот же, один и тот же код скомпилируется на них с одним и тем же результатом, но какое IDE использовать, обходиться ли без Atmel Studio - тут уже смотрите по ситуации и решайте сами.

Кстати для тех же, кто знает про ардуиновские команды, прописанные в cores\arduino\ и при этом утверждают, что это все равно считается ардуиновским языком, могу лишь сказать, что если вы в C или в C++ переопределите фигурные скобочки в begin и end, языки от этого не превратятся в паскаль. Один из результатов такого переопределения - горящие жопы людей, читающих ваш код. Впрочем, это уже совсем другая история…

 12.09.2020