Подключение принтера к порту #FB
(С) Юрий Пехов,
г.Ярославль, 1995.
В предыдущей своей статье (см. ZX-PEBI0-95, N5), я попытался осветить некоторые аспекты адаптации программного обеспечения к работе с распространенным интерфейсом "ZX-Lprint 3", которым, в частности, оснащены Spectrum-coB-местимые компьютеры "Пентагон-128" .
Однако, достаточно частым случаем является полное отсутствие каких-либо аппаратных расширений компьютера. Разумеется, можно разместить где-либо в адресном пространстве параллельный порт (например КР580ВВ55А) и привязать принтер к нему. Пожалуй, в случае параллельного протокола обмена, это будет единственным разумным выходом. А вот если принтер имеет последовательный интерфейс, можно использовать возможности стандартной конфигурации компьютера. Я имею в виду порт ввода/вывода с адресом #FE.
Но вначале вкратце рассмотрим особенности передачи одного байта через интерфейс RS-232C по протоколу DTR (существует более сложный в реализации протокол XON/XOFF, но он для связи с принтерами используется крайне редко и мы его здесь рассматривать не будем).Для связи компьютера и внешнего устройства используются два сигнала; TxD (Transmitted Data) - передаваемые данные и DTR (Data 'Terminal Ready) - готовность приемника данных. Данные передаются асинхронно, то есть между передачей двух байт может быть сколь угодно долгая пауза. Перед передачей каждого байта происходит опрос готовности принтера и, если на линии DTR установлен высокий логический уровень, передача дальнейшей информации приостанавливается. Во время паузы на выходе TxD устанавливается высокий логический уровень (т.н. активная пауза). Ниже приведена временная диаграмма передачи одного байта по протоколу DTR со следующими параметрами: передача 8 бит без контроля на четность/нечетность с двумя стоп-битами.
ЧИТАТЕЛЬ-ЧИТАТЕЛЮ
ние числа в этой ячейке, можно |
IM |
2 |
|
добиться требуемой скорости восп |
EI |
|
|
роизведения . |
|
|
Продолжение |
Приведенная выше программа за |
|
|
;программы. |
нимается только тем, что воспро |
|
|
|
изводит музыку. Однако практичес |
INTER PUSH |
HL |
Процедура |
ки бывает нужно, чтобы на фоне |
PUSH |
DE |
обработки |
непрерывно играющей музыки прог |
PUSH |
BC |
прерываний |
рамма занималась бы чем-нибудь |
PUSH |
AF |
второго рода. |
еще. В этом нам поможет следующая |
PUSH |
IX |
|
программа, представляющая собой |
CALL |
40006 |
Проигрывание |
процедуру обработки... правильно, |
POP |
IX |
одного кварка. |
прерываний в режиме IM 2. |
POP |
AF |
|
|
POP |
BC |
|
ORG 30000 |
POP |
DE |
|
CALL 40000 |
POP |
HL |
|
DI ;Инициали- |
3P |
#38 |
Продолжение |
LD HL,INTER ;зация. |
;процедуры |
обработки прерывания. |
LD (#66FF),HL; |
|
|
|
LD A,#66 ;Вектор |
|
к * |
* |
LD I,A ;прерываний. |
|
|
|
llllll DO 01 D2 D3 D4 D5 ОБ 07
lllllll
2 стол -бита
Этот протокол поддерживается большинством типов принтеров. Введение в протокол обмена контроля четности усложнит программу поддержки обмена и, в нашем случае, не улучшит надежности связи. Передача 8 а не 7 бит оправдана даже в том случае, если принтер поддерживает только 7-битные кодовые таблицы (КОИ-7), так как позволяет без особых проблем печатать графику. Введение двух а не одного стоп-бита призвано несколько улучшить синхронизацию (из-за разброса величины тактовой частоты у разных экземпляров компьютеров скорость передачи может отклоняться от номинальной). При этом на принтере надо выбрать режим с одним стоп-битом, что, по идее, должно предотвратить накопление временной ошибки. Скорость передачи определяет длительность одного бита и рассчитывается по формуле:
t (сек) = 1 / BaudRate (бод).
Для скорости 2400 бод длительность одного бита составит 417 микросекунд.
Внимательно рассмотрев битовую карту порта ввода #FE, можно заметить, что биты 5 и 7 нигде не используются, хотя, как правило, на плате компьютера в качестве порта установлен 8-битный регистр. Поэтому мы можем смело рассчитывать на бит 7 в качестве сигнала DTR (готовность принтера). В качестве сигнала TxD (передаваемые данные) можно использовать бит 3 порта вывода #FE (выход на магнитофон), так как одновременная работа с принтером и выгрузка данных на магнитофон маловероятна.
Конечно, можно было бы и в качестве входа готовности использовать соответствующий бит магнитофонного порта с минимальными доработками схемы, но это, как говорится, дело вкуса.
Теперь, определившись с портами ввода/вывода, мы можем рассмотреть конкретную реализацию подключения принтера к порту #FE. Для примера возьмем схему распространенного компьютера "Ленинград-!". Порт вывода в этом компьютере выполнен на микросхеме К555ТМ9 (D39), сигнал TapeOut формируется делителем R16, R17, подключенным к 5 выводу микросхемы- Значит сигнал передачи данных на принтер следует снимать непосредственно с этого вывода. Порт ввода выполнен на двух мультиплексорах К555КП11 (D37 и D38). Бит 7 порта (14 вывод микросхемы D38) следует подключить к сигналу DTR (готовность принтера).
Здесь я хотел бы сделать небольшое лирическое отступление. Очень большое число пользователей ZX-Spectrum имеют в наличии относительно недорогие принтеры К6311(13) фирмы ROBOTRON различных модификаций (например СМ6329-01М), которые, как правило, укомплектованы адаптером последовательного интерфейса. Чаще всего это является поводом для расстройства и, насколько я знаю, одно время даже существовал такой бизнео - замена адаптеров RS-232C (V24, ИРПС) на адаптеры CENTRONICS (ИРПР). Так вот, уважаемые собратья по несчастью, для вас, и для всех других пользователей, у которых последовательный интерфейс в принтере сделан на базе микросхемы Z80 SIO в конце статьи я попытаюсь показать способ подключения принтера по TTL уровням. Если же не забираться в адаптер, тогда придется дополнительно собирать преобразователь TTL-сигна-лов в соответствующие сигналы интерфейса (+/- 12 В или токовая пеТля 20 мА). При этом нужно внимательно сосчитать количество инверсий сигналов. В своих дальнейших рассуждениях я буду исходить из тоГо, что низкий TTL уровень на входе микросхемы порта соответствует готовности принтера, а высокий TTL уровень на выходе микросхемы порта соответствует передаче единицы. Напомню лишь, что логической единице соответствует напряжение -12 Вольт при обмене по RS-232C и наличие тока в цепи при обмене по токовой петле (ИРПС)»
|
Ч |
И T A T E Л b |
- ЧИТАТЕЛЮ |
|
|
Ниже приводится |
листинг прог- |
вставленные для обеспечения |
необ- |
раммы передачи одного байта в |
ходимой задержки. Программа |
расс- |
порт #FE описанным |
выше способом. |
читана на скорость передачи |
! 2400 |
Символом "*" |
отмечены команды, |
бод. |
|
SEND |
ЕХ |
AF,AF' |
;сохраняем передаваемый байт |
|
;Ожидание готовности принтера и проверка на |
|
;Break |
|
|
|
|
WAIT |
LD A,#OA |
;красный Border и "1" на |
|
|
OUT |
(#FE),A |
;выходе TxD (пауза) |
|
|
LD |
A,#7F |
;чтение порта #7FFE |
|
|
IN |
A,(#FE) |
|
|
|
RRA |
|
;выделение 0 бита (если он |
|
|
|
|
;равен 0, нажат "пробел") |
|
|
JR |
C,NOBR |
|
|
|
RET |
|
;возврат,со сброшенным |
|
|
|
|
;флагом CY при прерывании |
|
|
|
|
;печати |
|
NOBR |
BIT |
6,A |
;проверка готовности |
|
|
JR |
NZ,WAIT |
;принтера |
|
;Передача одного байта |
|
|
|
EX |
AF,AF• |
;восстановление байта |
|
|
RRCA |
|
;циклический сдвиг байта |
|
|
RRCA |
|
;вправо на 3 бита - нулевой |
|
|
RRCA |
|
;бит становится пятым |
|
|
DI |
|
;запрет прерываний |
|
|
PUSH |
AF |
;сохранение байта |
|
|
LD |
L, #09 |
;счетчик бит |
|
|
LD |
B, #FF |
; * |
|
|
LD |
C,#FE |
;Border черный, |
|
|
LD |
A,1 |
; передача стартового бита. |
|
|
OUT |
(C),A |
;Border синий |
|
|
CALL |
DELAY |
;задержка |
|
|
LD |
DE,#0000 |
t * |
|
;Побитная передача - цикл |
|
|
LOOP |
POP |
AF |
;восстановление байта |
|
|
RRCA |
|
;сдвиг вправо - передаваемый |
|
|
|
|
;бит на 4 позиции |
|
|
PUSH |
AF ; |
сохранение байта |
|
|
DEC |
L ; |
;уменьшение счетчика бит |
|
|
JR |
Z,FULL ; |
;переход если все биты |
|
|
|
|
;переданы |
|
|
NOP |
|
; * |
|
|
AND |
#10 1 |
;выделение 4 бита |
|
|
LD |
D,A ; |
;его сдвиг на 3 позицию |
|
|
RRC |
D ; |
;и передача |
|
|
OR |
D |
|
|
|
AND |
#08 |
|
|
|
OUT |
(C),A |
|
|
|
CALL |
DELAY |
|
|
|
JR |
LOOP |
|
|
FULL |
POP |
AF ; |
; передача 2 стоповых бит |
|
|
LD |
A,#08 |
|
|
|
OUT |
(C),A |
|
|
|
CALL |
DELAY |
|
|
|
CALL |
DELAY |
|
|
ЧИТАТЕЛЬ - ЧИТАТЕЛЮ
;выход с включенным CY
задержки (скорость 2400 бод)
HL
DE
HL,#0034 DE,#0001
HL,DE N2,DELI
DE HL
scf
EI
RET
;подпрограмма
DELAY PUSH PUSH LD LD SCF CCF
DELI SBC JP NOP POP POP RET
Разумеется, программу можно изменить для другой скорости передачи. Для этого следует изменить подпрограмму задержки DELAY.
Описанную выше процёдуру можно встраивать в программы (например ARTSTUDIO) или, изменив соответствующим образом информацию о потоках и каналах, использовать для распечатки листингов.
Теперь о Тюдключении принтеров типа Robotron СМ6329 и подобных. Последовательный порт в этих принтерах выполнен на базе микросхемы U856 (аналог Z80 SIO производства ГДР - Господи, время-то как летит!), причем используется канал А этой микросхемы. Для того чтобы подключить этот порт по TTL уровням нужно:
- аккуратно перерезать печатный проводник, соединяющий вход RxDA микросхемы U856 (12 ножка) с выходом преобразователя уровня