
5. Задание по лабораторной работе
Написать систему программ, которая выполняет следующие функции:
1) Первая программа выполняет циклический вызов прерывания типа TYPE. Программа располагается в CSEG, начиная с адреса ADR0. Программа должна состоять из двух частей. Первая часть – инициализация системы, вторая – циклическое взведение соответствующего триггера запроса на прерывание.
2) Вторая программа – обработчик прерывания, должна располагаться в памяти CSEG, начиная с адреса ADRI. Обработчик должен при каждом обращении передавать в порт Р1 очередной код из массива кодов длиной N, расположенный в CSEG, начиная с адреса ADF2.
Вход в систему программ по команде LCALL ADR0, расположенной в CSEG по адресу 0000h.
Таблица 5.1. Варианты заданий.
Номер |
ADR0 |
TYPE |
ADR1 |
ADR2 |
N |
|
614 |
IE0 |
714 |
431 |
E |
|
52F |
TF0 |
62F |
541 |
F |
|
43E |
IE1 |
53E |
621 |
D |
|
34A |
TF1 |
44A |
711 |
C |
|
255 |
RI |
355 |
121 |
B |
|
366 |
TI |
266 |
236 |
A |
|
277 |
IE0 |
177 |
345 |
6 |
|
68A |
TF0 |
78A |
454 |
7 |
|
79D |
IE1 |
69D |
568 |
F |
|
3AF |
TF1 |
5AF |
677 |
E |
|
5BA |
RI |
4BA |
781 |
5 |
|
4C9 |
TI |
3C9 |
231 |
6 |
|
1D8 |
IE0 |
2D8 |
3A1 |
7 |
|
2E4 |
TF0 |
1E4 |
4B2 |
8 |
|
3F5 |
IE1 |
7F5 |
5C2 |
8 |
|
5E6 |
TF1 |
6E6 |
6D2 |
9 |
|
6A1 |
RI |
5A1 |
7E2 |
F |
|
7D3 |
TI |
4D3 |
1F2 |
A |
|
4C8 |
IE0 |
3C8 |
2E2 |
B |
|
36F |
TF0 |
26F |
3D2 |
C |
|
2BE |
IE1 |
4BE |
782 |
D |
|
1CA |
TF1 |
3CA |
232 |
E |
|
4D3 |
RI |
2D3 |
3A2 |
F |
|
3E7 |
TI |
1E7 |
4B2 |
8 |
|
6F3 |
IE0 |
7F3 |
5C2 |
8 |
|
4E5 |
TF0 |
6E5 |
6D2 |
9 |
|
6AD |
IE1 |
5AD |
7E4 |
C |
6. СОДЕРЖАНИЕ ОТЧЕТА:
– краткое описание системы прерываний;
– задание по лабораторной работе;
– текст программы с пояснениями;
– черновик выполнения работы.
7. ФРАГМЕНТЫ ПРОГРАММ
Необходимо написать программную систему со следующими функциями.
Программа 1 инициализирует систему и циклически вызывает прерывание типа IE1 (программный аналог запроса на прерывание по входу ~INTI). Программа должна располагаться в CSEG по адресу 0100Н.
Программа 2 является обработчиком прерывания. При каждом вызове она должна пересылать очередной элемент массива в порт Р1. Массив однобайтных кодов длиной N располагается в CSEG, начиная с адреса ADRD.
Вектор прерываний
0000 |
020100 |
LJMP |
0100 |
0003 |
00 |
NOP |
|
0004 |
00 |
NOP |
|
… |
… |
… |
|
0013 |
020200 |
LJMP |
0200 |
0015 |
00 |
NOP |
|
Программа 1
0100 |
900300 |
MOV |
DPTR, <ADRD> |
; загружаем DPTR |
0103 |
D2AF |
SETB |
IE.7 |
; разрешаем прерывания |
0105 |
D2AA |
SETB |
IE.2 |
; разрешаем прерывание IE1 |
0107 |
00 |
NOP |
|
; пустая команда |
0108 |
D28B |
SETB |
TCON.3 |
; программный запрос на прерывания |
010A |
80FB |
SJMP |
0107 |
; в начало цикла |
Программа 2
0200 |
D2D3 |
SETB |
PSW.3 |
; задаем 3 банк |
0202 |
D2D4 |
SETB |
PSW.4 |
; |
0204 |
B80602 |
CJNE |
R0, <N>, 0209 |
; проверяем счетчик |
0207 |
7800 |
MOV |
R0, #00 |
; обнуляем счетчик |
0209 |
E8 |
MOV |
A, R0 |
|
020A |
93 |
MOVC |
A,@A+DPTR |
; чтение очередного кода |
020B |
F590 |
MOV |
R1, A |
; засылка кода в Р1 |
020D |
08 |
INC |
R0 |
; инкремент счетчика |
020E |
32 |
RET |
I |
; возврат из обработчика |