Шапка

15.9 Средства разработки

Пять примеров разработки оставляют лишь мимолётное впечатление о разнообразии задач, которые естественно решать с помощью микроконтроллеров. Но эти замечательные компоненты совершенно бесполезны, пока в них не загружена программа. Чтобы оживить их, надо:

  1. написать программу,
  2. загрузить код в целевой контроллер, впаянный в схему, и
  3. провести проверку и отладку ( без неё дело не обходится ).

Аппаратура и программное обеспечение, выполняющее все указанные задачи ( «средства разработки» ), постоянно совершенствуется. Ниже описана ситуация на момент написания книги. Напоминаем, что разработчик электроники должен постоянно обновлять свои знания об актуальном состоянии этой быстро меняющейся области.

15.9.1 Программное обеспечение

Работа с микроконтроллерами требует определённого набора программных средств ( ассемблер, компилятор, отладчик ) для комплектования рабочего места. Кроме финансовых затрат, программные инструменты требуют времени на изучение и освоение. Основная часть программ для микроконтроллеров пишется сейчас на Си/C++, хотя для ассемблера тоже находится место.

15.9.1.A Си/C++

Важно понимать, что компиляторы Си/C++ разных фирм отличаются в части неофициальных расширений языка, относящихся к работе с микроконтроллерами. Существуют библиотеки для работы с внутренней периферией ( SPI, АЦП, таймерами и т.п. ), которые учитывают индивидуальные особенности аппаратуры и карты распределения памяти конкретной модели микроконтроллера 47 . Существуют сложности, связанные с тактированием и шириной машинного слова ( 8/16/32 разряда ). Результатом действия всех этих факторов становится отклонение кода от «чистого Си» и заметные сложности с переносом программного кода между процессорами разных семейств 48 .

15.9.1.B Ассемблер

Иногда программы для микроконтроллера пишутся на машинном языке - ассемблере. Штука это достаточно муторная, и использовать ассемблер - не самый лучший выбор для написания сложной программы с большим числом переходов, вычислений и т.п. Но ассемблер позволяет острее ощущать связь с аппаратурой и даёт доступ к инструкциям ( битовые операции, чтение-модификация-запись ), которые недоступны с уровня языка, подобного Си. И, конечно, не стоит забывать, что переносить такой код на иное семейство процессоров ещё сложнее.

На ассемблере можно писать сильно оптимизированный, критичный ко времени исполнения код, а затем уже в виде подпрограммы вызывать его из Си по мере необходимости 49 . Сложные программы [* на языках высокого уровня ] , не использующие операционную систему, всегда предваряются некоторым стартовым кодом на ассемблере, который добавляет среда разработки. Такой код инициализирует память и вектора прерываний, загружает константы из постоянной памяти в ОЗУ и выполняет прочие подготовительные действия. Понимание того, что именно происходит при инициализации, очень полезно при отладке.

15.9.1.C BASIC

BASIC “Stamp” ( торговая марка Parallax, Inc. ) - небольшие ( размером с почтовую марку ) печатные платы, построенные вокруг микроконтроллера PIC или Ubicom ( бывшая Scenix ) с интерпретатором BASIC в памяти программ. Плата включает регулятор напряжения, кварцевый кристалл и микросхему EEPROM для программы и данных пользователя. Платы имеют формат 14-контактный SIP или 24-, 40-контактный широкий DIP ( 0.6" ). Цена начинается с $30 50 . Пользователю доступны порты ввода-вывода, ШИМ, последовательный порт и шина I2C, поддерживаемые расширениями Parallax для языка BASIC 51 ( диалект PBASIC ). Исходный код не компилируется, но лишь «токенизируется» ( сжимается за счёт сокращений ) и исполняется интерпретатором в µC. Типичная команда языка занимает от 2 до 4 байт в EEPROM на плате. Так как код интерпретируется ( вместо исполнения компилированного машинного кода ), быстродействие не поражает воображение - несколько тысяч операндов в секунду, но простота использования способствовала росту популярности BASIC Stamp.

Бытующее мнение называет BASIC неэффективным языком ( как по скорости исполнения, так и по расходу памяти ), но для него существуют компиляторы , которые выдают хороший и быстрый ассемблерный код. Такой код уже не требуется загружать в интерпретатор [* т.к. он выполняется процессором непосредственно ] , а компиляция возможна для многих популярных µC ( AVR, PIC, ARM ) 52 .

BASIC позволяет быстро начать работу с микроконтроллером неподготовленному или начинающему пользователю. Данную нишу начинают заполнять и другие производители. Сейчас можно найти модули размером с DIP-40 с 32-разрядным ARM7 на борту ( $50, ARMexpress фирмы Coridium ) 53 , на которых можно исполнять компилированный код BASIC.

15.9.1.D Java, Python

Некоторые микроконтроллеры, особенно на основе ARM, включают аппаратную поддержку языка JAVA или программные порты скриптовых интерпретаторов. Интерпретируемые языки - обычный инструмент для высокоуровневых задач, некритичных ко времени исполнения, например, для организации интерфейса пользователя. [* Вероятно, именно это, ставшее общепринятым, мнение является причиной появления тормозных программ и операционных систем ] . Но сохраняйте бдительность, если быстрота реакции имеет значение, как это бывает при управлении роботизированными комплексами. Для чувствительных к задержкам задач лучше отрядить отдельный микроконтроллер и использовать подходящие программные инструменты.

15.9.2 Ограничения, накладываемые системами реального времени

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

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

Если скоростной напор не сдувает черепицу, можно обойтись аппаратными таймерами. В случае АЦП можно вывести требуемую тактовую частоту, например 10 ksps , на линию порта и считывать результат по сигналу готовности данных. Если же скорость велика, может понадобиться ассемблерная вставка, учитывающая скорость исполнения команд микроконтроллером ( число тактов на инструкцию ). Это утомительное дело, требующее выравнивания времени выполнения циклов и ветвей в переходах с условием. В итоге получается код, который жёстко зависит от схемной конфигурации и конкретного типа процессора.

Пример временных ограничений: 16-разрядное АЦП

Проиллюстрируем мысль примером. Возьмём 16-разрядное АЦП последовательного приближения LTC1609 со скоростью 200 ksps и последовательным выходом ( оно уже встречалось в Части 13 в составе системы сбора данных, см. §13.12.1 , рис. 13.76 ). Помимо прочих забот в подобных конструкциях приходится следить за цифровым шумом, пагубно действующим на аналоговые входы. Проблема известна и для её решения в конвертор имеет несколько режимов работы. Есть среди них и «режим внутреннего тактирования»: АЦП формирует все нужные тактовые сигналы самостоятельно, остаётся только забрать выходные данные. Но временнАя диаграмма слишком плотная и слишком быстрая для обработки через прерывание. Требуется написать код с точной временнОй разбивкой. Есть ещё один режим, когда сначала проводится полная оцифровка, а последовательные данные читаются, только когда преобразователь переходит в пассивный режим.

На рис. 15.23 показано, как выглядит режим с внутренним тактированием. Преобразование начинается, когда АЦП получает внешний импульс «/CONV». Сразу после этого события на выходных линиях последовательного интерфейса появляются биты данных в сопровождении тактовых сигналов ( старшим разрядом вперёд, как во всех прочих АЦП последовательного приближения ). С точки зрения быстродействия обычной цифровой логики ( вентилей и регистров ) времена вполне комфортные, но вот, чтобы удовлетворить им в программе требуется достаточно высокая скорость процессора.

Рис. 15.23   ВременнАя диаграмма ( цифры в ns ) пересылки данных 16-разрядным АЦП LTC1609 в режиме «внутреннего тактирования»

Взгляните на псевдокод 15.6 . Цикл «Wait-for-data» должен завершаться за 150 ns , вынуждая использовать процессор с тактовой частотой 30 MHz ( предполагается, что все инструкции исполняются за один такт ) - старые серии PIC не подходят. Обратите внимание, что переключение каналов и задание коэффициента PGA запускается почему-то сразу вслед за началом преобразования. Дело в том, что PGA требует для смены режима 2 μs , а ещё 2 μs надо АЦП, чтобы подхватить сигнал с выхода PGA, прежде чем будет начато собственно преобразование. При этом время между отправкой «/CONV» и появлением данных на выходе АЦП есть те самые ∼200 ns , которых хватает на передачу команды PGA.

Псевдокод 15.6 ADC serial loop pseudocode

Channel
  wait until timer
  set CONV' LOW
  NOP
  set CONV' HIGH
  setup next channel

Wait-for-data
  if BUSY' HIGH, Exit
  if CLK LOW, repeat Wait-for-data
  get & shift data bit into 16-bit word
  repeat Wait-for-data

Exit
  store 16-bit word 

После выхода из цикла есть ещё ∼2 μs для каких-нибудь манипуляций с данными, или что там ещё требуется сделать, прежде чем АЦП будет готово начать новый цикл при полной скорости 200 ksps . Ничто, конечно, не мешает работать медленнее.

Рассмотрим подробнее цикл «Wait-for-data», разбирая его шаг за шагом. Одна команда нужна, чтобы выяснить, получены ли все биты данных, следующая смотрит, готов ли новый бит ( на тактовом выходе АЦП ВЫСОКИЙ уровень ), ещё одна команда, чтобы получить бит и ещё одна, чтобы вернуться в начало цикла. Будем считать, что µC работает с частотой 30 MHz и тратит один такт на инструкцию. Значит, весь цикл занимает 133 ns . Посмотрим, что произойдёт, если микроконтроллер будет получать данные с АЦП каждые 150 ns . Первый бит фиксируется в какой-то момент на промежутке 75 ns , когда «CLK» имеет ВЫСОКИЙ уровень. Каждый последующий будет считываться на 17 ns раньше, и через некоторое время окажется, что на тактовом выходе НИЗКОЕ состояние. Придётся вернуться в начало цикла и повторить, на что уйдёт 66 ns , т.е. µC оказывается совсем рядом с окончанием разрешающего 75-наносекундного окна для данных. Ещё 33 ns уйдёт на получение бита - совсем впритирку с концом 40-наносекундного времени удержания данных на выходе АЦП.

Итак, когда µC считал все 16 бит, дополнительного времени не осталось, что совсем не хорошо. Понимания того, что происходит на самом деле, нет. В данном случае неясно достаточно ли времени для формирования внешнего маркера. Со стороны не видать, когда процессор закончит работу, поэтому придётся детально анализировать межпроцессное взаимодействие - обычное занятие при построении систем реального времени и критичных к длительности исполнения задач. В данном случае удалось разобраться, что происходит, и подсчитать минимальную тактовую частоту процессора для наихудшего случая. Он возникает, когда состояние линии «CLK» проверено прямо перед приходом активного фронта. В этом случае возврат и считывание бита занимает 100 ns . К этому моменту от времени удержания остаётся только 5 ns .

Таким образом, процессор с частотой 30 MHz ещё подойдёт, но без какого-либо запаса. Причём, если скорость работы АЦП окажется выше «типичного» значения, или если скважность сигнала «CLK» будет меньше 50% , например, ВЫСОКИЙ уровень в течение 60 ns , а не 75 ns , программа работать перестанет. Слишком малый запас по времени требует процессора с большим быстродействием. Но правильнее, конечно, будет поставить дополнительный D-триггер, например, ’LVC1G74, срабатывающий по восходящему фронту «CLK» и защёлкивающий бит данных, чтобы дать процессору все 150 ns на его считывание. Дополнительное время составляет ∼35 ns и ещё ∼5 ns - задержка в самом триггере. Если дополнительное быстродействие процессора более низачем не требуется, дополнительный триггер, позволяющий понизить скорость µC - вполне разумный вариант.

Пример показывает обычную дилемму разработчика, а именно, на что тратить ресурсы: на программу, т.е. на процессорные такты или на схемотехнику? Можно взять пару сдвиговых регистров ’LVC595 или ’VHC595 ( §10.5.3 [* и 12.40 , 12.41 на стр. 818 ] ) и задвигать в них все 16 бит слова с АЦП, а считывать их побайтно через параллельные линии данных. Такое решение снизит загрузку процессора до менее чем 10 инструкций раз в 5 μs . Но ( если абстрагироваться от собственно написания программы ) код денег не требует, а вот компоненты совсем наоборот - отягощают бюджет, требуют площади платы и расходуют линии ввода-вывода. Короче, если не хватает процессорного времени, или контроллер слишком задумчивый, стоит воспользоваться помощью пары дополнительных ИМС.

Стандартные последовательные протоколы

При работе со стандартными протоколами UART, I2C, USB или Ethernet самым правильным решением будет использование микроконтроллера с соответствующей аппаратной поддержкой. Следующим по удобству будет использование внешнего «моста», который позволяет перейти от нужного протокола к имеющемуся и обратно, например, USB-UART предложения FTDI. Встречаются, конечно, суровые парни, реализующие последовательные каналы на ассемблере, но это задача не для слабых духом. Есть впечатляющий пример 54 реализации протокола USB ( v1.1, 1.5 Mbps ) на ассемблере для AVR, который рассчитан на тактовую частоту 12 MHz . На каждый бит посылки требуется точно восемь инструкций, которые должны выделить бит данных из потока с кодировкой NRZI , произвести замену и опознать признак конца посылки. Эта разработка была использована Томасом Байером (Thomas Baier) для управления DDS в радиочастотном генераторе для векторного анализатора цепей.

В стороне от временнЫх диаграмм и последовательных потоков стоят драйвера, добавляющие изрядную долю сложностей при написании кода. Не исключено, что пользоваться мостом UART-USB, драйвера для которого поставляет изготовитель микросхем, будет гораздо проще.

15.9.3 Аппаратная часть

Современные микроконтроллеры хранят программный код во внутренней постоянной памяти, которую можно обновить даже в припаянной на плату микросхеме, причём сделать это несколькими способами. Обычно загрузку 55 выполняют через специальный адаптер, носящий официальное название «программатор» . Такие устройства продают как сами производители микроконтроллеров, так и сторонние фирмы. Можно приобрести «комплект для разработки» ( рис. 15.24 ). Чаще всего в него входит и программирующий адаптер, и специальное программное обеспечение ( компилятор, симулятор, отладчик, загрузчик и т.д. ), и, конечно, печатная плата с микроконтроллером и какой-то аппаратной обвязкой ( буферы для цифровых и аналоговых портов, светодиоды, преобразователи уровней для последовательный линий, иногда индикаторы и, наконец, разъём для загрузки/отладки ). Для загрузки программного кода используются несколько протоколов 56 .

Рис. 15.24   Комплекты для разработки существенным образом упрощают начало работы с новыми микроконтроллерами. Их можно приобрести у производителя µC и у сторонних фирм. В комплект обычно входит программное обеспечение и источник питания. Верхний ряд: наборы ARM ( Atmel ) и PIC24H ( Microchip ). Средний ряд: PIC24F, C8051F320 ( Silicon Laboratories ) и ColdFire M52259 ( Freescale ). Нижний ряд слева направо: MSP430 ( Texas Instruments, с двух сторон ), AVR ATmega168 ( Atmel ) и FPGA Spartan-3E ( Xilinx, с двух сторон ). Кроме производителей микросхем известны фирмы Olimex, Arduino и DLP Design ( FPGA )

15.9.3.A Загрузка через последовательный порт

Некоторые микроконтроллеры имеют записанный при производстве блок кода, отвечающий за активизацию приёма команд с последовательного канала сразу после подачи питания ( «загрузчик для асинхронного порта» ). Чтобы активизировать командный режим требуется установить определённое сочетание логических уровней на специально отведённых выводах микросхемы перед снятием сигнала сброса. Так пользователь сообщает резидентному коду, что хочет воспользоваться возможностью записи программной памяти через UART. Данный режим можно найти в микроконтроллерах Maxim-Dallas, Atmel, ARM и многих других. Общение обычно идёт в режиме 9600, 8N1 . Для работы с последовательным портом PC требуется преобразователь уровней, например MAX232 57 . Естественно, можно написать и свой собственный загрузчик и поместить его в обычный флэш, но тогда микроконтроллер должен допускать перезапись программной памяти при работе под управлением кода пользователя. И такой вариант недоступен для «чистых» микросхем, полученных с фабрики.

[* Для крупных партий контроллеров обычно доступна опция «ROM-on-demand», когда код прошивается в микросхему на фабрике. Скажем, такой сервис доступен для микросхем Texas Instruments. Но данная услуга стоит денег и оправдана только для партий в десятки тысяч и более изделий. Люди, работающие на таком уровне эту книгу читать не будут, но знание лишним не бывает ].

15.9.3.B Загрузка через SPI

Некоторые микроконтроллеры ( например, те же AVR ) позволяют записывать программную память через SPI порт 58 . Современные программирующие адаптеры подключаются к управляющей машине через USB, вместо RS232 и принтерного порта, и так же, как и загрузчики под UART требуют активации определённых линий целевой микросхемы ( для AVR это «/RESET» ).

15.9.3.C Загрузка через JTAG

Протокол граничного сканирования JTAG ( §14.7.4 ) изначально предназначался для тестирования и отладки, но сейчас активно используется для начальной записи программной памяти. Такими возможностями обладают AVR, ARM, C8051F ( Silicon Labs ) и многие другие. JTAG порт может сочетаться с другими каналами записи, например, SPI или параллельным программированием.

15.9.3.D Закрытые протоколы загрузки

Некоторые производители µC придумывают свои собственные протоколы загрузки, несовместимые со стандартными шинами SPI, I2C или JTAG. На общую картину такой подход не влияет, потому что всё равно приходится пользоваться программирующим адаптером, который поддерживает конкретное ПО. Так программируются некоторые серии PIC. В отдельных случаях требуется внешнее напряжение программирования +12 V на специальном выводе «Vpp» ( режим «высоковольтного» программирования ), а где-то достаточно обычных логических уровней ( режим «низковольтного» программирования ).

15.9.3.E Загрузка через USB

Микроконтроллеры с аппаратной поддержкой USB часто имеют возможность загрузки через этот порт. К таким ИМС относятся контроллеры Cypress и Atmel AVR32UC3. Последний можно грузить через USB, JTAG или UART.

15.9.3.F Параллельная загрузка

Наконец многие контроллеры позволяют записать программную память через многопроводный параллельный интерфейс. [* Когда-то это была единственная опция, не допускавшая внутрисхемного программирования, а сейчас такой вариант и захочешь - не отыщешь ] . В некоторых случаях требуется программирующее напряжение +12 V на каком-то из выводов, и тогда такой вариант называется «высоковольтным программированием» .

15.9.3.G Универсальный программирующий адаптер

На фоне множества последовательных интерфейсов появился проект с открытым кодом “Bus Pirate”, который позволяет выбрать любой интерфейс из набора 1-Wire, I2C, SPI, JTAG, UART, MIDI, клавиатура PC, HD44780 LCD с помощью небольшой платы за $30 с интерфейсом USB. В комплекте идут библиотеки для настраиваемых 2- и 3-проводных последовательных протоколов и прямое скриптовое управление состоянием отдельных выводов. Под него есть программная поддержка JTAG и некоторых протоколов внутрисхемного программирования. «Bus Pirate» позволяет общаться с множеством микросхем, а не только с микроконтроллерами. Он подходит, например, для отладки протоколов для «умных» кристаллов, параметры работы которых меняются в командном режиме. К таким же ИМС относятся контроллеры для управления многосекционными символьными светодиодными лентами. «Bus Pirate» может сэкономить много времени. В версии 4 появилась поддержка отладки «OpenOCD JTAG». Актуальная цена $40 ( http://dangerousprototypes.com ).

15.9.3.H Потенциальные проблемы программных загрузчиков

Когда µC поддерживает несколько протоколов загрузки, разработчик может предпочесть какой-то один. Если при этом фабричный загрузчик находится в обычной памяти программ, а не в специальной нестираемой области, то неподготовленный пользователь может перезаписать его своим кодом, лишившись тем самым возможности внутрисхемной загрузки. В просторечье такое действие называется «отпилить сук, на котором сидишь». Авторы попали в такую ситуацию, загрузив в мелкий AVR программу, которая начинала работу с отключения неиспользуемой периферии, и в том числе SPI , т.е. блокировала единственный путь для внутрисхемного программирования. Исправлять ситуацию пришлось в режиме параллельного программирования.

Ещё одной ошибкой, блокирующей общение с микроконтроллером, является использование неправильного источника тактирования, который не соответствует аппаратной конфигурации окружения. Это может быть кварц, керамический резонатор или внешний генератор. Некоторые µC защищают от такого рода ошибок. Скажем, ядро i8051 фирмы Silicon Labs или ARM после сброса всегда попадают в одно конкретное состояние с тактированием от внутреннего генератора. Пользователь волен изменить его впоследствии, написав требуемый код.

15.9.3.I Внутрисхемная отладка

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

Некоторые семейства процессоров изначально проектировались со встроенным модулем отладчика. К таким семействам относятся ARM и некоторые модели из линеек AVR, PIC, i8051.

15.9.4 Проект Arduino

Проект Arduino уже упоминался несколько раз. О чём идёт речь? По описанию на вебсайте проекта ( www.arduino.cc ) «Arduino - проект с открытым кодом для создания прототипов электронных устройств на основе многофункциональной аппаратуры с программной поддержкой. Он рассчитан на художников, дизайнеров, любителей и вообще всех, кто интересуется созданием интерактивных элементов среды... Программа для микроконтроллера на плате пишется на языке Си с привлечением сторонних библиотек в специальной среде разработки... Arduino может работать автономно или в связке с программным обеспечением на управляющей машине».

С точки зрения авторов аппаратная платформа Arduino - очень хорошо спроектированный набор недорогих плат, собранных с использованием процессоров ATmega и ARM Cortes-M и всех необходимых внешних компонентов: USB портов ( на ИМС FTDI ), регуляторов напряжения, SPI шины, аналоговых и цифровых линий ввода-вывода, светодиодов и т.п. Можно купить уже собранную базовую плату ( «Uno» ) за $30 на торговых площадках Adafruit и Spark-Fun. А можно приобрести набор деталей или даже попробовать самостоятельно сделать плату ( имеется проект в формате Eagle и изображение в «*.png» ).

Бесплатная программная среда имеет открытый код и включает компилятор Си ( GNU C для AVR и ARM ). Программное обеспечение просто и удобно использовать, есть версии под Windows, Mac OS или Linux. Фирменная микропрограмма ( написана на Си ) включает загрузчик, работающий через USB. Сразу после включения он слушает загрузочный порт на предмет появления команды пользователя, а после секундного таймаута переходит к выполнению уже записанного в программную память кода.

Имеется библиотека, отвечающая за передачу данных через USB, форматирование чисел, настройки таймеров, прерываний и т.п. Скажем, команда «val=analogRead(3)» присваивает переменной «val» значение напряжения на «аналоговом выводе 3» 59 . Код библиотеки слабо связан с аппаратурой Arduino и может использоваться в других проектах на AVR. Открытость кода среды, компилятора и библиотек помогает организовать очень удобное рабочее окружение.

Если рассматривать проект Arduino как целое, то это просто собранные воедино работающие программные и аппаратные элементы. Интересным индикатором простоты использования аппаратной платформы и среды разработки может служить следующая цифра: сколько времени пройдёт с момента открытия упаковки до того, как можно будет увидеть что-либо работающее? Для Arduino ответ будет «20 минут». Столько потребуется на скачивание программного обеспечения, установку драйвера FTDI и IDE, компиляции текста программы, отдачи нескольких команд и получения работающего устройства. При этом об аппаратной части не требуется знать ничего. Компактная плата получает питание через шину USB, поэтому всё, что требуется для работы, - обычный кабель USB.

Существует много сторонних проектов, мимикрирующих под платформу Arduino. Они имеют такие же габариты, расположение выводов и похожие компиляторы. Примером может служить плата “Linduino” ( Linear Technology ), снабжённая изолированным интерфейсом USB ( LTM2884, 2.5 kVrms ) и изолированным питанием 5 Vdc ( до 500 mA ). Linduino имеет стандартный интерфейс DC590, который фирма использует для подключения дочерних тестовых плат со своими ИМС.

47 Ядро i8051 имеет внутреннее и внешнее пространство памяти программ, внутреннее и внешнее пространство оперативной памяти, область ОЗУ с побитовым доступом и адреса регистров специальных функций. Чтобы ещё больше всё запутать, современные архитектуры 8051 имеют «внешнюю» память внутри корпуса. AVR и ARM существенно проще в этом отношении: их адресное пространство «плоское». <-

48 Есть несколько приятных исключений в этой безрадостной картине. Одним из них является платформа Arduino . Она включает ПО и библиотеки, сильно упрощающие программирование. <-

49 Важное предупреждение об ассемблере в программах на Си/C++. Современные компиляторы считают себя умнее программистов и стараются оптимизировать код, внося в него изрядный хаос. <-

50 На самом деле $29, но авторам до смерти надоели концевые девятки, поэтому все цены округляются вверх. [* В оригинале «задевячены до смерти»: «we are weary of being nined to death» ] .   <-

51 Например программный примитив «BUTTON» отвечает за подавление дребезга кнопок и считывает состояние линии несколько раз, проверяя, что она соответствует требуемому, прежде чем перейти на заданный адрес. <-

52 Примеры: GCBASIC ( с открытым кодом ), Swordfish, Proton PICBA-SIC, mikroBasic и PicBasic ( microEngineering Labs ) компиляторы для PIC; BASCOM-AVR и GNU компиляторы для AVR; Os-honSoft для PIC, AVR и Z80; несколько компиляторов для семейства ARM. <-

53 Некоторые другие контроллеры, которые можно программировать на BASIC: BasicX (Net-Media), PICAXE (Revolution Education), KicChip, C Stamp (A-WIT Technologies), CUBLOC (Comfile Technology) и ZBasic (ZBa-sic/Elba). <-

54 См. http://www.obdev.at/products/vusb/index.html и http://www.obdev.at/articles/implementing-usb-1. 1-in-firmware.html. <-

55 Эту операцию часто называют «программирование», хотя физическую запись данных в программную память микроконтроллера правильнее обозначать термином «загрузка». И, в любом случае, не стоит путать данное действие с процессом написания программного кода. <-

56 Некоторые делали протоколов UART, SPI и JTAG можно найти в §14.5 и §14.7.4 .   <-

57 Физические последовательные порты стремительно исчезают из персональных компьютеров. Их можно заменить переходниками USB-RS232 или, что лучше, микросхемой моста USB-UART FT232R и ей подобными. В такой микросхеме выходы имеют обычные логические уровни, которые требуются микроконтроллеру, а трансляторы уровней RS232 отсутствуют. <-

58 Причём это может быть один из нескольких последовательных портов µC. Старшие модели AVR позволяют загружаться и через SPI, и через JTAG. Многие микроконтроллеры позволяют использовать код пользователя, который может работать через USB, UART или Ethernet. <-

59 Простота использования часто уменьшает универсальность, например, в схеме распределения выводов. <-

Previous part:

Next part: