3334 МИКРОПРОЦЕССОРНЫЕ СИСТЕМЫ СБОРА И ОБРАБОТКИ ДАННЫХ

Лабораторная работа № 1

 

Часть 1. Изучение работы симулятора AD2500

 

Введение

 

Симулятор - это программа, которая моделирует работу микроконтроллера на компьютере. Она позволяет отлаживать программы, написанные на языке ассемблер для конкретного семейства микроконтроллеров. Отладка программы заключается в проверке правильности ее написания, задании начальных условий, пошаговом выполнении программы с отображением текущего состояния регистров, портов, таймеров-счетчиков, резидентной и внешней оперативной памяти микроконтроллера, памяти программ на экране компьютера. По текущему состоянию этих ресурсов микроконтроллера можно судить о соответствии хода выполнения программы замыслу  разработчика. В симулятор загружается текстовый файл на языке ассемблер, который затем компилируется, запускается на выполнение и отлаживается. Результатом работы является файл с расширением .obj, который в дальнейшем используется для программирования резидентного ПЗУ микроконтроллера или микросхемы памяти.

 

Порядок работы с симулятором

 

  1. Запуск симулятора

 

Для запуска симулятора следует найти в каталоге файл e8031.exe, навести на него курсор и нажать клавишу Enter. На экране монитора появится рабочее окно симулятора (рис.1).

 

 

 

Рис. 1. Рабочее окно после запуска симулятора

 

2. Создание или редактирование файла на ассемблере

 

С помощью стрелок клавиатуры навести курсор на опцию меню Edit (редактирование и компиляция текста программы) и нажать клавишу Enter. В результате в окне появится дополнительное меню Редактирование и компиляция (рис.2). В нем с помощью стрелок необходимо выбрать опцию Файл и набрать

 

 

 

Рис.2. Рабочее окно симулятора с дополнительным окном "Редактирование и

компиляция"

 

имя вновь создаваемого или ранее созданного файла с расширением .asm, например, petrov.asm (имя любое, но не более 8 символов). Затем с помощью клавиши Tab или горизонтальных стрелок выбрать команду Edit и нажать клавишу Enter. При этом произойдет переход в окно текстового редактора, путь к исполняемому файлу которого указан в опции Редактор. В данном случае это С:\nc\ne2.exe. Если ваш файл создается вновь, то в окне редактора появится сообщение:

The file "petrov.asm" was not found

Create as a new file?

[ Create ]      Сancel

 

 

 

 

 

Выберите с помощью мыши опцию Create или просто нажмите клавишу Enter при этом произойдет переход в режим редактирования. Далее с помощью клавиатуры набирается текст программы на ассемблере. Если файл ранее существовал и путь к нему был указан правильно, то в окне редактора появится текст файла. В качестве примера наберите следующий текст программы (при наборе текста программы необходимо помнить, что последовательность символов  в первой колонке строки компилятор воспринимает как метку, поэтому для записи команды предварительно следует сделать один или несколько пробелов).

 

mov  R0,#20  ;загрузка в регистр R0 десятичного числа 20

mov  45h,#18 ;загрузка в ячейку резидентной памяти данных

;с шестнадцатеричным адресом 45h десятичного числа 18

mov  R7,#4    ;в регистр R7 загружается десятичное число 4

mov  A,45h   ;в аккумулятор записывается число, хранящееся в ячейке с

;адресом 45h

mov  B,R7     ;в регистр B переписывается содержимое регистра R7

div  AB          ;происходит деление содержимого регистра A на содержимое ре-

;гистра B, результат деления пойдёт в аккумулятор, а остаток –

;в регистр B

mov  @R0,A  ;в ячейку, адрес которой указан в регистре R0, заносится

;содержимое аккумулятора (частное)

mov  P3,B      ;в порт P3 заносится содержимое регистра B (остаток)

 

После того как программа написана, ее нужно сохранить и выйти из редактора. Для сохранения текста программы выберите мышью опцию File и щелкните левой кнопкой мыши. В открывшемся окне выберите мышью опцию Save As (если ранее файл существовал, то выберите опцию Save для сохранения под текущим именем) и щелкните левой кнопкой мыши. В открывшемся меню удалите символы *.* клавишей Backspace и наберите латинскими буквами имя файла с расширением .asm, например petrov.asm, и щелкните мышью по опции OK. При этом произойдет сохранение файла в текущем каталоге. Для выхода из редактора и перехода в симулятор щелкните мышью по опции File, в открывшемся меню выберите опцию eXit и щелкните левой кнопкой мыши. Произойдет возврат в рабочее окно симулятора. При этом курсор автоматически будет установлен на опцию Assemble. Далее следует нажать клавишу Enter, что приведет к компиляции программы и созданию файлов petrov.obj и petrov.lst. Если компиляция прошла успешно, то в нижней части  окна появится сообщение:

Lines Assembled: M       Assembly errors: 0.,

где M - число строк в программе. Если программа написана с ошибками, то в нижней части окна появится сообщение:

Lines Assembled: M       Assembly errors: N.,

где N - число ошибок. Для просмотра места расположения ошибок необходимо с помощью вертикальной стрелки выбрать команду List и нажать клавишу Enter. Произойдет переход в просмотр файла листинга, например petrov.lst.,  Под строкой, в которой находится ошибка будет выведено сообщение об ошибке. Например, такое:

***** ILLEGAL MNEMONIC *****.

Для выхода из просмотра листинга необходимо нажать клавишу Esc. При этом произойдет  возврат в окно симулятора. Чтобы исправить ошибку, необходимо выбрать стрелками клавиатуры команду Edit и нажать клавишу Enter. Произойдет переход в окно текстового редактора. После исправления ошибки необходимо щелкнуть мышью по опции File, а затем сохранить файл, выбрав опцию Save и щелкнув левой кнопкой мыши. В результате произойдет переход в окно симулятора, где вновь необходимо вертикальными стрелками выбрать команду Assemble и нажать клавишу Enter. После компилирования, если нет ошибок, необходимо стрелками выбрать команду Load и нажать клавишу Enter. Произойдет загрузка файла Petrov.obj в симулятор и переход во второе рабочее окно. Поскольку в этом окне не отображаются ресурсы микроконтроллера, рекомендуется перейти в первое рабочее окно путем нажатия клавиши F6.

 

3. Выполнение программы

 

Для пошагового выполнения программы необходимо с помощью стрелок навести курсор на опцию Step и нажимать клавишу Enter (аналогично действует нажатие клавиши s). Каждое нажатие клавиши приводит к выполнению одной строки программы и перемещению курсора зеленого цвета в левой части окна на  одну строку(комментарии игнорируются). При выполнении программы в рабочем окне отображаются в шестнадцатеричном формате текущие состояния портов, защелок портов, регистров, ячеек памяти данных. Состояния портов и защелок портов одновременно отображаются в двоичном формате, а изменяющиеся значения ячеек памяти данных меняют  цвет символов.

Если необходимо повторить выполнение программы, следует, во-первых, перейти на начало программы и восстановить стандартное начальное состояние регистров. Для этого необходимо стрелками навести курсор на опцию Reset и нажать клавишу Enter (эквивалентом этих двух действий является нажатие клавиши r). Во-вторых, необходимо обнулить ячейки внешней памяти данных, если во время выполнения программы в них заносились данные. Для этого следует навести стрелками курсор на опцию rAm и нажать клавишу Enter. При этом опции в нижней части окна изменятся, и в окне появится изображение содержимого внешней памяти данных. Далее следует нажать клавишу F3. В результате появится сообщение:

 

Заполнение кодом

Диапазон

OK

Код заполнения:  00

Начальный адpес: 0000

Конечный адpес: FF00

 

 

Далее следует нажать клавишу Enter. При этом во все ячейки внешней памяти данных занесется шестнадцатеричный код 00. Затем необходимо нажать клавишу Esc, чтобы перейти в основное меню. В-третьих, необходимо обнулить ячейки резидентной памяти данных, если во время выполнения программы в них заносились данные.   Для этого следует стрелками выбрать опцию Iram и нажать клавишу Enter (эквивалентом этих двух действий является нажатие клавиши i). При этом в окне появится изображение ячеек резидентной памяти данных и регистров микроконтроллера, а также изменятся опции меню. Необходимо нажать клавишу F3, что приведет к появлению сообщения:

Заполнение кодом

Диапазон

OK

Код заполнения:  00

Начальный адpес:  00

Конечный адpес:  7F

 

 

После этого следует нажать клавишу Enter. При этом во все ячейки резидентной памяти данных занесется шестнадцатеричный код 00. Затем необходимо нажать клавишу Esc, чтобы перейти в основное меню. После этого можно запускать программу вновь.

Для пуска программы без пошагового режима следует стрелками выбрать опцию Go и нажать клавишу Enter (эквивалентом этих двух действий является нажатие клавиши g). Появится сообщение:

Адpес пуска пpогpаммы

0000

 

Затем следует нажать клавишу Enter, после чего одновременно с началом выполнения программы произойдет переход в окно следующего вида (рис.3). В

 

Рис.3. Окно "Выполнение программы"

 

 

этом окне изображены выводы портов (P0x, P1x, P2x, P3x) и защелки портов (P0, P1, P2, P3), состояния которых  можно изменять, перемещая курсор с помощью стрелок. Функциональными клавишами клавиатуры F1 - F5 можно моделировать сигналы, поступающие на входы таймеров-счетчиков и входы прерываний. Клавишей пробела можно изменять состояние входа приемника последовательного канала передачи данных Р3x.0. Для остановки выполнения программы необходимо нажать клавишу Enter, при этом произойдет возврат в рабочее окно. Поскольку симулятор не прекращает прохождение программы после достижения директивы End (выполняются пустые операторы nop), то, если не останавливать выполнение программы, через некоторое количество шагов после достижения строки с директивой End, программа остановится самостоятельно и произойдет возврат в рабочее окно.


Ещё одним удобным способом выполнения программы является её запуск на выполнение заданного числа команд. Для этого следует стрелками выбрать опцию Nstep и нажать клавишу Enter (эквивалентом этих двух действий является нажатие клавиши n). В результате появится сообщение:

Вместо шестнадцатеричного числа FFFF можно набрать в шестнадцатеричном коде нужное число шагов программы (если заранее число шагов не известно, то следует оставить число FFFF) и нажать клавишу Enter. На экране появится рабочее окно (рис. 1), в низу которого будут находиться изображения управляющих клавиш F1F6, и ход выполнения программы в виде зеленого курсора, перемещающегося по строкам программы. Нажимая на клавиатуре на клавиши F1F6 можно моделировать внешние воздействия на микроконтроллер аналогично тому, как это делается при выполнении опции Go. Однако в данном случае на экране отображаются все регистры микроконтроллера, оперативная память и код программы, что более удобно для отладки программы. Для остановки выполнения программы следует нажать клавишу Enter. Если заданное количество команд выполнится, то произойдет возврат в рабочее окно (исчезнут изображения клавиш F1F6).

 

4. Работа со следующей программой

 

Для работы со следующей программой необходимо выполнить пункты описания работы с симулятором, начиная со второго. Кроме этого, необходимо восстановить начальное состояние регистров командой Reset и обнулить ячейки памяти данных в соответствии с п. 3.

 

5. Выход из симулятора

 

Для выхода из симулятора необходимо, находясь в рабочем окне, нажать клавишу Esc. При этом появится сообщение:

Конец pаботы

DOS Shell

 

Курсор зеленого цвета будет стоять на опции Конец работы. Далее следует нажать клавишу Enter. При этом произойдет возврат в DOS. Созданные вами файлы с расширениями .asm, .obj, .lst будут находиться в текущем каталоге.

 

6. Некоторые дополнительные возможности симулятора

 

Для коррекции текста программы без выхода в редактор и без изменения в файле с расширением .asm следует нажать клавишу Tab. Курсор окажется в части окна под названием ДисАссемблер. Затем следует подвести с помощью стрелок курсор к нужной строке программы и произвести коррекцию. При этом корректируемая часть окрасится в черный цвет. Далее следует нажать клавишу Enter. Для выхода из режима коррекции необходимо нажать клавишу Esc.

При отладке программы возникает потребность в ее выполнении до определенного шага. Для этого следует нажать клавишу Tab, а затем стрелками установить курсор на строку, до которой необходимо выполнить программу. Далее необходимо нажать клавишу F4. Программа выполнится до курсора, о чем можно судить по перемещению маркера зеленого цвета. Выход из этого режима происходит при нажатии клавиши Esc.

Удобным средством остановки выполнения программы в определенных местах является установка рабочих точек. Для установки рабочей точки необходимо нажать клавишу Tab, а затем стрелками установить курсор на строку, где требуется остановить программу, и нажать клавишу Insert. В начале строки появится знак контрольной точки. Контрольных точек можно установить несколько. Для удаления контрольной точки нужно проделать то же, что для ее установки. Для удаления сразу всех контрольных точек необходимо нажать клавиши Tab и F5, а затем Esc.

В случае, когда пользователю для выполнения программы требуется установить нестандартные начальные значения портов, защелок, регистров, ячеек памяти данных, необходимо нажать клавишу Tab дважды. После этого курсор перейдет в часть рабочего окна Внутренние ресурсы ОЭВМ. Далее следует подвести курсор к нужному порту, защелке, регистру, ячейке памяти и установить требуемое значение в шестнадцатеричном формате. Для портов и защелок состояние дублируется в двоичном формате, расположенном справа от шестнадцатеричного числа. При коррекции состояния регистра появляется изображение битового пространства (представление состояния регистра в двоичном коде), что позволяет контролировать правильность установки бит. Имеется также возможность установки отдельных бит регистров. Она реализуется следующим образом. Когда установлено изображение битового пространства, следует нажать клавишу F2. Далее с помощью стрелок следует установить биты в требуемое состояние и нажать клавишу Enter. Шестнадцатеричное значение регистра установится при этом автоматически. Выход из режима установки происходит при нажатии клавиши Esc.

В симуляторе имеется возможность изменить частоту тактового генератора микроконтроллера. Для этого следует выбрать стрелками опцию Mode и нажать клавишу Enter (эквивалентом этим двум действиям является нажатие клавиши M). В открывшемся окне стрелками необходимо выбрать опцию Частота, при этом откроется окно с текущим значением частоты. С помощью стрелки необходимо перейти в это окно и установить требуемую частоту в герцах. Далее следует нажать клавишу Enter, а для выхода в главное окно дважды нажать клавишу Esc.

В симуляторе имеется возможность смены программно-логической модели микроконтроллера в рамках семейства MCS-51 и изменения объема памяти данных и памяти программ. Для этого следует выбрать опцию Mode и нажать клавишу Enter. В открывшемся окне стрелками выбрать из списка нужную модель и нажать клавишу Enter. При этом в выбранной строке появится галочка. Для выхода в рабочее окно следует нажать клавишу Esc.

 

Часть 2. Изучение команд передачи данных

 

Целью данной части работы является изучение способов передачи данных с применением различных способов адресации. В табл. 1 приведены команды передачи данных, а в табл. 2 - расшифровка условных обозначений, используемых в табл. 1.

Группа команд операций передачи данных содержит команды MOV (передача данных между регистрами и внутренней памятью данных, иначе называемой резидентной памятью данных, сокращённо РПД), MOVC (между памятью программ, сокращённо ПП, и аккумулятором), MOVX (между внешней памятью данных, сокращённо ВПД, и аккумулятором). Команда MOV использует четыре способа адресации: регистровый (A, Rn, DPTR), прямой (ad), косвенный (@Ri) и непосредственный (#d, #d16). Для указания приёмника данных используются три способа адресации (кроме непосредственного), для указания источника данных - все четыре.

При выполнении команды MOVC считывания данных из памяти программ используются два способа адресации: по базе DPTR и относительный. В обоих случаях смещение (целое число без знака) хранится в аккумуляторе, приемником данных также служит аккумулятор. Команда дает возможность быстрого использования таблиц массивов данных, хранящихся в постоянной памяти.

Для обращения к внешней памяти данных (ВПД) может использоваться только команда MOVX. Обмен осуществляется между аккумулятором и ячейкой ВПД. Ячейка ВПД может быть адресована косвенно через 16-разрядный указатель адреса DPTR и странично косвенно через 8-разрядные указатели адреса R0, R1 текущего банка регистров. В последнем случае указателем страниц (регистром страниц) служит порт вывода старшего байта адреса Р2.

Таблица 1

 

Наименование команды

 

Мнемоника

Содержание команды

Пересылка

в

аккумулятор

из регистра (n=0…7)

MOV A,Rn

(A)¬(Rn)

прямоадресуемого байта

MOV A,ad

(A)¬(ad)

байта из РПД (i=0,1)

MOV A,@Ri

(A)¬((Ri))

Загрузка

в аккумулятор константы

MOV A,#d

(A)¬#d

Пересылка

в регистр

из аккумулятора

MOV Rn,A

(Rn)¬(A)

прямоадресуемого байта

MOV Rn,ad

(Rn)¬(ad)

Загрузка

в регистр константы

MOV Rn,#d

(Rn)¬#d

Пересылка

по

прямому

адресу

из аккумулятора

MOV ad,A

(ad)¬(A)

из регистра

MOV ad,Rn

(ad)¬(Rn)

с прямоадресуемого байта

ORL add,ads

(add)¬(ads)

байта из РПД

ORL ad,@Ri

(as)¬((Ri))

 

с константы

ORL ad,#d

(ad)¬#d

Пересылка

в резидентную память данных

(РПД)

из аккумулятора

MOV @Ri,A

((Ri))¬(A)

прямоадресуемого байта

MOV @Ri,ad

((Ri))¬(ad)

константы

MOV @Ri,#d

((Ri))¬#d

Загрузка

указателя данных

MOV DPTR,#d16

(DPTR)¬#d16

Пересылка

в

аккумулятор

байта из памяти программ (ПП)

MOVC A,@A+DPTR

(A)¬((A)+(DPTR))

байта из памяти программ (ПП)

MOVC A,@A+РС

(РС)¬(PC)+1; (A)¬((a)+(PC))

байта из ВПД

MOVX A,@Ri

(A)¬((Ri))

байта из

внешней памяти данных (ВПД)

MOVX A,@DPTR

(A)¬((DPTR))

Пересылка из

аккумулятора

в ВПД

MOVX @Ri,A

((Ri))¬(A)

 

Окончание таблицы 1

 

Пересылка из

аккумулятора

в ВПД

MOVX @DPTR,A

((DPTR))¬(A)

Загрузка

в стек

PUSH ad

(SP)¬(SP)+1; ((SP))¬(ad)

Извлечение

из стека

POP ad

(ad)¬(SP); (SP)¬(BP)-1

Обмен

с регистром

XCH A,Rn

(A)¨(Rn)

аккумулятора

с прямоадресуемым байтом

XCH A,ad

(A) ¨(ad)

 

с байтом из РПД

XCH A,@Ri

(A) ¨((Ri))

Обмен младшей тетрады аккумулятора

с младшей тетрадой байта РПД

XCHD A,@Ri

(A)3-0¨((Ri))3-0

 

Таблица 2

 

Обозначения

Назначение

Rn

Регистры текущего (выбранного) банка регистров

n

Номер регистра текущего банка

ad

Прямой 8-разрядный адрес ячейки РПД (0-127) или РСН (128-255)

ads

Прямой 8-разрядный адрес операнда - источника данных

add

Прямой 8-разрядный адрес операнда - приемника данных

ad16

16-разрядный адрес

ad11

11-разрядный адрес

bit

Прямой 8-разрядный адрес бита в РПД и РСН

rel

8-разрядный байт смещения (целое со знаком)

@Ri

Косвенно адресуемая 8-разрядная ячейка РПД

#d

8-разрядный непосредственный операнд

#d16

16-разрядный непосредственный операнд

(X)

Содержимое элемента X

((X))

Содержимое по адресу, хранящемуся в элементе X

 

Команды PUSH и POP, использующие только прямой способ адресации, осуществляют передачу данных между стеком и РПД, РОН, РСН.

Команды ХСН и XCHD обеспечивают (в отличие от других команд односторонней передачи данных) двусторонний обмен байтами (ХСН) между аккумулятором в РПД или двусторонний обмен полубайтами аккумулятора и ячейки РПД (XCHD).

Составление программ на языке ассемблер имеет свои правила. Условно можно представить, что текст программы состоит из четырех столбцов, разделенных одним или несколькими пробелами:

 

Метка

Мнемокод

Операнд

Комментарий

 

Метка связывается со строкой, на которой стоит. Метки необходимы для осуществления условного или безусловного перехода на нужную строку. Метка может состоять из одного или нескольких (до шести) символов и содержать в себе буквы или цифры, но не должна содержать знаков препинания и пробелов и начинаться с буквы. Любая метка должна заканчиваться двоеточием и стоять первой в строке. Например, metka: или m1:. Если в метке нет необходимости, то в начале строки следует сделать один или несколько пробелов.

В поле "Мнемокод" стоит команда.

В поле "Операнд" записывается операнд. Операндом могут быть число, адрес ячейки памяти, имя регистра, порта.

Поле "Комментарий" содержит текст, который поясняет то, что выполняет данная команда. Комментарий начинается со знака ";" (точка с запятой). Если текст комментария не помещается на одной строке, то на новой строке он должен начинаться со знака ";".

Кроме команд, в ассемблере используются директивы (указания) компилятору, которые определяют порядок ассемблирования программы. Одной из часто употребляемых директив является директива EQU, которая осуществляет присвоение символической переменной (состоящей из одного или нескольких символов) числового значения. Например, директива  X EQU 10 указывает компилятору при проходе текста программы везде, где встречается имя X, заменить его в объектном коде программы на число 10. Если Х - не первый символ строки, то директива запишется следующим образом: X: EQU 10. Другой часто употребляемой директивой является директива ORG. Например, ORG 001bh. Она указывает компилятору, что следующей должна выполняться команда с адресом 001b. Директива позволяет обходить адреса команд, зарезервированные, например, под подпрограммы обработки прерываний. Директива REG позволяет пользователю присваивать имена регистров, ячеек памяти данных и бит. Например, запись HUND: REG 40h означает, что при обращении к имени HUND будет обращение к ячейке внутренней памяти данных с адресом 40h.  Теперь для того чтобы переслать данные из аккумулятора в эту ячейку, можно выполнить команду mov HUND, A. Например, биту буфера порта Р0.6 может быть присвоено имя SCL. После этого для установки бита P0.6 в 0 может быть использована команда clr SCL.

 

Задание

 

1. Составить программу по пересылке однобайтового числа в аккумулятор, порт, регистр r1, в ячейку внутренней и внешней памяти по адресу 12h.

2. Составить программу по пересылке 10 данных из внутренней памяти данных, начиная с адреса 01h, во внешнюю, начиная с адреса 50h. В программе необходимо предусмотреть выбор рабочего банка регистров с помощью двух команд установки или очистки бит. Например, для установки третьего банка нужны команды setb rs1 и clr rs0. Для организации цикла рекомендуется использовать команды inc (увеличениe содержимого регистра на 1, например, inc r1), djnz (переход на метку, если содержимое регистра не равно нулю с одновременным уменьшением его содержимого на 1, например: djnz r2, metka). Перед выполнением программы с помощью клавиши Tab и стрелок клавиатуры занести во внутреннюю память данных десять чисел.

 

Оформление программы

 

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

В начале текста программы указываются заголовок, поясняющий её назначение, фамилия автора и дата создания. Затем идёт определение констант, где им присваиваются имена и значения,  указываются имена переменных и адреса ячеек памяти данных, где они будут размещаться, присваиваются имена регистрам и битам. Далее идёт текст основной части программы с комментариями, поясняющими назначение отдельных команд или блоков команд.  Если в тексте программы имеются подпрограммы, то перед началом подпрограммы вставляется комментарий с названием и назначением подпрограммы. Для выделения в тексте подпрограмму желательно начинать и заканчивать строками, содержащими звёздочки или другие знаки. Любой текст в программе, за исключением команд и директив, должен начинаться со знака ";", то есть оформляться как комментарий.

 

 

Контрольные вопросы

 

1. Каков порядок отладки программы с помощью симулятора AD2500?

2. Каким образом привести в исходное состояние память данных и осуществить повторный запуск программы?

3. Как определить места ошибок в программе, обнаруженные при компиляции?

4. С помощью каких команд пересылаются данные во внутреннюю и внешнюю память данных?

5. Для каких целей может быть использовано переключение банка регистров?