Программирование микроконтроллеров

Arduino

Также на микроконтроллерах AVR сейчас работает Arduino — электронный конструктор, платформа для быстрой и удобной разработки различных устройств автоматизации и управления. Данное решение состоит из комплекса программ и аппаратных составляющих — печатных плат с компонентами, центральную и главную роль в которых играет плата с микроконтроллером AVR — ATmega328, ATmega168, ATmega2560, ATmega32U4, ATTiny85 (в старых моделях — ATmega8, ATmega1280 и другие).

Рис. 3. Основная плата Arduino и дополнительные модули.

Данный обзор очень краток, на самом деле областей применения AVR микроконтроллеров гораздо больше. Однажды разобрав какое-то устройство у себя дома вы сможете увидеть внутри него AVR чип и здесь нет ничего сверхъестественного, микроконтроллеры набирают все большую популярность и более широко применяются в самых разных областях.

История

С появлением однокристальных микро-ЭВМ связывают начало эры массового применения компьютерной автоматизации в области управления. По-видимому[источник не указан 195 дней], это обстоятельство и определило термин «контроллер» (англ. controller — регулятор, управляющее устройство).

В связи со спадом отечественного производства и возросшим импортом техники, в том числе вычислительной, термин «микроконтроллер» (МК) вытеснил из употребления ранее использовавшийся термин «однокристальная микроЭВМ».

Первый патент на однокристальную микроЭВМ был выдан в 1971 году инженерам М. Кочрену и Г. Буну, сотрудникам американской Texas Instruments. Именно они предложили на одном кристалле разместить не только процессор, но и память с устройствами ввода-вывода.

В 1976 году американская фирма Intel выпускает микроконтроллер i8048. В 1978 году фирма Motorola выпустила свой первый микроконтроллер MC6801, совместимый по системе команд с выпущенным ранее микропроцессором MC6800. Через 4 года, в 1980 году, Intel выпускает следующий микроконтроллер: i8051. Удачный набор периферийных устройств, возможность гибкого выбора внешней или внутренней программной памяти и приемлемая цена обеспечили этому микроконтроллеру успех на рынке. С точки зрения технологии микроконтроллер i8051 являлся для своего времени очень сложным изделием — в кристалле было использовано 128 тыс. транзисторов, что в 4 раза превышало количество транзисторов в 16-разрядном микропроцессоре i8086.

На сегодняшний день существует более 200 модификаций микроконтроллеров, совместимых с i8051, выпускаемых двумя десятками компаний, и большое количество микроконтроллеров других типов. Популярностью у разработчиков пользуются 8-битные микроконтроллеры PIC фирмы Microchip Technology и AVR фирмы Atmel, 16-битные MSP430 фирмы TI, а также 32-битные микроконтроллеры архитектуры ARM, которую разрабатывает фирма ARM Limited и продаёт лицензии другим фирмам для их производства. Несмотря на популярность в России микроконтроллеров, упомянутых выше, по данным Gartner Group от 2009 года мировой рейтинг по объёму продаж выглядит иначе: первое место с большим отрывом занимает Renesas Electronics на втором Freescale, на третьем Samsung, затем идут Microchip и TI, далее все остальные.

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

В 1979 году в СССР НИИ ТТ разработали однокристальную 16-разрядную ЭВМ К1801ВЕ1, микроархитектура которой получила название «Электроника НЦ».

Адресное пространство данных (на самом деле объединенное)

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

Распределение адресного пространства данных микроконтроллеров AVR с необходимым количеством регистров оборудования не превышающих 64. Иллюстрация моя

Я не стал здесь показывать область стека. Она обычно располагается в самом конце памяти данных. Однако, стек можно разместить в любом месте памяти данных просто проинициализировав регистр SP соответствующим значением при запуске программы. Сам же микроконтроллер загружает в SP при старте адрес последней ячейки памяти данных.

Обратите внимание, что здесь воедино соединены сразу три сущности! Во первых, регистры общего назначения. Во вторых, адреса ввода-вывода, но со смещением 20h

В третьих, собственно память данных (включая стек) начиная с адреса 60h.

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

Более того, есть два способа получения доступа и к регистрам оборудования. Так регистр SREG имеет адрес 3Fh в пространстве ввода-вывода. И к нему можно обратиться например так

IN R5,3F

Но одновременно, он же доступен по адресу 3Fh+20h= 5Fh. А значит, возможно и такое

CLR XH

LDI XH,$5F

LD R5,X

Или просто

LDS R5,$5F

Но и это еще не все! Микроконтроллеры получали все новые встроенные модули и адресного пространства ввода-вывода стало не хватать. Поэтому часть регистров оборудования в некоторых моделях микроконтроллеров вынесли в отдельный блок «расширения регистров ввода-вывода». И разместился этот блок с адреса 60h.

Распределение адресного пространства данных микроконтроллеров AVR с необходимым количеством регистров оборудования больше 64. Иллюстрация моя

Всего может быть до 160 дополнительных регистров оборудования. И доступ к ним командами IN и OUT уже невозможен. А собственно память данных (включая стек) теперь начинается с адреса 100h.

Как определить, есть в микроконтроллере этот дополнительный блок регистров, или нет? Посмотрев в документации, это самый надежный способ. Дело в том, что название начинающееся с ATmega еще ни о чем не говорит, в данном случае. Так у ATmega32A дополнительного блока нет и данные можно размещать с адреса 60h. А вот ATmega328 или ATmega 644 такой блок имеют, а значит и данные могут размещаться только с адреса 100h.

Ничего данная организация памяти не напоминает? Нет, я не про STM8 с его единым адресным пространством и выделенным под регистры оборудования диапазоном. Я про PIC. Если убрать лишнее (по своей сути) пространство ввода-вывода, то мы получим тот же принцип размещения регистров и данных в едином пространстве!

PIC

Логотип компании Microchip Technology

Открывает наш парад компания Microchip Technology с серией PIC. Эти МК отличаются между собой разрядностью (8/16/32), набором периферии и корпусом чипа. Восьмибитные варианты же делятся на четыре семейства: baseline, mid-range, enhanced mid-range и PIC18. Более подробная информация приведена в таблице.

Также есть 16-битные «пики» — PIC24F и DsPIC30/33F. Ну и 32-битные — PIC32MX. Эти непонятные сочетания букв и цифр — часть идентификатора чипа. То же, что и марки у машин. Например, широко распространенный камень PIC16F628A расшифровывается так: семейство PIC16F6 (Mid-range), а остальная часть имени — указатель на конкретный камень. У рассмотренных далее МК в имени может содержаться еще больше информации.

Микроконтроллер PIC16F628A

Эти микроконтроллеры имеют среднюю стоимость. Например, камень PIC6F628 в Chipdip стоит около 150 рублей, а PIC18F2550 — 620 рублей.

WWW

Более дешевые экземпляры имеют в своем составе минимум периферии. У упомянутого ранее PIC6F628 следующие характеристики: встроенный тактовый генератор для работы с частотой 4 или 8 МГц; 18 пинов, из них 16 — ввод/вывод, а 2 — питание; для работы на более высоких частотах можно подключить кварцевый резонатор; Flash-память объемом 2048 слов; 4 аналоговых входа; два 8-битных таймера и один 16-битный; 224 байта ОЗУ (самому смешно); 128 байт EEPROM (это программно перезаписываемая энергонезависимая память, вроде жесткого диска); интерфейс UART.

Программирование и использование PIC

Программируют для микроконтроллеров, как правило, на ассемблере и на Си. Есть множество сред разработки: MPASM и MPLAB, MicroC, JALedit (язык JAL, сам про него впервые слышу).

WWW

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

Вторым плюсом можно указать встроенные независимые (от тактового генератора) счетчики. Благодаря этому факту семейство зарекомендовало себя в качестве «мозгов» для частотомеров. Пара таких контроллеров лежит у меня в мастерской на черный день. Из минусов можно выделить только высокую стоимость оригинальных программаторов, которые зовутся PICkit.

PICKIT3

В интернете есть множество статей по сборке достойных аналогов таких программаторов. Но вся соль в том, что для сборки программатора тебе нужно что? Правильно, программатор. На этот случай был разработан программатор Громова. Для его сборки почти ничего не нужно, а работает он от COM-порта компьютера. На момент его разработки популярность этой серии МК была высока, да и COM-порты были у всех ПК. Сейчас все это уже редкость, так что придется преодолеть порог вхождения либо раскошелиться.

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», увеличит личную накопительную скидку и позволит накапливать профессиональный рейтинг Xakep Score!
Подробнее

Я уже участник «Xakep.ru»

Разрядность адреса

Я не буду делать разницы между адресами программ и данных. Речь пойдет об общих моментах.

На первый взгляд, самым лучшим выглядит подход STM8, линейное единое адресное пространство. Однако, давайте взглянем на это под несколько иным углом зрения. Но для этого нам потребуется вспомнить, что адреса в STM8 бывают короткие, длинные и расширенные (полные). Я об этом писал в девятой части.

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

  • CALL — самый привычный и часто используемый формат вызова. Адрес задается в виде 2 байт, а значит, переход за пределы 64 Кбайт невозможен. Во многих случаях, особенно для новичков, это ограничение не представляет проблемы. Но ведь может использоваться и, например, микроконтроллер STM8S207C8, у которого 128 Кбайт памяти программ.
  • CALLF — самый универсальный формат вызова. Здесь может указываться и длинный (16 бит) и полный (24 бита) адрес подпрограммы. Причем длина кода команды будет одинакова в обоих случаях, так как при указании 16 битного адреса собственно команде предшествует префикс.
  • CALLR — для самых экономных. Код команды занимает меньше всего места, всего 2 байта. При этом в команде указывается смещение адреса перехода относительно текущего адреса команды. Но результирующий адрес перехода 16 битный. А значит, данная команда не позволяет выйти за пределы 64 Кбайт.

Кстати, говоря о пределе в 64 Кбайт я имею ввиду не абсолютный полный адрес, а лишь 16 младших разрядов адреса. Просто команды CALL и CALLR не затрагивают регистр PCE (и не сохраняют его в стеке в качестве составной части адреса возврата), но в формировании полного адреса PCE продолжает участвовать!

Не правда ли, очень похоже на то, что PCE задает номер страницы памяти программ, а пара PCH:PCL адрес внутри страницы? Не напоминает страничную организацию памяти программ в PIC?

Кстати, и в AVR, который многие хвалят за логичность тоже не так все просто при работе с памятью программ. Только в AVR команды называются немого по иному.

  • CALL — Дальний переход . Адрес перехода занимает 22 бита. Однако, тут все еще и от размера регистра PC (16 или 22 бита) все зависит. Доступна не для всех микроконтроллеров.
  • EICALL — Адрес перехода формируется из содержимого регистра Z и специального регистра EIND, который и хранит старшие 8 бит адреса. Доступна не для всех микроконтроллеров.
  • ICALL — Аналогична EICAL, за исключением того, что старшие разряды адреса всегда равны 0, так как EIND участия в ее выполнении не принимает. Доступна не для всех микроконтроллеров.
  • RCALL — относительный переход. Но смещение относительно текущего адреса команды состоит из 12 бит.

Не правда ли, и в данном случае все очень похоже на PIC с его страничной организацией памяти программ, только номер страницы тут хранится в регистре EIND.

Что же получается, страничная организация используется во всех микроконтроллерах? Да, это так, в самом общем случае. Просто размер страницы разный. И в случае STM8 или AVR вы просто столкнетесь с этим фактом в гораздо меньшем количестве случаев.

Индексная адресация

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

Пример индексной адресации в микроконтроллере AVR Atmel. Индексный регистр Х содержит адрес ячейки памяти, содержимое которой будет загружено в регистр R1. Иллюстрация моя

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

Связь с языками высокого уровня

Пусть у нас имеется такой фрагмент программы

Как я показывал в выше, компилятор использует для переменной ptr косвенную адресацию. Однако, можно (возможно, но не обязательно) ускорить работу программы и уменьшить объем занимаемой программой памяти (тоже не обязательно), если поместить переменную ptr не в память данных, а в индексный регистр.

Остается вопрос с операцией инкремента (++). Но и это в некоторых микроконтроллерах учтено. Так в микроконтроллерах AVR Atmel есть индексная адресация с автоинкрементом (post increment) и автодекрементом (pre decremernt). Я не буду показывать это на иллюстрации, так данная тонкость сути режима адресации не меняет.

Однако, обратите внимание!Понимание сути режимов адресации помогает писать программы на языках высокого уровня более эффективно. Так в данном случае использование ptr++ позволит компилятору сгенерировать код с использованием индексной адресации с автоматическим инкрементом, выполняемым той же самой командой

А вот использование ++ptr потребует отдельной команды для увеличения значения ptr. Причина проста, есть адресация с post increment (увеличение после использования), но не адресации с pre increment (увеличение перед использованием). С декрементом ситауция обратная.

Для других микроконтроллером ситуация будет отличаться, но учитывать особенности режимов адресации, если они есть, полезно в любом случае!

Кстати, регистр указателя стека можно то считать, в некотором роде, индексным регистром, но специального назначения.

PIC Microchip

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

В этих микроконтроллерах есть регистры с общим названием FSR (File Select Register). Одной из функций этого регистра как раз и является участие в индексной адресации. То есть, адрес нужной переменной помещается в этот регистр. Но вот для использования индексной адресации мы должны в команде указать совершенно иной регистр, INDF!

То есть, команда с индексным режимом адресации будет выглядеть, например, так

MOVWF INDF

При этом регистра INDF физически не существует, зато сущестувует его адрес 0 (по этому адресу физически нет ничего). Однако, встретив в команде адрес ячейки памяти равный нулю, микроконтроллер понимает, что вместо прямой адресации нужно использовать индексную и вместо ячейки с адресом ноль он обращается к ачейке, адрес которой хранится в регистре FSR.

Автоматического инкремента и декремента в данном случае не предусмотрено.

AVR Atmel (Microchip)

Этот микроконтроллер я не только использовал для иллюстрации, но и описал некоторые тонкости его режима индексной адресации. Поэтому добавить можно лишь то, что есть три индексных регистра Х, Y и Z. И есть возможность использовать их, в том числе, для доступа (на чтение) памяти команд.

Работа микропрограммного управления

Сначала нужно отметить, что процессор может или полностью управляться микропрограммой, или микрокоманды используются только для выполнения команд.

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

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

В любом случае, адрес микрокоманды формируется в РАМК и поступает в ПМК. В результате микрокоманда из ПМК помещается в РМК и начинает выполняться. Для всех узлов процессора из содержимого полей микрокоманды формируются управляющие сигналы. Если заданы условия, то они учитываются при выполнении микрокоманды. При этом формируется и адрес следующей микрокоманды, который помещается в РАМК. После этого цикл повторяется.

Какое же семейство микроконтроллеров лучше?

Я сразу дам ответ на этот вопрос, а потом постараюсь его объяснить.

Нет лучшего или худшего семейства микроконтроллеров. Как нет и лучшей или худшей архитектуры. Каждый микроконтроллер находит свое применение. Каждая архитектура имеет своих почитателей и своих критиков.

Одни архитектуры давно канули в лету, другие продолжают здравствовать. Появляются новые разработки. И касается это не только микроконтроллеров, но и архитектуры ЭВМ в целом. И дело тут не только в удачности разработки. Так канула в лету прекрасная архитектура DEC PDP-11/VAX-11. При этом прекрасно себя чувствует архитектура MCS-51, одна из первых разработок для микроконтроллеров, которая стала, де-факто, промышленным стандартом.

Давайте попробуем разобраться в особенностях архитектуры памяти, которые не всегда видны с первого взгляда, но имеют важное значение с точки зрения практического применения микроконтроллеров

Оцените статью:
Оставить комментарий