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