Файл: Учимся программировать микроконтроллеры 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