Наш магазин на eBay Наш магазин на AliExpress Наш канал в telegram

Программирование микроконтроллеров PIC. Часть 2. Что такое контроллер и как с ним работать

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

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

Главное устройство называется ядром (оно тоже состоит из разных частей: АЛУ, детектор инструкций, стек и т.д., но нам для программирования это пока не важно). Главным оно является потому, что только оно может читать зашитые в память программ элементарные команды и, в зависимости от этих команд, раздавать указания остальным устройствам, что нужно делать.

Одним из важнейших компонентов ядра является АЛУ — арифметико-логическое устройство. В микроконтроллерах PIC оно имеет один рабочий регистр W и может выполнять математические и логические операции с любым регистром памяти данных. То, что АЛУ может работать с любым регистром памяти данных — очень важно, в дальнейшем будет рассказано почему.

Все остальные устройства — это периферийные модули. Непосредственно друг с другом они не взаимодействуют и предназначены для выполнения каких-либо конкретных задач. Например, контроллер PIC16F628A имеет такой набор периферийных модулей: 2 порта ввода-вывода (по 8 независимых цифровых каналов), модуль аналоговых компараторов (2 компаратора), 3 таймера, модуль сравнения/захвата/ШИМ и модуль USART.

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

Память контроллера делится на память программ и память данных.

Память программ в контроллерах с буквой F — флешовая, соответственно, она может быть достаточно большое количество раз перезаписана. Здесь основным интересным фактом является то, что размер этой памяти не кратен 8-ми битам, как обычно, а имеет разрядность 14 бит. Такой размер в данном случае называется словом. Все команды контроллера 14-ти разрядные, то есть занимают одно слово памяти программ. Доступ к памяти программ осуществляется по отдельной 14-ти разрядной шине.

Те, кто писал программы для компьютера могут запутаться, т.к. в компьютере слово — это 16 бит, так что будьте внимательны. Когда говорят, что объём памяти программ, например, PIC16F628A равен 1 Килобайту, то это не означает, что он равен 1024 байта по 8 бит. На самом деле он равен 1024-м словам по 14 бит.

Память данных, в свою очередь, делится на EEPROM и ОЗУ.

EEPROM — это энергонезависимая память, которая может использоваться для хранения любой пользовательской информации. Ячейки этой памяти имеют стандартный размер — 8 бит. Тут всё понятно.

ОЗУ — это оперативная память, которая используется только во время выполнения программы. При отключении питания, информация, хранившаяся в этой памяти, пропадает. Эта память, так же как и EEPROM, 8-ми битная. На этом типе памяти давайте остановимся поподробнее:

ОЗУ представляет собой набор регистров, разделённый на блоки по 128 байт, называемые банками. В разных контроллерах может быть разное количество банков (например, в PIC12 их 2, а в PIC16 — 4).

В каждом банке по первым 32-м адресам (с 0000h по 0020h) расположены служебные регистры. Их называют регистрами специального назначения (SFR — special function register). Через эти регистры, собственно, и осуществляется управление работой всех составных частей контроллера (управление различными функциями как самого ядра, так и периферийных модулей).

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

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

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

Например, регистр TRISA расположен по адресу 85h. Этот адрес находится в первом банке — адрес начала банка 80h. То есть, для обращения к этому регистру в программе нужно сначала выбрать первый банк, а потом обращаться к регистру по адресу 85h-80h=05h.

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

Некоторые регистры имеют сквозную адресацию и доступны из всех банков (например, регистр STATUS доступен по смещению 03h в любом банке).

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

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

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

  1. Часть 1. Необходимые инструменты и программы. Основы MPLAB
  2. Часть 2. Что такое микроконтроллер и как с ним работать
  3. Часть 3. Структура программы на ассемблере
  4. Часть 4. Разработка рабочей части программы. Алгоритмы
  5. Часть 5. Ассемблер. Организация циклов и ветвлений
  6. Часть 6. Как перевести контроллер в режим программирования и залить в него прошивку

Добавить комментарий