Главная » Статьи » Полезные материалы

Добро пожаловать в мир программирования микроконтроллеров

Переменные, типы переменных и операции с ними

Компилятор Proton поддерживает несколько типов переменных и это достаточно функциональный набор:

  • Bit – 1-битная переменная. Может принимать значения либо 0, либо 1. Эта переменная занимает в памяти микроконтроллера 1 байт, поскольку память программ адресуется байтами, а не битами. Поэтому удобней определять битовые переменные, используя уже определенный байт. Об этом будет рассказано ниже.

Переменная определяется в начале программы следующей конструкцией:

Dim Flag As Bit

Мы зарезервировали в памяти микроконтроллера место под переменную типа Bit и для удобства восприятия назвали ее Flag.

Данный тип переменных удобно использовать в качестве каких-либо флагов. Например, произошло прерывание (не важно, от какого источника) основной программы в момент вывода информации на ЖКИ. Чтобы не отнимать время на обработку прерывания мы в обработчике прерываний просто устанавливаем флаг

Flag = 1

и спокойно выходим из обработчика.

После выхода из обработчика прерываний программа продолжается с того места, где она была прервана. Программа заканчивает вывод на ЖКИ и выполняется дальше. Мы же далее проверяем, было ли прерывание:

If Flag = 1 Then

HRSout Dec 2 Temperature ‘И если прерывание было, выполняем какие-то действия

‘И не забываем сбрасывать флаг прерывания, чтобы не выполнять эти действия бесконечно

Flag = 0

Endif

Для работы с этим типом переменной достаточно знать булеву алгебру. С переменной типа бит можно проводить любые булевы операции: логическое И, логическое ИЛИ, логическое НЕ, логическое ИСКЛЮЧАЮЩЕЕ ИЛИ и их комбинации. Естественно, с таким типом данных не выполнишь ни тригонометрические, ни логарифмические, также нецелесообразно выполнять с ним и операции умножения и деления.

  • Byte – беззнаковая переменная размером в один байт. Состоит из 8 бит.

Может принимать значения:

Формат

от

до

10-тичный

0

255

16-ричный

$ 0

$FF

двоичный

%00000000

%11111111

Знак «$» перед каким-либо числом означает, что число – шестнадцатиричное, а знак «%» - что число – двоичное. Отсутствие какого-либо знака перед числом означает, что число – обычное в десятичной системе представления.

Байтовая переменная, как и все остальные, описываются в начале программы.

Dim Temperature As Byte ‘Мы определили переменную типа байт и назвали ее Temperature

Операции с переменной типа байт – самые распространенные. Это связано с тем, что все порты микроконтроллеров, а также регистры специального назначения имеют размерность в байт. Конечно, существуют порты разрядностью в 5 или 2 бита. Но все равно в этих случаях используются переменные типа байт.

Байту можно присвоить какое-то значение и вывести непосредственно в порт или регистр микроконтроллера, а можно присвоить это значение порту или регистру непосредственно:

Dim VoltLevel As Byte ‘Создали переменную типа Byte

Dim Temp As Byte ‘Еще одну

VoltLevel = 100 ‘Присвоили первой переменной одно значение

Temp = %10001111 ‘Присвоили второй переменной значение

PORTB = VoltLevel ‘Вывели в порт МК значение переменной

Option_Reg = Temp ‘Присвоили регистру Option_Reg значение второй переменной

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

Dim Flag As Bit ‘Определим битовую переменную

Dim TempVar As Byte ‘Определим байтовую переменную

Flag = TempVar.6 ‘Извлечем в битовую переменную шестой бит байтовой переменной.

Это – один из вариантов. Есть простой способ обращения к битам переменной. В начале программы мы сразу определяем название для каждого бита байтовой переменной:

Dim FlagsVar As Byte ‘Определили переменную типа байт

Dim Mode_1 As FlagsVar.0 ‘Первый бит переменной назовем Mode_1

Dim Mode_2 As FlagsVar.1 ‘

Dim Mode_3 As FlagsVar.2 ‘

Dim Mode_4 As FlagsVar.3 ‘

Dim Mode_5 As FlagsVar.4 ‘

Dim Mode_6 As FlagsVar.5 ‘

Dim Mode_7 As FlagsVar.6 ‘

Dim Mode_8 As FlagsVar.7 ‘Восьмой бит назовем Mode_8

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

Определение битовых переменных для байта, не занимает ровным счетом никакого программного или регистрового пространства. Мы уже определили байт. И для удобства (для себя) дали имя каждому биту. Все просто.

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

Следует помнить, что максимальное значение, которое может удерживать байт – 255. Если в результате какой-либо математической операции будет получен результат, превышающий 255, то в переменную будет записано число, равное результату минус 255. Например, при умножении 20*20 мы получаем 400. Значит в переменную будет записан результат 400 – 255 = 145.

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

Существуют еще операции для работы с байтовыми переменными.

Таблица содержит все простые математические операции.

Сложение «+»

Обычное сложение переменных или/и констант

Вычитание «-»

Операция вычитания между переменными или/и константами

Умножение «*»

Умножение между переменными или/и константами

Верхнее умножение «**»

Возвращает старшие 16 бит результата умножения 16-разрядных целых чисел

Среднее умножение «*/»

Возвращает средние 16 бит результата умножения 16-разрядных целых чисел

Деление «/»

Операция деления между переменными или/и константами

Модуль «//»

Возвращает остаток от деления одного целого числа на другое

Побитовое логическое И « & »

Возвращает логическое И между двух значений

Побитовое логическое ИЛИ « | »

Возвращает логическое ИЛИ между двух значений

Побитовое логическое исключающее ИЛИ « ^ »

Возвращает логическое исключающее ИЛИ между двух значений

Побитовый сдвиг влево « << »

Перемещает биты влево на определенное количество позиций

Побитовый сдвиг вправо « >> »

Перемещает биты вправо на определенное количество позиций

Отрицание « ~ »

Побитовое логическое НЕ

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

  • Word – беззнаковая переменная, имеющая размерность 16 бит или 2 байта. Эту переменную называют также словом.

Эта переменная может принимать следующие значения:

Формат

от

до

10-тичный

0

65535

16-ричный

$ 0

$FFFF

двоичный

%0000000000000000

%1111111111111111

Лучше всего для работы с этим типом данных, подходит, конечно 16-ричный формат, поскольку занимает меньше места при написании числа. Но это – дело личных предпочтений.

Объявляется эта переменная так же, как и все остальные? В начале программы:

Dim CountOfExempl As Word ‘Определим переменную типа Word

Работа с данным типом переменных ничем не отличается от работы с переменной типа байт. Просто здесь число – больше.

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

Dim RawData As Word ‘Создали переменную типа Word

Dim DataH As RawData.HighByteПрисвоим старшему байту переменной RawData имя DataH

Dim DataL As RawData.LowByte ‘Младший байт назовем DataL

Теперь можно записать и так:

Dim Flag As RawData.HighByte.0 ‘Присвоим нулевому биту старшего байта переменной RawData имя Flag

То же самое:

Dim Flag As DataH.0 ‘Присвоим нулевому биту старшего байта переменной RawData имя Flag

Еще для определения переменных используется директива Symbol. Приведенный выше пример можно записать и так:

Dim RawData As Word ‘Создали переменную типа Word

Symbol DataH = RawData.HighByteПрисвоим старшему байту переменной RawData имя DataH

Symbol DataL = RawData.LowByte ‘Младший байт назовем DataL

Symbol Flag = DataH.0 ‘Присвоим нулевому биту старшего байта переменной RawData имя Flag

Также можно написать и так:

Dim RawData As Word ‘Создали переменную типа Word

Dim Data_1 As RawData.Byte0 ‘Назовем младший байт переменной RawData именем Data_1

Dim Data_2 As RawData.Byte1 ‘Назовем младший байт переменной RawData именем Data_1

Директивой Symbol нельзя создавать новую переменную. Можно лишь с помощью нее присваивать имя, используя уже существующую переменную.

Операции, относящиеся к переменной типа байт, можно смело использовать в отношении переменной типа Word, поскольку они практически ничем не отличаются. Единственное, что нужно помнить, это то, что максимальное значение для этого типа переменных равняется 65536. И при переполнении (при выходе за этот диапазон), так же, как и в случае с байтами, в нее будет записано значение, равное разнице между этим результатом и числом 65535.

  • DWord – знаковая переменная, состоящая из 4 байт, или по-другому, из двух переменных типа Word, или же, из 32 бит. Значения, принимаемые этой переменной от -2147483648 до 2147483647

Dim PositionX As DWord ‘Резервируем в памяти 4 байта для переменной PositionX

Dim PositionY As DWord ‘Еще 4 байта для переменной PositionY

 

Здесь, по аналогии с переменной типа Word, можно давать имя не только каждому байту, но также и каждому из двух слов этой переменной. Делается это так:

Dim TempVar As DWord ‘Переменная типа DWord

Dim Temp_1 As TempVar.LowWord ‘Младшая переменная типа Word, которую мы назвали Temp_1

Dim Temp_2 As TempVar.HighWord ‘Старшая переменная типа Word

Тоже самое мы можем написать и так:

Dim TempVar As DWord ‘Переменная типа DWord

Dim Temp_1 As TempVar.Word0 ‘Младшая переменная типа Word, которую мы назвали Temp_1

Dim Temp_2 As TempVar.Word1 ‘Старшая переменная типа Word

Теперь можно дать имя каждому байту выделенным переменным Temp_1 и Temp_2. Опять же это можно сделать двумя способами:

Dim LowByteOfTemp_1 As TempVar.Byte0

или

Dim LowByteOfTemp_1 As Temp_1.LowByte

 

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

С переменной типа DWord можно проводить те же самые операции, но с тем условием, что переменная этого типа – знаковая. Следует помнить об этом. Это означает, что в случае отрицательного результата, в переменную этого типа и будет записано отрицательное значение. С переменными типа Byte или Word это не пройдет. При отрицательном результате, в переменную будет записано значение, равное разнице между 255 и отрицательным результатом. То есть, если в результате вычитания ожидалось увидеть в переменной типа Byte минус 53, то в нее будет записано значение равное 255 – 53 = 202. В практике иногда случаются такие ошибки, поэтому следует строго следить и ограничивать диапазоны результатов операций с учетом этих особенностей.

  • Float – переменная для хранения дробных значений. Занимает в оперативной памяти микроконтроллера 4 байта. Может теоретически удерживать значения от -1e37 до 1e38. Однако, в связи с 32-разрядной архитектурой компилятора, реально данный тип переменной может удерживать значения от -2147483646.999 до 2147483646.999, что делает этот тип переменных самым точным. По сравнению с переменной типа DWord, операции с данным типом занимают в памяти микроконтроллера еще больше памяти. Его также рекомендуется использовать там, где это необходимо. Например, для удержания точных значений.

Dim Pi As Float ‘Определим переменную с плавающей запятой

Pi = 3.1416

Для отделения целого числа от долей используется точка, а не запятая. Чем меньше число с плавающей запятой, тем точнее значение.

Набор операций с переменной типа Float – самый богатый. Здесь и тригонометрические, и логарифмические операции и все простые математические операции, производимые с байтами.

  • String – это строковая переменная, которой можно присваивать символьные значения. Она может занимать в памяти микроконтроллера до 255 байт, в зависимости от указанной длины переменной. Чтобы понять, что из себя представляет этот тип переменных, нужно представить последовательность байт в памяти, каждый элемент которой содержит один символ.

 

Dim Text As String * 20 ‘Данная строка зарезервирует в памяти 20 байтовых ячеек для хранения символов.

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

Dim Text_1 As String*15 ‘Создадим переменную типа String

Dim Text_2 As String*15 ‘Создадим переменную типа String

Text_1 = "HELLO ”

Text_2 = "WORLD!”

Text_1 = Text_1 + Text_2 ‘Теперь переменная Text_1 содержит запись – HELLO WORLD!

Есть дополнительные операции для работы со строками. Это операции ToUpper, ToLower, Left$, Mid$, Right$

Операция ToLower переводит строку в нижний регистр.

ToUpper, соответственно, переводит строку в верхний регистр.

Left$ - обрезает строку слева на указанное количество символов.

Right$ - обрезает строку справа на указанное количество символов.

Mid$ - вырезает часть строки указанной длины из указанного места в строке.

 

На этом, пожалуй, можно остановиться. Надеюсь, кому-то эта статья покажется нужной и полезной




Категория: Полезные материалы | Добавил: ADMIN (11.12.2013)
Просмотров: 5868 | Комментарии: 6 | Рейтинг: 5.0/7
Всего комментариев: 6
1 vanish   (16.12.2013 20:52)
Прикольно! Думаю польза для начинающих от подобных статей реальна есть.

2 ADMIN   (18.12.2013 03:20)
Спасибо

3 msv_gen   (11.02.2015 14:06)
String только для 18F или выше...

0
4 ADMIN   (11.02.2015 18:24)
Все верно. Хотя, кто знает... Может сейчас и 16-е поддерживают этот тип... Давно не писал ничего на протоне...

5 HCT   (17.02.2015 11:17)
Вот спасибо! Есть польза, есть! Как раз это мне и нужно было на данном этапе. Спасибо!

6 Ingvar   (10.11.2015 11:02)
И от меня огромное спасибо!

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]