Ld pointer,a ;загрузить в pointer содержимое аккумулятора

Отчет по лабораторной работе № 7

Изучение системы команд микроконтроллеров ST7

по дисциплине

«Микропроцессорные средства систем управления»

Выполнили: Чижов В.И.

Группа: Р-38011

Преподаватель: Мокрецов В.П.

Екатеринбург 2011

ЦЕЛЬ РАБОТЫ

Целью работы является изучение системы команд и способов адресации микроконтроллеров семейства ST7 корпорации STMicroelectronics и применение команд при программировании различных операций, а также изучение подсистемы прерываний и параллельных портов ввода-вывода данных.

ЗАДАНИЕ 1

Таблица 1. Операции, способы адресации, выбранная команда и ее выполнение

Команда Операция /способ адресации Входные / выходные данные
Ld A,#$46 Пересылка данных/ непосредственный Операнд = $46/(A) = $46, N=0, Z=0.
Ld A,$12 Пересылка данных/прямой короткий (A) = ($12), 12 – адрес ячейки ОЗУ
Ld A,[ptr.w] Пересылка данных/косвенный длинный (A) = ((ptr.w)), ptr – указатель на переменную, w – тип (word)
Push X Загрузка в стек/неявный X – регистр
Dec (offset,Y) Декремент ячейки памяти/индексный со смещением offset – смещение, Y - индекс
Dec [ptr] Декремент ячейки памяти/косвенный короткий ptr – указатель на 8-битную переменную
inc (Y) Инкремент ячейки памяти/Индексный (без смещения) Y – указатель на ячейку памяти
cp A,(offset,Y) Сравнение с памятью/индексный короткий offset – смещение, Y - индекс
cp A,#byte Сравнение индексного регистра /непосредственный #byte – некоторое значание
bcp A,(X) Логическое сравнение с ячейкой/индексный X – ячейка ОЗУ
tnz [ptr] Тест ячейки и модификация N, Z/косвенный короткий ptr – указатель на 8-битную переменную

ЗАДАНИЕ 2

Программа должна установить первый разряд числа в ячейке памяти 0110h в 1, сбросить пятый разряд в 0 и инвертировать седьмой разряд. Используйте команды логических операций AND, OR и XOR. Составьте контрольный пример для отладки программы.

Текст программы:

st7/

TITLE "myprog.asm"

MOTOROLA

#include "ST7Lite2.INC"

;*************************************************************

; Объявление переменных в 'ram0' части памяти (ОЗУ)

;*************************************************************

BYTES

segment byte 'ram0'

;------------------------------------------------------------

;************************************************************

; Раздел объявления констант и переменных

;***********************************************************

one ds.b 1

two ds.b 1

three ds.b 1

;*************************************************************

; Объявление переменных в 'r0m' части памяти (ОЗУ)

;*************************************************************

WORDS

segment byte 'rom'

;*************************************************************

; Раздел объявления подпрограмм

;*************************************************************

;*************************************************************

; Основная часть программы

;*************************************************************

main:

RSP

ld a,#$01

ld one,a

ld a,$0110

or a,one ; первый разряд числа устанавливаем в 1

ld $0110,a

;-------------------------------------------------------------

ld a,#$EF

ld two, a

ld a,$0110

and a,two ; сбасываем пятый разряд в 0

ld $0110,a

;------------------------------------------------------------

ld a,#$40

ld three,a

ld a,$0110

xor a,three ; инвертируем седьмой разряд

ld $0110,a

ret

;************************************************************

; Раздел объявления подпрограммы прерывания

;************************************************************

dummy_rt: IRET ; Пустая процедура для возврата

; в основную программу

;************************************************************

; Объявление векторов прерывания

;************************************************************

segment 'vectit'

DC.W dummy_rt ; Address FFE0-FFE1h

SPI_it DC.W dummy_rt ; Address FFE2-FFE3h

lt_RTC1_it DC.W dummy_rt ; Address FFE4-FFE5h

lt_IC_it DC.W dummy_rt ; Address FFE6-FFE7h

at_timerover_it DC.W dummy_rt ; Address FFE8-FFE9h

at_timerOC_it DC.W dummy_rt ; Address FFEA-FFEBh

AVD_it DC.W dummy_rt ; Address FFEC-FFEDh

DC.W dummy_rt ; Address FFEE-FFEFh

lt_RTC2_it DC.W dummy_rt ; Address FFF0-FFF1h

ext3_it DC.W dummy_rt ; Address FFF2-FFF3h

ext2_it DC.W dummy_rt ; Address FFF4-FFF5h

ext1_it DC.W dummy_rt ; Address FFF6-FFF7h

ext0_it DC.W dummy_rt ; Address FFF8-FFF9h

AWU_it DC.W dummy_rt ; Address FFFA-FFFBh

softit DC.W dummy_rt ; Address FFFC-FFFDh

reset DC.W main ; Address FFFE-FFFFh

END

0110h
До выполнения программы После выполнения программы
7 2 2 3
1 110 010 100 011

ЗАДАНИЕ 3 (12 вариант)

Требуется выполнить логическую функцию четырех переменных F(x0,x1,x2,x3), принимающую значение «истина» на термах 00h, 02h, 03h, 04h, 05h, 06h. Входные переменные вводятся из порта PА или порта PВ. Для вызова программы выполнения логической функции используйте внешнее прерывание, вызываемое сигналом на линии порта. Задачу предлагается выполнить двумя способами.

Способ 1.

В памяти задается таблица значений функции для всех 16 значений переменных. Если по текущему значению аргумента обратиться к ячейке таблицы, то сразу получим значение функции. Этот способ очень быстрый, но требует хранить в памяти таблицу значений функции

Входная переменная input находится в ячейке памяти 80h. Указатель на начало таблицы терм pointer находится в ячейке 81h. Таблица термы размещена по адресам 90h – 9Fh. Значение функции записывается в ячейку памяти 85h.

Текст программы:

st7/

TITLE "myprog.asm"

MOTOROLA

#include "ST7Lite2.INC"

;*************************************************************

; Объявление переменных в 'ram0' части памяти (ОЗУ)

;*************************************************************

BYTES

segment byte 'ram0'

;------------------------------------------------------------

;************************************************************

; Раздел объявления констант и переменных

;***********************************************************

Input ds.b 1

Pointer ds.b 1

;*************************************************************

; Объявление переменных в 'r0m' части памяти (ОЗУ)

;*************************************************************

WORDS

segment byte 'rom'

;*************************************************************

; Раздел объявления подпрограмм

;*************************************************************

term_loading_prog:

ld a,#$00 ; загрузить в аккумулятор 00h

ld $0110,a ; загрузить содержимое аккумулятора в ОЗУ

ld a,#$02 ; загрузить в аккумулятор 02h

ld $0111,a ; загрузить содержимое аккумулятора в ОЗУ

ld a,#$03 ; загрузить в аккумулятор 03h

ld $0112,a ; загрузить содержимое аккумулятора в ОЗУ

ld a,#$04 ; загрузить в аккумулятор 04h

ld $0113,a ; загрузить содержимое аккумулятора в ОЗУ

ld a,#$05 ; загрузить в аккумулятор 05h

ld $0114,a ; загрузить содержимое аккумулятора в ОЗУ

ld a,#$06 ; загрузить в аккумулятор 06h

ld $0115,a ; загрузить содержимое аккумулятора в ОЗУ

;*************************************************************

loading_main:

ld a,#$03 ; загрузить 03h в аккумулятор (исследуемая переменная)

Ld input, a; загрузить содержимое аккумулятора в input

ld a, #$05; установить значение счетчика

ld pointer,a ;загрузить в pointer содержимое аккумулятора

Ret

; Основная часть программы

;*************************************************************

main:

RSP

Наши рекомендации