Практическое занятие № 8
Тема: «Изучение системы команд микроконтроллеров»
Цель: ознакомление с системой команд микроконтроллера и использование команд для выполнения арифметических и логических операций.
Теория
Микроконтроллер оснащен системой команд, предназначенной для решения задач циклового и программно-логического управления дискретными производственными процессами, и обеспечивающей простоту и высокую производительность программирования. Исходная информация для составления программ может быть представлена циклограммой работы оборудования, блок-схемой алгоритма управления или в виде булевых функций.
Система команд микроконтроллера реализована исполнительной программой, хранящейся в ПЗУ модуля памяти.
Команды микроконтроллера можно разделить по функциональному назначению на следующие группы:
1) команды ввода-вывода;
2) команды управления программой;
3) команды управления счетчиками;
4) команды контроля и редактирования программы;
5) команды тестового контроля функциональных блоков.
Система команд микроконтроллера приведена в табл. 3.
Слово команды делится на два поля длиной по восемь разрядов – поле кода операции и поле операнда.
|
Старший байт (поле кода операции) |
Младший байт (поле операнда) |
||||||||||||||
|
C7 |
C6 |
C5 |
C4 |
C3 |
C2 |
C1 |
C0 |
C7 |
C6 |
C5 |
C4 |
C3 |
C2 |
C1 |
C0 |
|
N3 |
N2 |
N1 |
N0 |
||||||||||||
N0, N1, N2, N3 кодируются символами шестнадцатеричной системы счисления 0…9, А, В, С, D, E, F.
Шестнадцатеричная система счисления — это система счисления по основанию 16. В этой системе счисления числа записываются с помощью десятичных цифр от 0 до 9 и латинских буквы от A до F, то есть (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F).
Двоичная система применяется в цифровой техники, т.к. удобно цифры 0 и 1 обозначить двумя уровнями напряжения (обычно 0…0,8 В и 2…5 В ). Их соответственно называют:
0 – низкий уровень, 1 – высокий уровень.
Десятичная система удобно для человеческого восприятия и более привычна.
Шестнадцатеричная система широко используется в низкоуровневом программировании и вообще в компьютерной документации, поскольку в современных компьютерах минимальной единицей памяти является 8-битный байт, значения которого удобно записывать двумя шестнадцатеричными цифрами.
Совокупность команд образует управляющую программу, которая записывается и хранится в модуле ЭНЗУ. Объем модуля ЭНЗУ позволяет записать 256 команд УП (512 байт) и составляют одну зону памяти. Каждая зона памяти, в свою очередь, делится на две страницы, объемом по 128 команд (256 байт).
Номер зоны является базовым адресом (БА) для отсчета команд УП, записанной в этой зоне, и хранится в служебном регистре БА, организованном исполнительной программой в ОЗУ.
Помимо «БА» в ОЗУ организованы следующие регистры:
1) «СК» – счетчик команд микроконтроллера, содержимое которого определяет адрес команды в пределах зоны памяти;
2) «БУ» – бит условия, значение которого устанавливается в зависимости от результата выполнения ряда операций; анализ бита условия исполняется для управления ходом исполнения УП;
3) «УС» – регистр и указатель стека, определяющий адреса ячеек ОЗУ (стековая память), в которых запоминаются значения «БА» и «СК» при обращении к подпрограмме, откуда они выбираются при выполнении команды «ВОЗВРАТ»;
4) шестнадцать счетчиков, содержание которых может изменяться от 0 до F. При необходимости счетчик может использоваться как однобитовая память.
Изменение состояния служебных регистров приведено в описаниях соответствующих команд.
Команды ввода-вывода обеспечивают ввод информации от датчиков состояния оборудования и выдачу управляющих воздействий на исполнительные устройства.
В командах вывода информации адрес выхода, определяемый значением поля операнда, кодируется двумя шестнадцатеричными цифрами N1, N0, первое из которых может принимать значение от 0 до 2 и определяет один из трех модулей вывода дискретных сигналов, которые могут быть установлены в микроконтроллере.
Второе шестнадцатеричное число N0 определяет один из шестнадцати конкретных выходов 0,...,F в пределах выбранного модуля. Состояние каждого выхода отображается соответствующим индикатором, выведенным на переднюю панель модулей вывода дискретных сигналов.
Какие задачи вы возлагаете на микроконтроллер, и как он будет их выполнять, определяется заложенной в него программой – программой которую для микроконтроллера составляете вы сами.
Программа (в переводе это слово означает – “предписание”) – предварительное описание предстоящих событий или действий.
К примеру, мы хотим, чтобы микроконтроллер помигал светодиодом. Довольно простая задача, но тем не менее, для того, чтобы микроконтроллер выполнил ее, мы, предварительно, должны шаг за шагом описать все действия микроконтроллера — написать программу, которую он должен выполнить для получения нужного нам результата – мигающий светодиод.
Что-то вроде такого:
1. Зажечь светодиод:
— настроить вывод микроконтроллера, к которому подключен светодиод, для работы на вывод информации
— подать на этот вывод логический уровень, который позволит зажечь светодиод
2. Подождать некоторое время:
— перейти к подпрограмме, формирующей паузу (которую тоже нужно “прописать”)
— по выполнению подпрограммы паузы вернуться в основную программу
3. Погасить светодиод:
— подать на вывод микроконтроллера логический уровень, гасящий светодиод и так далее.
Программа циклична, т.е. программа состоит из циклов, и сама является циклом. В этих циклах, возможны условия, на которые в зависимости, от внешних воздействий или внутренних изменений надо давать однозначный ответ, да – нет.
Программа может состоять из подпрограмм, каждая из которых может содержать другие подпрограммы и т.д. Одна и та же подпрограмма может вызываться несколькими подпрограммами.
Подпрограмма — это часть программы описывающий функционально законченный процесс.
Например, В программе управляющей работой цифрового вольтметра, подпрограммами будут, программа аналого-цифрового измерения, программа работы кнопок, программа работы индикатора и т.д.
Задача программиста, учитывая структуру применяемого микроконтроллера, предусмотреть все возможные варианты выхода из циклов, при выполнении всех возможных условий.
Если этого не предусмотреть, программа будет выполняться не так как задумано, это может привести к различным ошибкам или остановки программы в одном цикле. Наглядно, это будет сбой (зависание, глюк). Устройство не реагирует на клавиатуру, исполнительные устройства включаются или не включаются, как задумано, индикаторы показывают непонятную информацию и т.д.
С термином Программа неразрывно связан другой термин – Алгоритм.
Алгоритм – набор инструкций, описывающих порядок действия для достижения нужного результата.
Если в программе мы подробнейшим образом прописываем все действия микроконтроллера, то в алгоритме, — мы определяем порядок действий микроконтроллера, на основе которых мы потом создадим программу. По аналогии с вышеприведенном примером:
♦ Зажечь светодиод
♦ Подождать некоторое время
♦ Погасить светодиод
и так далее.
Таким образом, алгоритм – это предшественник программы. И чем тщательно и продумано будет создан алгоритм, тем проще будет создавать программу.
Язык программирования
К сожалению, если любимой собачке мы можем подавать команды на человеческом языке, то общение с микроконтроллером должно происходить на языке, который понятен ему — языке микроконтроллерных команд.
Команды для микроконтроллера имеют вид набора единичек и нулей, типа:
00110101 011000100 так называемые – коды команд, а коды команд – это язык который понимает микроконтроллер. А для того, чтобы перевести наш язык общения на язык микроконтроллера – в эти самые наборы нулей и единичек, существуют специальные программы.
Эти программы позволяют описать порядок работы для микроконтроллера на более-менее понятном для нас языке, а затем перевести этот порядок на язык понятный микроконтроллеру, в результате чего получается так называемый машинный код – последовательность команд и инструкций (те самые нули и единички) которые только и понимает микроконтроллер.
Текст программы, написанный программистом, называется исходным кодом. Перевод программы с языка программирования (исходного кода) на язык микроконтроллера (машинный код) производится трансляторами.
Транслятор
превращает текст программы в машинные коды, которые потом записываются в память
микроконтроллера.
В таких программах порядок работы микроконтроллера описывается специальным
языком – языком программирования.
Язык программирования – это способ передачи команд, инструкций, чёткого руководства к действию для микроконтроллера.
Из множества языков программирования можно выделить два типа:
– языки программирования низкого уровня
– языки программирования высокого уровня
Чем они отличаются. А отличаются они своей близостью к микроконтроллеру.
На заре зарождения микропроцессорной техники, программы писали в машинных кодах, то есть весь алгоритм работы последовательно прописывали в виде нулей и единичек. Вот так, примерно, могла выглядеть программа:
01010010
01000110
10010011
Трудно, даже профессионалу, разобраться в такой комбинаций из двух цифр. Для облегчения своей жизни, программисты стали создавать первые языки программирования. Так вот, чем ближе язык программирования к такому набору нулей и единиц, тем больше он “низкого уровня”, а чем дальше от них – тем больше “высокого уровня”.
Самые распространенные языки программирования для микроконтроллеров:
— язык низкого уровня – Ассемблер
— язык высокого уровня – С (Си)
Давайте посмотрим на примере их различия (эти примеры абстрактные).
Допустим нам надо сложить два числа: 25 и 35.
В
машинных кодах эта команда может выглядеть так:
00000101 1101001
На языке низкого уровня:
ADD Rd, Rr
На языке высокого уровня:
25+35
Различие языков низкого и высокого уровня видны невооруженным глазом.
Но давайте копнемся в этих примерах поглубже. Пример машинного кода разбирать не будем, так как он идентичен примеру на Ассемблере. По своей сути, Ассемблерные команды — это те же машинные коды (команды) которым просто, чтобы не заблудиться в нулях и единицах, присвоены буквенные аббревиатуры. Ассемблерной командой ADD Rd, Rr мы ставим микроконтроллеру задачу сложить два числа, которые находятся (а для этого мы должны их туда предварительно записать) – первое в Rd, второе в Rr, а результат сложения поместить в Rd. Как видите мы ставим очень конкретную задачу микроконтроллеру: где взять, что с этим сделать и куда поместить результат. В этом случае мы работаем напрямую с микроконтроллером.
Команда на языке высокого уровня: 25+35, привычная для нас математическая запись, радующая наш глаз. Но в этом случае мы не работаем напрямую с микроконтроллером, мы просто ставим ему задачу сложить два числа. Результат и последовательность действий в данном случае будет тот-же, что и при выполнении ассемблерной команды: сначала эти два числа будут куда-то записаны, затем сложены, а результат куда-то помещен.
И вот тут кроется главное отличие языков высокого уровня и низкого уровня. Если в Ассемблере мы контролируем весь процесс (хотим мы того, или нет): мы знаем где записаны эти два числа, и мы знаем где будет находиться результат, то в языке высокого уровня мы процесс не контролируем. Программа сама решает куда предварительно записать числа и куда поместить результат. В большинстве случаев нам это и не надо знать, ведь для нас главное итог – число 60 на выходе.
Как результат, программы на языках высокого уровня более читаемы (спорный вопрос), приятны для глаза (спорный вопрос) и меньше по размеру – ведь нам не приходится “лезть во все дыры” и расписывать каждый шаг микроконтроллера, программа это делает потом за нас, когда компилирует ее – переводит в машинные коды.
Но тут есть и минус. Два одинаковых алгоритма написанных на Ассемблере и на Си, после преобразования их в машинные коды будут иметь разный размер: программа, написанная на Ассемблере будет на 20-40% короче программы написанной на Си. И бывают случаи, когда нет доверия к языку высокого уровня и в программе на Си делают вставки кода, написанные на Ассемблере.
Язык ассемблер — язык программирования низкого уровня, мнемонические команды которого (за редким исключением) соответствуют инструкциям микроконтроллера.
Мнемонические команды – это символьные команды, определяемые производителем для данного типа микроконтроллера.
{jcomments on}
Инструкция микроконтроллера – это команда в двоичной системе счисления, понятная микроконтроллера и определяющая определенную операцию с числами.
Например,
nop - мнемоническая команда, понятная человеку.
b’00000000’ - код команды nop, понятная
микроконтроллеру
Ассемблер очень прост, поэтому он относится к языкам низкого уровня. Существуют
языки высокого уровня, намного ускоряющие создание программ. Но знать
ассемблер, очень полезно и нужно любому программисту.
Компилятор – это программа, преобразующая команды, написанные на каком-либо одном языке программирования в машинные коды, понятные микроконтроллеру. В так называемый HEX –файл. Hex обычно записывается в шестнадцатеричной системе счисления.
Например, 0800080064008B13B300030E2A
Ход работы
1. Составьте программу на любом известном вам языке программирования, которая сравнивает возраст брата и сестры и выводит соответствующее сообщение.
2. Составить программу, проверяющую, принадлежит ли число, введенное с клавиатуры, интервалу (1; 5).
3. Составьте программу на любом известном вам языке программировании, которая выводит на экран различные приветствия в зависимости от введенного времени. Договоримся, что утро длится с 8 до 12 часов, день – с 12 до 17 часов, вечер – с 17 до 23 часов и ночь – все остальное время. Задачу решить двумя способами: с помощью условного оператора и оператора выбора.
4. Составьте программу на любом известном вам языке программировании для решения задачи: «Работник зарабатывает X рублей за 38 часов своей работы. Ему платят в 1,5 раза больше за каждый час сверх 38 часов. Какую сумму он получит, если отработает A часов?»
Материалы на данной страницы взяты из открытых источников либо размещены пользователем в соответствии с договором-офертой сайта. Вы можете сообщить о нарушении.