Адреса I8255A в адресном пространстве устройств ввода-вывода:
§ 1Fh – регистр управляющего слова (РУС);
§ 1Ch – порт А;
§ 1Dh– порт B;
§ 1Eh – порт C.
Теперь приступим непосредственно к программированию. Запрограммируем систему приема/передачи 100 байт информации между шиной данных и абстрактным устройством OBJ.
Подключаем к контроллеру устройство OBJ (см рис.3). Объект имеет один элемент индикации, который отображает включённое или выключенное состояние линии «Управления».
Кнопка «Пуск» соответствует запуску системы, т.е. при нажатии кнопки на линии «Готовности» появляется высокий уровень, по которому система начинает функционировать.
При нажатии кнопки «Стоп» на линии «Готовности» появляется низкий уровень и система выключается.
Рис 3. Функциональная схема приема/передачи 100 байт информации.
Алгоритм управления:
1. Инициализация I8255;
2. Ожидание сигнала PC(6) «Готовность»;
3. По готовности выдача байта на канал РВ;
4. Формирование сигнала строба OBF для канала РВ;
5. Ожидание сигнала подтверждения ACK;
6. Сброс сигнала строба OBF;
7. Проверка: если количество переданных байт равно 100, то переход к пункту 8, иначе – к пункту 3
8. Ожидание сигнала строба STB для канала РА;
9. Сброс сигнала подтверждения IBF для канала РА;
10. Считывание байта с канала РА;
11. Выдача сигнала подтверждения IBF;
12. Проверка: если количество принятых байт равно 100, то переход к пункту 13,
иначе – к пункту 8
13.
Проверка, не
выключена ли система: если «Готовность» отсутствует
(PC(6) = 0) , т.е. система выключена, то переход к пункту 14,
иначе – к
пункту 3;
14. Останов.
Код программы на ассемблере:
;SI – адрес передаваемого байта
;DI - aдрес памяти, куда помещается полученный байт
start :
MOV AL, 98h ;инциализация - управляющее слово 10011000
;(канал PA настроили на прием, PB на передачу)
OUT 1Fh, AL ;записываем в порт 1Fh (регистр управляющего слова)
a1 :
IN AL, 1Eh ;чтение из порта 1Eh (канал PC)
TEST AL, 40h ;проверяем готовность PC(6)=1
JZ AL
r :
MOV CX, 100 ;програмный счётчик переданых байт
@op:
MOV AL, [SI] ;записываем байт в аккумулятор
INC SI ;переходим к следующему
OUT 1Dh, AL ;выводим байт в порт 1Dh (канал PB)
MOV AL, 03h ;PC(1)=1 (формируем строб OBF)
OUT 1Fh, AL ;записываем в РУС
a2 :
IN AL, 1Eh ;чтение из канала PC
TEST AL, 20h ;ожидаем PC(5)=1 (сигнал подтверждения ACK)
JZ a2
MOV AL, 02h ;сброс строба OBF
OUT 1Fh, AL ;записываем в РУС
LOOP @op ;цикл, ждем передачи 100 байт
MOV CX, 100 ;програмный счётчик принятых байт
@ip:
a3 :
IN AL, 1Eh ;чтение из канала PC
TEST AL, 10h ;ожидаем PC(4)=1 (сигнал строба STB)
JZ a3
MOV AL, 00h ;PC(0)=0 (сброс сигнала подтверждения IBF)
OUT 1Fh, AL ;записываем в РУС
IN AL, 1Ch ;чтение из порта 1Ch (канал PA)
MOV [DI], AL ;записываем байт по адресу DI
INC DI
MOV AL, 01h ;PC(0)=1 (выдаем сигнал подтверждения IBF)
OUT 1Fh, AL ;записываем в РУС
LOOP @ip ;цикл, ждем приема 100 байт
IN AL, 1Eh ;чтение из канала PC
TEST AL, 40h ;проверяем PC(6)=0 (не выключена ли система)
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.