Суббота, 21.10.2017, 02:22
RC - Мастерская
Главная | Каталог статей | Регистрация | Вход
Меню
Статистика
Главная » Статьи » Обмен опытом » Arduino для школьников

5. Машинная азбука
Машинная азбука


Так уж повелось, что люди по всему миру используют арабскую или десятичную систему исчисления. В ее основе лежат цифры от 0 до 9. Все числа при этом получаются как комбинации этих десяти цифр путем увеличения их количества в итоговом числе - разрядности. И чем выше разряд цифры, тем она более значима. Ну да не будем останавливаться на прописных истинах. Зададимся лучше другим вопросом: а удобно ли использовать арабские цифры в электронике? - Мягко говоря, не очень...
Как говорилось ранее, в цифровой технике есть понятие логического нуля и логической единицы - сигнал либо есть, либо нет. Фактически это означает, что машинная система исчисления должна базироваться на этих двух цифрах - 0 и 1. А это есть ни что иное как двоичная система исчисления. В ней действуют все те же правила, что и в привычной нам десятичной. Ведь от формы записи суть числа не меняется. Выглядит это примерно так:
0 и 1 так и останутся неизменными. Для числа 2 же в двоичной системе подходящей цифры нет. Значит она будет записана путем увеличения разрядности - 10. Аналогично число 3 будет выглядеть как 11. Число 4 будет иметь уже три разряда - 100. Число 5 будет выглядеть как 101, 6 - 110, 7 - 111, 8 - 1000. И так далее...
Итак, двоичная система исчисления базируется на цифрах 0 и 1. В цифровой электронике один разряд двоичного числа называется битом. В битах же измеряют и разрядность двоичных чисел. Кстати, наши микроконтроллеры имеют разрядность 8 бит. Что это значит? Дело в том, что числа внутри микроконтроллера передаются и обрабатываются по специальным шинам данных. Число проводов в этой шине определяет количество параллельно передаваемых сигналов. Каждый такой провод представляется разрядом битом. Таким образом наш микроконтроллер может работать с числами длинна которых равна восьми разрядам. Но у нас далеко не все числа имеют разрядность 8. Как быть с числами, чья разрядность меньше 8 понятно - просто дополним эти числа нулями слева до получения нужной разрядности. Но это даст нам диапазон исчисления от 0 до 255. Как-то мало...
На самом деле люди уже давно решили эту проблему. И решена она была до гениальности просто: Если нет возможности передать требуемое число разрядов параллельно, значит надо это сделать последовательно. Так 8 бит объединили в один байт, а передача 16-ти разрядного числа свелась к передаче двух байтов один за другим последовательно. Но это не решает проблемы отрицательных чисел... А вот тут ситуация повернулась еще интереснее: оказалось, что отрицательные числа (равно как и дробные) на уровне микропроцессора просто не нужны - последнему достаточно целых положительных чисел. Ну процессору они то может и не нужны, а нам еще как нужны! Для этого в языках программирования и существует типизация данных.
Основные типы данных Arduino будут выглядеть так:
byte - Имя говорит само за себя. Длинна - 1 байт, диапазон значений от 0 до 255.
int - целое число. Длинна 2 байта, диапазон значений от -32768 до 32767. Для формирования отрицательного числа используется старший бит старшего байта. Установка его в 1 указывает на то, что число меньше нуля.
uint - беззнаковое целое. Практически тоже самое, что и int. Только старший бит старшего байта используется по прямому назначению. Таким образом достигается диапазон значений от 0 до 65535 без изменения разрядности.
float - тип предназначен для вещественных чисел в диапазоне от -3.4028235E+38 до 3.4028235E+38. Число занимает в памяти 32 бита или 4 байта. Тут надо сказать, что математические операции с дробными числами для процессора не являются естественными и потому занимают много больше времени, нежели целочисленные. На "больших" ПК это не очень заметно, но скорость нашего МК всего 16МГц. И потому сравнительно небольшое количество операций над такими числами может существенно сказаться на быстродействии.
Есть и другие типы данных, но о них будем говорить по мере необходимости. На данном этапе нам будет достаточно этих.

Итого: с представлением чисел в микроконтроллере разобрались, с двоичной системой вроде бы тоже... Arduino IDE и компилятор взяли на себя пересчет чисел из одной системы в другую и обратно. Поэтому мы не задумываясь пишем в коде привычные десятичные числа. Но иногда бывает удобно записать в коде двоичное число. Тогда компилятору надо принудительно указывать, что число именно двоичное, а не десятичное из одних нулей и единиц. Для этого в начале числа ставится латинская буква "B" от слова binary - двоичный.
Да и все бы хорошо, но есть "ложка дегтя". Двоичная запись чисел получается очень длинной и занимает на экране много места. Человеку ее читать неудобно. Десятичная запись короткая, но ее сложно разделять на байты. Что тоже часто создает проблему. Вот бы иметь такую систему исчисления, которая была бы лишена этих недостатков. Формально система должна обладать достаточно большим количеством чисел, а ее основание (количество чисел) должно быть равно какой-либо степени двойки. Много чего перепробовали... В итоге программисты пришли к использованию шестнадцатеричной системы исчисления. Ее основанием являются цифры от 0 до 9 и буквы латинского алфавита от a до f. Правила записи чисел в ней сходны с другими системами. Но что в ней действительно для нас будет удобным: для записи одного байта понадобится всего два символа. Такая запись будет удобно читаться с экрана и легко разделяться по байтам. Для компилятора признаком шестнадцатеричной записи числа будет служить префикс "0x".
На последок я приведу три строки кода, абсолютно идентичных между собой с точки зрения компилятора:
a = 15;
a = b1111;
a = 0xff;

Категория: Arduino для школьников | Добавил: Mactep (05.01.2014)
Просмотров: 1092 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Поиск