48274 (Программное обеспечение встроенных систем управления на базе однокристальных микропроцессоров (МП)), страница 2
Описание файла
Документ из архива "Программное обеспечение встроенных систем управления на базе однокристальных микропроцессоров (МП)", который расположен в категории "". Всё это находится в предмете "информатика" из 1 семестр, которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "контрольные работы и аттестации", в предмете "информатика, программирование" в общих файлах.
Онлайн просмотр документа "48274"
Текст 2 страницы из документа "48274"
«ВЫПОЛНЯТЬ НЕПРЕРЫВНО» . . . . . «КОНЕЦ»
В этой конструкции набор операций, расположенный между ВЫПОЛНЯТЬ НЕПРЕРЫВНО и КОНЕЦ, должен повториться без конца.
В этом случае, однажды начавшись, операция проверки значений входов будет повторяться столько времени, сколько система остается в действии.
Из вышеприведенного примера можно сделать следующие выводы:
микрокомпьютер является последовательным устройством и в каждый момент времени выполняет только одну операцию;
во многих случаях, чтобы изменить функциональное поведение микрокомпьютерной системы, необходимо изменить лишь некоторые операции в описании программы на языке проектирования;
МКП манипулирует только цифровыми данными. Если в системе имеются аналоговые сигналы, для преобразования входных сигналов в цифровую форму необходим АЦП, а для преобразования выходных сигналов в аналоговую форму – ЦАП.
3 Составление схем алгоритмов
Реализация любой функции с помощью микрокомпьютера всегда требует проектирования необходимой последовательности действий, получившей название алгоритма. Наиболее удобная и наглядная форма представления алгоритма решения задачи – графическая, в виде схемы. Она состоит из упорядоченной совокупности условных геометрических фигур, несущих информацию об определенном характере операций, накладываемом условии, принятых обозначениях. Основные формы, которые согласно действующим стандартам представлены в приложении А.
Рассмотрим в качестве примера задачу формирования двух наборов целых чисел, лежащих в диапазоне от -5 до +5. Путем сортировки организуется два набора, один из которых включает в себя положительные числа, а другой – отрицательные.
Схема алгоритма решения этой задачи показана на рис. 1.5.
Рисунок 1.5 – Схема алгоритма с ветвлением
4 Подпрограммы
Подпрограмма – это часть программы, используемая обычно несколько раз в процессе выполнения программы. Однако текст подпрограммы записывается программистом только один раз. Когда же программисту необходимо воспользоваться подпрограммой, достаточно указать в программе соответствующую команду вызова (обращения к подпрограмме), адресующуюся к области памяти, в которой расположена подпрограмма. С этой целью в языке программирования для большинства МП существует команда CALL (вызвать). В этой команде после кода операции (CALL) указывается имя подпрограммы, которое присвоено физическому адресу в области памяти, где расположена данная подпрограмма.
Кроме того, по команде выполняются действия, необходимые для возвращения к основной программе после выполнения подпрограммы:
а) в счетчике команд фиксируется адрес команды в основной программе, которая следует за командой вызова;
б) содержимое счетчика команд (адрес возврата) загружается в стек, содержимое указателя стека модифицируется;
в) в счетчик команд загружается адрес, задаваемый командой вызова. После этого может начаться исполнение подпрограммы.
Последней выполняемой командой подпрограммы является команда RET (return – возврат). По этой команде выполняется возврат к основной программе, прерванной командой вызова. Команда возврата содержит только код операции. По этой команде происходит следующее: а) счетчик команд получает из стека адрес команды в основной программе, следующей за командой вызова; б) содержимое указателя стека соответственно модифицируется.
Основное достоинство подпрограмм заключается в том, что благодаря возможности их многократного использования, сокращается текст программы в целом. Вместо того, чтобы по мере необходимости повторять запись одного и того же фрагмента программы, достаточно оформить запись фрагмента как подпрограмму и обращаться к ней столько раз, сколько требуется в соответствии с алгоритмом решения задачи.
Из одной программы можно производить обращение к нескольким подпрограммам.
Одна подпрограмма может обращаться к другой. Такое построение подпрограмм называется ВЛОЖЕНИЕМ.
Глубина допустимого уровня вложения подпрограмм зависит от типа вычислительной машины и используемого языка программирования. Большинство современных МП и языков программирования допускает многоуровневое вложение. Как следует из вышеизложенного, использование подпрограмм – не слишком обременительная работа для программиста.
5 Программирование в машинных кодах
Реализация требуемого алгоритма вычисления достигается путем подготовки, отладки и записи в ПЗУ соответствующей программы. МП способен воспринимать лишь программы, состоящие из последовательности команд, представленных двоичными кодами. Программирование непосредственно в машинных кодах требует постоянного оперирования многоразрядными двоичными числами, представляющими как коды команд, так и коды операндов.
В качестве примера линейной программы в машинных двоичных кодах рассмотрим программу сложения двух чисел, одно из которых 01100100 находится в регистре общего назначения (РОН) В, а второе – 00010111 расположено в ячейке памяти с адресом 0000 0000 1000 1111. Напомним, что рассматриваемый МП имеет шестнадцатиразрядную шину адреса. Фрагмент программы приведен в табл. 1.1.
Таблица 1.1 – Программа сложения в машинных кодах
Адрес памяти | Мнемокод |
0000 0000 0000 0100 | 01111000 |
0000 0000 0000 0101 | 00100001 |
0000 0000 0000 0110 | 10001111 |
0000 0000 0000 0111 | 00000000 |
0000 0000 0000 1000 | 10000110 |
0000 0000 0000 1001 | 01110110 |
. . . . . . . . . . . . . . . . . | . . . . . . . . . |
0000 0000 0000 0100 | 00010111 |
Таблица 1.2 – Программа сложения в шестнадцатеричных кодах
Мнемокод | Адрес | Н - код | Vt |
MOV A,B | 0004 | 78 | 5 |
LXI H | 0005 | 21 | 16 |
0006 | 8F | ||
0007 | 00 | ||
ADD M | 0008 | 86 | 7 |
HLT | 0009 | 76 | 7 |
. . . . . . . . . | . . . . . . | . . . . . . | . . . . |
008F | 17 |
Первая команда – пересылка содержимого регистра В в аккумулятор – является однобайтовой, имеет код операции. Код операции расположен в ПЗУ по адресу 0000 0000 0000 0100, который для данной программы является начальным.
Следующая команда – трехбайтовая, имеет код операции 00100001, представляющий первый байт команды. Второй и третий байты, расположенные в очередных ячейках ПЗУ, содержат соответственно младшую и старшую части адреса 1000 1111 0000 0000, передаваемые по этой команде в регистровую пару H и L.
Микропроцессор при выполнении программы последовательно обращается к ячейкам памяти и выполняет поочередно все команды. Напомним, что коды операций и операнды хранятся в памяти в одинаковом виде и их различение осуществляется микропрограммами выполнения команд, заложенными в МП. Последняя команда имеет код 01110110 и является командой останова (HLT).
В результате выполнения программы в аккумуляторе окажется записанным число 01111011.
Даже рассмотрение такой простейшей программы показывает, насколько неудобным и недостаточно наглядным является представление чисел в машинных двоичных кодах. Поэтому принято запись машинных кодов производить в шестнадцатеричной системе.
В табл. 1.2 приведен фрагмент той же самой программы, записанной в шестнадцатеричных кодах. Рядом с кодом операции показаны его мнемоническое изображение и наименования операндов, принятые в системе команд данного МП. Например, шестнадцатеричный код команды 78, имеющей мнемоническое обозначение MOV A,B, соответствует операции пересылки содержимого регистра В в аккумулятор А. В табл. 1.2 также указано число тактов Vt, необходимое для выполнения каждой команды. Для выполнения всей программы требуется 35 машинных тактов.
Практически удобнее программировать непосредственно в мнемокодах, а затем представлять шестнадцатеричные коды адресов и операндов, получающиеся после распределения памяти.
6 Программирование в мнемокодах
Наиболее удобным методом написания программ является использование мнемонических кодов, состоящих из аббревиатуры полного названия инструкции. В этом случае мнемокод отражает содержательный смысл выполняемой операции.
Пример 1.1. Организация счетчиков циклов. Схема алгоритма счета показана на рис. 1.6, а фрагмент программы приведен в табл. 1.3.
Рисунок 1.6 – Схема алгоритма счета циклов
Счетчиком служит один из РОН – регистр В. По команде MVI B, N в него заносится число N, определяющее количество повторяемых циклов. В данной программе N=16. Для определенности принято, что участок программы, который необходимо повторить 16 раз, начинается командой логической операции «ИСКЛЮЧАЮЩЕЕ ИЛИ» XRA A, расположенной по адресу 1002, и заканчивается командой пересылки из аккумулятора в регистр D: MOV D, A, расположенный по адресу 10А1. После каждого выполнения этого участка программы содержимое счетчика (регистра В) уменьшается на единицу посредством команды DCR B (адрес 10А2). До тех пор, пока содержимое регистра В отлично от нуля, признак Z имеет нулевое значение и программа переходит к выполнению команды, адрес 1002 который содержится во втором и третьем байтах команды JNZ (переход по отсутствию нуля). Указанный адрес отмечен в программе меткой М1, т.е. метка М1 является мнемоническим обозначением адреса 1002.
Таблица 1.3 – Программа счета циклов
Метка | Мнемокод | Операнд | Адрес | Н - код | Комментарий | Vt |
. . . . . . . | . . . . . . . | . . . . . . | . . . . . . | . . . . . . . . . . | . . | |
MVI | B, 16 | 1000 | 06 | Установка счётчика | 7 | |
1001 | 10 | N=16 в (B) | ||||
M1: | XRA | A | 1002 | AF | Обнуление признака переноса | 4 |
. . . . . . . | . . . . . . . | . . . . . . | . . . . . . | . . . . . . . . . . | . . | |
MOV | D, A | 10A1 | 57 | Пересылка содержимого А в регистр D (D:=A) | 5 | |
DCR | B | 10A2 | 05 | Уменьшение содержимого счётчика на 1 | 5 | |
JNZ | M1 | 10A3 | C2 | Переход по условию (N) 0 к ячейке памяти с адресом 1002 | 10 | |
10A4 | 02 | |||||
10A5 | 10 | |||||
. . . . . . . | . . . . . . . | . . . . . . | . . . . . . | . . . . . . . . . . | . . |
Если в результате очередного вычитания единицы содержимое регистра В окажется равным нулю (Z=1), то программа перейдет к выполнению команды, расположенной за JNZ. Происходит выход из циклического участка программы. Поскольку регистр В имеет восемь двоичных разрядов, рассмотренная структура программы позволяет организовать счетчик от 1 до 255 циклов. При необходимости получения большого числа циклов для организации счетчика следует использовать регистровые пары (например, В и С). Загрузка такой пары осуществляется с помощью команды LXI B, а вместо команды DCR В необходимо использовать команду DCX B (декремент регистровой пары).
Пример 1.2. Определение модуля числа. При исследовании сигналов часто приходится оценивать погрешность измерения по модулю. Рассмотрим программу определения модуля числа, содержащую условный переход. В связи с тем, что отрицательные числа представляются в дополнительных кодах, при определении модуля нельзя ограничиться только отбрасыванием знака числа, информация о котором заключена в старшем бите. Если число положительное, то его надо умножить на -1. Знак можно определить, используя операцию маскирования или засылку старшего бита в триггер переноса с последующим его анализом. В данном случае эти операции нежелательны, так как сопровождаются изменением содержимого аккумулятора. Целесообразно применить команду логического сложения содержимого аккумулятора с самим собой. При этом содержимое аккумулятора не меняется, а флаги устанавливаются в соответствующие состояния. Условный переход выполняется по содержимому триггера знака S.
На рис. 1.7 изображена схема алгоритма определения модуля числа, находящегося в регистре Е. Программа работает следующим образом. Число из регистра Е пересылается в аккумулятор. В результате выполнения операции логического сложения аккумулятора с самим собой в триггер знака записывается старший бит числа. С помощью команды условного перехода осуществляется ветвление программы. Если S=0 (положительное число) не выполняется, то производится изменение знака числа и модуль числа из аккумулятора пересылается в регистр Е. Знак числа изменяется применением операции дополнения, заключающейся в инвертировании всех разрядов числа (команда CMA) c последующим прибавлением единицы к младшему разряду (команда INR A). Если условие S=0 выполняется (число положительное), то по условному переходу JM M2 три последние команды обходятся, содержимое регистра Е не меняется, а выполнение программы продолжается с адреса 01F8, соответствующего метке М2. Программа в машинных кодах с комментариями приведена в табл. 1.1.
Рисунок 1.7 – Схема алгоритма определения модуля числа