Делаем железку, часть 4: пишем прошивку
В старые-старые времена микроконтроллеров не существовало программы для микроконтроллеров писали на ассемблере. Сначала это никого не пугало, потому что на ассемблере писали много чего, но со временем нормальные люди на больших компьютерах, развлекающие себя программированием, целиком и полностью ушли в языки высокого уровня, и для большинства из них ассемблер стал выглядеть, скажем так, непривлекательно. Соответственно, непривлекательно для них стали выглядеть и микроконтроллеры — половина, если не больше, литературы по ним посвящена ассемблеру.
На самом деле при программировании современных микроконтроллеров ассемблер уже фактически давно не нужен — по той же причине, что и для больших компьютеров: килобайты и мегагерцы стали дёшевы. Ведь, собственно, единственное отличие программы, написанной руками на ассемблере, от программы, собранной компилятором из языка высокого уровня — степень оптимизации: ручной ассемблер при должном навыке компактнее и быстрее. Но кого это волнует, если стоимость контроллеров, например, с 8 кб и 16 кб флэша отличается на тридцать центов, а при желании в продаже можно без труда найти контроллеры с сотнями килобайт встроенного флэша?
Говоря коротко, в 99 % случаев для написания прошивки микроконтроллера ассемблер вам не нужен вообще.
Более того, прогресс пошёл ещё дальше: как IDE типа C++ Builder или Delphi позволили программисту вообще не думать о том, как Windows работает внутри, так и современные IDE для микроконтроллеров позволяют не задумываться о потрохах этих самых контроллеров — адресах, регистрах и прочих радостях жизни; они предоставляют уже готовые библиотеки, обеспечивающие простую работу со всеми основные функциями контроллеров.
Самая популярная подобная IDE — Arduino, изначально рассчитанная на микроконтроллеры Atmel Atmega8, но уже расширившаяся в сторону более навороченных Atmega168 и Atmega328.

Arduino IDE
Для работы с Arduino вполне достаточно базового знания языка C и общего представления о том, что вообще такое микроконтроллер и какие у него есть ножки. Всё. Если эти знания у вас есть — первую работоспособную программу вы напишете минут за десять максимум.
Ну, например, ниже целиком приведён код, мигающий светодиодиком, подключённым на ножку номер 1, раз в секунду:
bool LEDon;
void setup() {
pinMode(1, OUTPUT);
}
void loop() {
digitalWrite(1, LEDon);
delay(500);
LEDon != LEDon;
}
Что особенно приятно, использование более серьёзных вещей не делает программу сильно сложнее — практически для всего есть готовые библиотеки. Ну, например, нам надо прочитать два байта из АЦП и показать их на алфавитно-цифровом ЖК-экранчике. Проще простого:
#include
// подключили библиотеку ЖК-экранчика
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2); // указали ей, к каким ножкам какие сигналы ЖК подключены
lcd.begin(8, 1); // указали размер экранчика (8 символов, 1 строка)
int data = analogRead(1); // прочитали 1-й канал АЦП
lcd.clear(); // очистили экранчик
lcd.print(data); // вывели на него полученное с АЦП
Впрочем, совсем врать не буду: иногда небольшое знание потрохов контроллера всё же требуется — либо всё же для точной настройки какой-либо периферии приходится потрогать руками соответствующие регистры, либо библиотечные процедуры слишком медлительны. Ну, например, невинная digitalWrite(pin, 0|1), выдающая на заданную ножку «0» или «1», на практике сначала пересчитывает по таблице номер ножки Arduino (у них там своя нумерация, в соответствии с одноимённой платой) в номер порта контроллера, проверяет, определена ли эта ножка как «выход», проверяет, не включён ли на неё ШИМ-генератор, и только после этого выдаёт заданный бит. Иногда это слишком долго — тогда нужно дёргать ножки напрямую, в обход всех этих проверок, менее удобочитаемыми командами, зато за один такт. Также некоторых минимальных знаний требует, например, работа с прерываниями — что это такое, сколько времени занимает их выполнение, как обмениваться данными между прерыванием и основной программой...
Но в общем-то это, на самом деле, мелочи, которые осваиваются просто по ходу дела — тем более, что про Arduino в сети написаны уже многие мегабайты. Так что, если микроконтроллеры вам попробовать как-нибудь хочется, но что-то страшновато и вспоминаются километровые ассемблерные листинги — ставьте Arduino и пробуйте уже наконец.
P.S. Да, основной недостаток Arduino — в качестве именно IDE оно довольно простенькое, фактически, это оболочка, подсвечивающая синтаксис при написании и позволяющая нажатием одной кнопки скомпилировать программу и загрузить её в контроллер. Отладчика там, например, нет и не планируется.
P.P.S. Загрузка прошивки в подготовленный Arduino-контроллер делается по USB (в такой контроллер уже зашит бутлоадер, при каждой перезагрузке немного ждущий, не прилетит ли ему новая прошивка), а в голый новый микроконтроллер одним из программаторов, от примитивного на LPT до нормального на USB (у меня вот этот, например), заливается либо бутлоадер, либо уже собственно прошивка.


Свежайшие комментарии