-
UART на минималках
Не секрет, что для подключения последовательного порта к таким компьютерам как Специалист, Радио-86РК, Микро-80 и т.п. нужно лезть в схему (иногда даже менять ее), выдумывать новые порты и т.д... Но есть вариант проще, думаю, что, еще проще не получится.
Итак. Практически в каждом компьютере есть порт на ВВ55 и им пользуются обычно только в одном режиме, так называемом Mode 0, когда порты настраиваются на запись или чтение, т.е. как регистры или буферы. Но есть еще два режима, которыми практически никто не пользуется - Mode 1 и Mode 2. Они очень похожи в работе, за исключением того, что в Mode 1 порты А и В используются отдельно на ввод или вывод, а порт С - управляющий, а в Mode 2 используется только порт А как двунаправленный, порт В - свободен, часть порта С занята управляющими сигналами. В кратце опишу работу в Mode 2.
В Mode 2 порт А настраивается, как уже сказал, в режим двунаправленной передачи и его выходы находятся в Z-состоянии. Порт В свободен и его можно использовать по своему усмотрению, например в Mode 0 на вывод или ввод. Порт С делится на две части:
РС0-2 - свободны для пользователя;
РС3 - INTR A, прерывание, может быть настроено на запись как во входной так и выходной регистр или их комбинацию;
РС4 - /STB, сигнал по которому происходит запись данных во входной регистр порта А внешним устройством, устанавливает флаг IBF в "1";
РС5 - IBF, флаг наличия данных во входном регистре порта А, устанавливается в "1" в момент записи данных из внешнего устройства в порт А и сбрасывается в момент считывания данных процессором;
РС6 - /ACK, сигнал по которому происходит считывание данных из выходного регистра порта А внешним устройством, сбрасывается флаг OBF в "1";
РС7 - /OBF, флаг наличия данных в выходном регистре порта А, устанавливается в "0" в момент записи данных процессором и сбрасывается в момент чтения данных внешним устройством.
Внешнее устройство контролирует состояние флагов непосредственно на выводах порта С, чтение же флагов и управление прерываниями процессором происходит из внутреннего регистра порта С, где D7- OBF, D6 - INTE1, D5 - /IBF, D4 - INTE2, D3 - INTR A.
Т.о. есть порт, который флагами может показывать наличие или отсутствие новых данных в регистрах порта А. Остается записывать или считывать данные из этого порта и передавать их каким-либо способом на РС. В качестве преобразователя параллельных данных в последовательные использован микроконтроллер Mega8, можно использовать и поменьше - программа занимает около 400 байт. Схема подключения к ВВ55:
https://i.postimg.cc/nCCzqKwV/VV55UART.png
Исходники для Меги:
https://drive.google.com/file/d/1i91...usp=drive_link
Фьюзы: L:0xE4, H:0xD9
Ну и примеры работы (порты ВВ55 занимают адреса от 010Н до 013Н):
Вывод слова "TEST"
Код:
ORG 0
;PORTA
;MODE 2
;PORTB
;MODE 0
;OUTPUT
;PC2-0
;OUTPUT
MVI A,0C0H
OUT 013H
LXI H,STR
LOOP:
IN 012H
;CHECK OBF
ANI 080H
JZ LOOP
MOV A,M
ORA A
RZ
OUT 010H
INX H
JMP LOOP
STR:
DB 'TEST',0
END
Загрузка файла:
Код:
ORG 0
;HL=START ADDR
;DE=END ADDR
;PORTA
;MODE 2
;PORTB
;MODE 0
;OUTPUT
;PC2-0
;OUTPUT
MVI A,0C0H
OUT 013H
LOOP:
IN 012H
;CHECK IBF
ANI 020H
JZ LOOP
IN 010H
MOV M,A
INX H
;HL<>DE
CALL 0C01BH
JNZ LOOP
RET
END