Разработка микропроцессорной системы на базе микропроцессора M6800, содержащей: 2 кБ ROM памяти, 4 кБ RAM памяти, периферийные БИС M6850 и I-8255, страница 7

Адреса 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 (не выключена ли система)