Файл: Учимся программировать микроконтроллеры Pic на языке PicBasicPro (В.В. Хилинский, 2007).pdf

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

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

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

Добавлен: 17.06.2025

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

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

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

Размещаются операторы описания констант обычно в самом начале программы.

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

Для записи числовых констант в PicBasicPro используются три формы: десятичное число, двоичное и шестнадцатеричное. Двоичные значения определяются с использованием префикса «%» а шестнадцатеричные значения с использованием префикса «$». Десятичные значения - по умолчанию не требуют никакого префикса.

Примеры:

100 ' десятичное число %100 ' двоичное число

$100 ' шестнадцатеричное число

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

Пример:

LCDOUT "Hello" ' Вывести на экран ЖК монитора слово Hello

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

Символы.

Для совместимости с BasicStamp в PicBasicPro был введен оператор SYMBOL. Он обеспечивает еще один метод для совмещения имен переменных и констант. Оператор SYMBOL не может использоваться для того чтобы создавать переменные.

Пример:

SYMBOL lion = cat ' cat был предварительно создан с использованием оператора VAR

SYMBOL mouse = 1 ' тоже самое что - mouse = 1

Метки.

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

40

метки. В отличие от многих ранних версий BASIC, PicBasicPro не требует нумерации строк. Вместо этого любая строка может начаться с метки. В данном случае она является просто идентификатором. Заканчивается метка двоеточием.

LAB:

PRINT "Hello World"

GOTO LAB

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

LABEL1:

является совершенно правильным, однако выражение:-

1LABEL:

произведет синтаксическую ошибку, потому что метка начинается с цифры - 1. Символы подчеркивания также разрешаются как часть знаков метки. Это помогает создавать более ясные имена меток. Например:-

THISISALABEL:

Эта метка менее понятна чем:

THIS_IS_A_LABEL:

Массивы.

Одним из основных понятий в программировании является понятие массива.

Массив — это набор однородных данных (BIT, BYTE или WORD), имеющий имя и последовательную нумерацию его элементов. Если мы знаем, что в программе предстоит работать с большим объемом каких-то данных, то мы должны объявить этот массив в программе. Массивы переменных могут быть созданы, так же как и переменные.

Label VAR Size[Number of elements]

Где

Label - любой идентификатор, исключая ключевые слова, как описано выше. Size – формат переменных массива (BIT, BYTE или WORD).

Number of elements – количество элементов массива. Примеры создания массивов:

41


sharks VAR byte[10] fish VAR bit[8]

Первый элемент массива - элемент 0. В массиве рыбы, определенном выше, элементы пронумерованы от fish [0] до fish [7] всего приведено 8 элементов. Поскольку массивы распределены в памяти, есть пределы размера для каждого типа:

Таблица зависимости объема занимаемой памяти массивом от типа массива Таблица 5

Тип

Максимальное количество элементов

BIT

256

BYTE

96*

WORD

48*

• Зависит от микроконтроллера.

Математические операторы.

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

Замечание: Все математические операторы выполняются для операндов без знака и с 16 разрядной точностью.

Таблица математических операторов языка PicBasiPro

Таблица 6

Математический оператор

Описание

=

Оператор присваивания

+

Сложение

-

Вычитание

*

Умножение

**

Старшие 16 разрядов результата

умножения

*/

Средние 16 разрядов умножения

/

Деление

42


//

Остаток (Модуль)

<<

Сдвиг влево

>>

Сдвиг вправо

ABS

Абсолютное значение

COS

Косинус

DCD

2n декодер

DIG

Цифра

DIV32

Деление 32 разрядного числа

MAX

Максимум

MIN

Минимум

NCD

Енкодер

REV

Реверсирование разрядов

SIN

Синус

SQR

Квадратный корень

&

Поразрядное И

|

Поразрядное ИЛИ

^

Поразрядное исключающее ИЛИ

~

Поразрядное НЕ

&/

Поразрядное НЕ И

|/

Поразрядное НЕ ИЛИ

^/

Поразрядное НЕ исключающее ИЛИ

Итак, компьютер умеет вычислять элементарные арифметические выражения. Но для того, чтобы он смог это сделать, мы должны представить это самое выражение в понятном ему виде, а именно:

1.В отличие от арифметики, выражение должно быть записано в одну строку безо всяких числителей и знаменателей;

2.Для записи арифметических действий допустимо использовать только перечисленные ниже знаки. Недопустим пропуск знака умножения между коэффициентом и переменной, как это возможно в алгебре (например, нельзя писать 2х, а надо 2*Х, или нельзя 5d, а надо 5*D);

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

43


сложных выражениях они могут быть двойные, тройные и т. д.). Далее вычисляются функции, если они есть. Потом умножение и деление. И, наконец, в последнюю очередь - сложение и вычитание; 4. Действия одинаковой очередности выполняются слева направо.

Теперь поговорим о каждом из этих операторов отдельно.

Умножение.

Оператор «*» возвращает младшие 16 разрядов 32-битового результата. Это - типичное умножение, характерное для большинства языков программирования.

Оператор «**» возвращает старшие 16 разрядов 32-битового результата.

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

Пример:

W1

= W0

* 1000

' Умножить W0 на 1000 а результат(младшие 16

‘ разрядов) записывается в W1

W2

= W0

** 1000

'Умножить W0 на 1000 а результат (старшие 16

‘ разрядов, которые могут быть и 0) записывается в W2

Оператор - * / возвращает средние 16 разрядов 32-разрядного результата.

W3

= W1

*/ W0 'Умножить W1на W0 результат(срединные 16 разрядов 32

‘ разрядного числа) поместить в W3

Деление.

Оператор – «/» возвращает 16-разрядный результат деления одного 16разрядного числа на другое 16-разрядное число. В то же самое время оператор – «//» возвращает остаток от деления 16-разрядных чисел. Иногда это называется - модуль числа.

Пример:

W1 = W0 / 1000 ‘Разделить W0 на 1000 и результат поместить в W1 W2 = W0 // 1000 ‘Разделить W0 на 1000 и остаток поместить в W2

44

Операторы сдвига.

Операторы «<<» и «>>» сдвигают влево или вправо двоичное значение числа на указанное количество разрядов, т.е. от 0 до 15.

Пример:

B0 = B0 << 3 'Сдвинем двоичное значение переменной B0 на 3 разряда влево (все равно что умножить на 8)

W1 = W0 >> 1 'Сдвинем двоичное значение переменной W0 на 1 разряд вправо и результат запишем в W1 (все равно что разделить на 2),

Объясним все это, как говорится, на пальцах. Пусть мы имеем число 1000 или в двоичном представлении 1111101000, тогда операция 1000<<3 выдаст результат

1111101000000 или 8000 (1000*8), а операция – 1000>>2 выдаст – 11111010 или 250(1000/4).

Оператор ABS.

Оператор ABS возвращает абсолютное значение числа. Если Вы имеете дело с переменной размером в байт и она будет больше чем 127 (старший разряд =1), то тогда результатом команды ABS будет разность = 256 - значение. Если же Вы имеете дело с переменной размером в слово и она будет больше чем 32767 (старший разряд =1), то тогда результатом команды ABS будет разность = 65536 - значение.

Пример:

B0 VAR BYTE

B0 = 200

B1 = ABS B0 ‘ Результатом этой команды будет 50 (255-200)

Оператор COS.

Оператор COS возвращает 8-разрядное значение косинуса угла. Результат представляется в дополнительном коде. Это значит, что восьмой разряд результата в двоичном представлении говорит о знаке результата. Если этот разряд равен 0, то результат положительный, а если равен единице – отрицательный (модуль отрицательного результата может быть получен с использованием команды ABS). В PicBasicPro значения аргумента и значения функции отличаются от значений принятых в обычной математике. Так в PicBasicPro полный угол для функции COS равен 255 в двоичных радианах, в отличие от обычных 360 градусов. Для перевода градусов в двоичные радианы

45


воспользуйтесь формулой α*255/360 где α - угол в градусах. А максимальное и минимальное значение функции лежит в интервале от +127 до -127 (в обычной математике этот интервал от +1 до -1).

Пример:

B1 = COS B0

Оператор DCD.

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

Пример:

B0 = DCD 2 ' Переменная B0 равна %00000100

Оператор DIG.

Оператор DIG возвращает значение цифры десятичного числа. Просто укажите порядковое значение нужной цифры (0 - 4 где 0 является самой правой цифрой) значение которой Вы бы хотели выбрать.

Пример:

B0

=

123

' Переменная B0

равняется 123

B1

=

B0 DIG 1

' Переменная B1

есть вторая цифра десятичного

‘ значения переменной B0 (т.е. 2)

Оператор DIV32.

Синтаксис:

DIV32 Number

Функция умножение – «*» в PicBasicPro работает как произведение двух 16разрядных значений, приводящее к 32-разрядному результату внутри компилятора. Но, так как компилятор выполняет математические операции с переменными, максимальный размер которых 16 разрядов, то правильный результат получается в два этапа. То есть вначале выполняется функция «*», где результатом являются младшие 16 разрядов, а затем функция «**», где в результате возвращаются старшие 16 разрядов. И нет другого пути, чтобы получить доступ к 32-разрядному результату в один прием.

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

46

новая функция, названная DIV32. Работа функции DIV32 фактически ограничена делением 31-разрядного целого числа без знака (максимальное значение 2147483647) на 15-разрядное целое число без знака (максимальное значение 32767). Но поскольку компилятор во всех случаях работает только с 16разрядными переменными, то функция DIV32 должна начинать работать сразу же, как только выполнено умножение и внутренняя переменная все еще содержит 32-разрядный результат умножения. При этом никакая другая операция не должна произойти между операцией умножения и Div32, так, в противном случае, внутренняя переменная может быть изменена, уничтожив 32-битный результат умножения. Это означает, между прочим, что в это время и функции обработки прерывания должны быть отключены перед операцией умножения и до окончания работы функции DIV32. Прерывания же на ассемблере не влияют на внутренние переменные, и таким образом они могут использоваться вне зависимости от использования функции DIV32.

Пример:

a VAR

WORD

b

VAR

WORD

c

VAR

WORD

dummy

VAR WORD

b

=

500

c

=

1000

DISABLE

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

dummy = b

* c

' Можно было бы также использовать ** или */

a = DIV32

100

ENABLE ' Включаем обработку прерываний

В этом примере переменной b присваивается значение 500, а переменной c - значение 1000. Если эти два числа перемножить, то результат был бы 500000. Но это число превышает максимально возможный размер переменных в PicBasicPro т.е. - WORD размер, которой 16-разрядов (65535). Таким образом, перемножив эти два числа и выведя результат, мы бы получили только младшие 16 разрядов. Однако функция Div32 предоставляет нам доступ к внутренней 32 разрядной переменной компилятора как к операнду. В этом примере 32-bit результат умножения (b*c) делится на 100 с помощью функции Div32. В результате чего 16разрядный результат деления (5000) сохраняется в переменной - a.

Операторы MAX и MIN.

Операторы MAX и MIN возвращают максимальное или минимальное значение соответственно, двух чисел. Это обычно используется для того, чтобы ограничить значения некоторой величиной.

Пример:

47