Файл: Самоучитель по программированию PIC контроллеров для начинающих (Е.А. Корабельников,2008).pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 16.06.2025

Просмотров: 3591

Скачиваний: 3

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

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

Разбираемся с директивами ассемблера.

Директивы, в отличие от команд, не включаются в выходной код.

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

Тогда зачем вообще нужны директивы?

Дело в том, что директивы, за "пределы" MPLAB (интегрированной среды разработки для ПИКов), не выходят и исполняются только внутри MPLAB.

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

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

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

Если директива находится вне "границ" рабочей части программы (в "шапке" или директива END), то естественно, что никакого ее разложения на команды не будет.

Вне рабочей части программы, до команды перехода на начало исполнения рабочей части программы (goto Start), MPLAB "понимает" директивы и "не понимает" команд. Посмотрите в "шапку" программы Multi.asm: до команды перехода на начало исполнения рабочей части программы, Вы не найдете ни одной команды.

Это "внутреннее дело" MPLAB (тайна сия велика есть).

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

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

MPLAB, без вмешательства программиста, "воткнет" это разложение в то место памяти программ, в которое его и нужно "воткнуть" и создаст соответствующий HEX файл ("прошивку").

Директивы можно уподобить администратору - распорядителю какого-то мероприятия. Задача этого администратора: перед началом "мероприятия" (рабочей части программы), для того чтобы оно прошло успешно, "расставить всё по своим местам", а также и в "меру своих возможностей, поучаствовать в этом мероприятии".

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

Некоторые директивы:

Директивы макроассемблера MPASM

Определение блока констант.

Используется для размещения

CBLOCK

нескольких констант в памяти программ

cblock 0x20

1.

и памяти данных.

nameA,nameB ;адрес20,21

2.

ENDC

Сначала указывается стартовый адрес

nameC,nameD ;адрес22,23

для первой константы, последующие

endc

адреса декрементируются.

Список заканчивается директивой ENDC.

……………………………….

3.

END

Окончание программы (конец всех

……………………………….

команд)

end

Присваивает неизменное значение

41


4.

EQU

константе.

set

Присваивает значение константе, которое

nameA

equ 0x05

;присво-

5.

SET

можно переопределить.

;

ить константе nameA 0x05

5.

INCLUDE

Подключение дополнительного

#include p16f84a.inc

;подклю-

исходного файла

;чение файла с описаниями

;регистров спец. назначения

6.

_ _CONFIG

См. таблицу символов

Установка битов конфигурации

конфигурации

7.

CONSTANT

Определение неизменной символьной

константы

constant

cnt=255

8.

VARIABLE

Определение символьной константы,

variable

temp=0xF0

значение которой в последствии можно

constant

cnt1=cnt2+cnt3

переопределить.

9.

Установить начальный адрес программы.

<метка1>

org 0x20

ORG

При отсутствии ORG программа начина-

;вектор с адресом 20

ется с нулевого адреса.

<метка2> org <метка1>+0x10

;вектор с адресом 30

10.

RADIX

Система исчисления по умолчанию

radix dec

(hex – 16, dec – 10, oct – 8)

Обратите внимание на директивы EQU, __CONFIG, ORG, END. Они используются практически во всех программах (примечание: перед директивой CONFIG не одно, а 2 подчеркивания, идущих подряд.)

Есть они и в программе Multi.asm.

Найдите их в тексте этой программы, и Вы поймете что они "администрируют" (распределяют, назначают и ограничивают).

Также обратите внимание на то, что с помощью директивы EQU, регистры TrisB и PortB "прописаны" по одинаковым адресам (06h).

С нулевым банком все понятно: регистр PortB имеет в области оперативной памяти адрес 06h, а вот регистр TrisB (первый банк) "прописан" не по адресу 86h, а все по тому же адресу

06h.

Вчем дело?

Вадресах регистров специального назначения, ноль (устанавливается по умолчанию) меняется на восьмерку только тогда, когда программно осуществлен переход в 1-й банк. Без учета этого, нумерация адресов регистров специального назначения обеих банков одинакова.

А раз это так, то регистр TrisB можно прописать не по адресу 86h, а по адресу 06h.

После исполнения команды выбора 1-го банка, 06h автоматически "превращается" в 86h, что и нужно.

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

Если прописать регистр TrisB по адресу 86h, то такие сообщения будут выдаваться. Они не являются ошибками, но нервируют и отвлекают внимание.

Особенно на первых порах.

Рекомендую Вам, при "прописке" адресов регистров специального назначения 1-го банка, обозначенных, в области оперативной памяти, черным цветом, назначать им адреса по принципу типа "минус 80", то есть, так, как сделано в программе Multi.asm (в части касающейся "прописки" регистра TrisB).

Вэтом случае, сообщение об успешном ассемблировании будет самым коротким (4 строки). Но можно "прописать" и по "штатным" адресам (будут выдаваться сообщения информативного характера). "Это на любителя".

Влюбом из этих случаев, ошибок не будет.

Синтаксические правила написания программы.

42


MPLAB "замучает" Вас сообщениями об ошибках, если не выполнены определенные правила написания текста программы.

Давайте в них первично разберёмся, на примере программы Multi.asm. Все, что находится правее точки с запятой (;), MPLAB "не видит".

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

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

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

Последние символы содержимого столбца не должны "наезжать" на первые символы соседнего справа столбца. Между ними должен быть хотя бы один пробел.

Чтобы "не забивать Вам голову" рассуждениями о возможных компоновках расстояний между столбцами, рекомендую пользоваться следующим "правилом 12-ти пробелов":

1.От крайней левой позиции строки (начало 1-го столбца) отсчитываете 12 пробелов. Это будет начало 2-го столбца.

2.Затем отсчитываете 12 пробелов от начала 2-го столбца. Это будет начало 3-го столбца.

3.Затем отсчитываете 12 пробелов от начала 3-го столбца.

Это будет начало комментариев.

Такой вариант "проверен жизнью". Я пользуюсь им всегда и Вам советую.

Содержимое столбцов.

"Шапка" программы.

В1-м столбце (левом) располагаются названия регистров и названия битов (в

программе Multi.asm их нет, но в других, более сложных программах, они есть).

Во 2-м столбце находятся директивы и команда перехода на начало исполнения программы.

В3-м столбце находятся рабочие части директив и название подпрограммы, с которой начинается исполнение программы (в данном случае, Start).

Для регистров, определяется их адрес.

Для битов, определяется их номер (в пределах байта).

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

Вконце "шапки" программы, располагается "связка" org 0 и goto Start (начать исполнение программы с ПП Start, первая команда которой имеет нулевой адрес), а при наличии в программе подпрограммы прерываний - директива org 4 (об этом - позже).

Рабочая часть программы.

В1-м столбце располагаются названия подпрограмм и меток .

Во 2-м столбце располагаются команды и директивы.

В3-м столбце располагаются рабочие части команд и директив.

Вконце программы, обязательно должна присутствовать директива END {что-то типа "сюда (вниз) не ходи. Ходи туда (вверх)"}.

Если убрать все то, что находится правее точек с запятой (оформление, комментарии), то это и будет текст программы в "чистом виде", то есть, то, с чем работает MPLAB при

ассемблировании (создании HEX - файла).

Теперь - о форме представления чисел.

Чтобы MPLAB "поняла", в какой системе исчисления представлено число, необходимо его соответствующим образом оформить:

СИНТАКСИС ЧИСЛОВЫХ ЗНАЧЕНИЙ В РАЗЛИЧНЫХ СИСТЕМАХ ИСЧИСЛЕНИЯ

Формат

Синтаксис

Примеры

16 - ричный

H´число´

H´9f´

0xчисло

0x9f

10 - тичный

D´число´

D´100´

.число

.100

8 - ричный

O´число´

O´777´

43


2 - ичный

B´число´

B´00001111´

´символ´

´C´

Символьный (ASCII)

A´символ´

A´C´

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

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

Впрограмме Multi.asm, константы представлены именно в десятичной системе исчисления (с точкой слева).

До девятки включительно, 16-ричная и 10-тичная системы исчисления одинаковы.

Вэтом случае (число не более 9-ти), все равно, в какой системе исчисления, в 16-ричной или в 10-тичной, происходит отображение числа.

То есть, в этом случае, число можно "прописать" в привычном (удобном), десятичном виде, без указания атрибутов системы исчисления.

Если в тексте программы "прописано" число, не "укомплектованное" атрибутом системы исчисления, то по умолчанию, это число будет "воспринято" MPLABом как 16-ричное.

Если это число не более 9-ти, то какая разница, ведь в 10-чном виде оно точно такое же, как и в 16-ричном.

После девятки, "этот номер уже не пройдет", так как появляются расхождения.

Бинарная система исчисления стоИт, как бы, "особняком" и этим правилам не подчиняется. 8-ричная система исчисления используется очень редко.

Символьная система исчисления "привязана" к стандартному, международному коду ASCII

В"шапке" программы, адреса регистров лучше указывать в 16-ричном виде, а всё остальное

– на выбор. Как кому удобнее. В зависимости от конкретных обстоятельств.

При указании номера бита, по причине того, что номера битов не являются числами, большими чем 9, просто пишется номер бита (без атрибутов системы исчисления).

Итак, правила оформления текста программы, на самом деле, не являются чем-то страшно трудным. Наоборот, они достаточно просты и освоить их не составляет великого труда. Промежуточный итог: мы сейчас уже вплотную подошли к практической работе с текстами программ, что предполагает "ввод в действие тяжелой артиллерии" в виде "набора" программ интегрированной среды разработки для ПИКов с названием MPLAB.

Приложение Принципиальная схема автоколебательного мультивибратора (генератора импульсов)

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

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

"Самоучитель по программированию PIC контроллеров для начинающих" http://ikarab.narod.ru E-mail: karabea@lipetsk.ru

44