PIC и mikroPascal

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

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

Работа с регистрами.

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

Разрядность регистров в микроконтроллерах серии PIC12 и PIC16 равна 8, что равнозначно типу данных – байт (Byte). Операции чтения и записи регистров специального назначения полностью аналогичны чтению или записи переменных соответствующей разрядности. Для того, что бы присвоить регистру какое-то значение достаточно использовать операцию присвоения. Например, команда PORTB:=0xFF; установит все линии вывода порта B в высокое состояние. Чтение информации из регистра также возможно с помощью операции присвоения. В некоторых случаях может оказаться разумным использование сравнения значения с известными величинами, например проверка на неравенство 0.

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

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

Работа с битами.

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

Непосредственная работа с битами выполняется через выражение, содержащее имя регистра и номер бита, разделенные точкой. Номер бита может задаваться двумя способами – цифрой от 0 до 7, либо предопределенной константой вида B0…B7.

Пример:

PORTA.0:=1;

PORTA.1:=0;

PORTA.B2:=1;

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

var bf : bit;    //Битовая переменная

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

var   A0_bit : sbit at PORTA.B0;

Данное выражение ставит в соответствие переменную A0_bit и нулевую линию PORTA.

Далее в программе подобная переменная может использоваться для доступа к PORTA.0 с помощью обычного присваивания.

A0_bit:=1;

Установка и сброс отдельного бита в регистре также могут быть выполнены с помощью команд setbit и clearbit. Их запись выглядит следующим образом:

setbit(<Имя регистра>,<номер бита>);

clearbit(<Имя регистра>,<номер бита>);

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

Номер бита всегда задается константой. Не следует пытаться подставить вместо нее переменную, для произвольного управления битами в регистре. Этот факт связан в первую очередь с особенностями системы команд микроконтроллера, а не с недостатками компилятора.

Значение отдельных бит часто необходимо знать для управления оборудованием или выбора требуемой ветви алгоритма. Определение логического состояния выполняется с помощью вызова функции testbit. Ее запись выглядит следующим образом:

<переменная>= testbit(<Имя регистра>,<номер бита>);

Возвращаемая переменная имеет тип byte, но может принимать только два значения 0 и 1, соответствующих состоянию тестируемого бита.

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

 

Еще по теме:

Среда программрования microPascal Pro for PIC.

Паскаль для микроконтроллеров PIC.  Часть 1.

 

You have no rights to post comments