Порты RS232 RS422 RS485

Модули устройств используются для обеспечения передачи данных по последовательному каналу (например UART - универсальный асинхронный приемо-передатчик). Хотя в некоторых случаях могут быть и другие протоколы (например I2S, 3-wire). Каждое устройство имеет свои преимущества и свои недостатки, поэтому, следует внимательно подойти к вопросу выбора устройства передачи (приема) данных, с учетом конкретных требований к задаче. Далее я постараюсь привести плюсы и минусы того или иного устройства, а Вам уж решать что подходит для решения конкретной задачи.

RS-232 - Применяется, когда на шине присутствует только один Master (ведущий) и только один Slave (ведомый). Любой сторонний коммуникационный узел может быть подключен только на прием (физически не подключены сигналы TXD - для Mastr это RXD). Максимальная длинна кабеля не более 15 метров. Идеально подходит для соединения двух устройств в режиме FULL DUPLEX (одновременная передача и прием данных). Помехоустойчивый обмен обеспечивается за счет передачи сигнала большим потенциалом (от +12 до -12 вольт). Раскачка амплитуды производится в микросхеме устройства. MAX232, ADM202, ...
Подключается разноименными сигналами (в передаче данных участвует 3 провода):

Master TXD - передает =====> Slave RXD - принимает
Master RXD - принимает <===== Slave TXD - передает
Земля GND обязательна для всех.

Встречаются и схемотехнические решения с внешним источником питания управляемым оптронами. Такие схемы работают только на низких скоростях.

RS-422 - Данный драйв используют при необходимости подключения нескольких (более одного) устройств в режимах как Master так и Slave. Причем число устройств как Master так и Slave может быть произвольным. Главная особенность - не может передавать более двух устройств одновременно (причем два устройства могут передавать по разным направлениям или по разным парам проводов). Вторая особенность - два устройства Master (или два Slave) на линии не могут обмениваться данными. Передача данных может быть только между разноименными устройствами.
Иными словами при передаче данных аппаратный передатчик занимает линию, и вмешательство другого передатчика в этот момент разрушит передаваемые данные.
Длинна линии связи не более 1,5 км. Для большинства коммуникационных сетей этого более чем достаточно. Амплитуда сигнала изменяется в пределах от +5 до -5 вольт.
Подходит для соединения двух устройств в режиме FULL DUPLEX (одновременная передача и прием данных). Помехоустойчивый обмен обеспечивается за счет компараторного принципа работы триггера.
Принцип передачи данных выглядит следующим образом:

Master TXD - передает =====> Slave RXD - принимает
TXD+ = +5v TXD- = 0 v | Передача логической "1" ===> Прием логической "1" | RXD+ = +5v RXD- = 0 v
TXD+ = 0 v TXD- = +5v | Передача логического "0" ===> Прием логического "0" | RXD+ = 0 v RXD- = +5v

Master RXD - принимает <===== Slave TXD - передает
RXD+ = +5v RXD- = 0 v | Прием логической "1" <=== Передача логической "1" | TXD+ = +5v TXD- = 0 v
RXD+ = 0 v RXD- = +5v | Прием логического "0" <=== Передача логического "0" | TXD+ = 0 v TXD- = +5v

В обмене данными участвует 4 провода + (желательно экран - заземленный, но можно без него, так как в таких устройствах часто реализован механизм передачи данных по витой паре, т.е. компараторный триггер).
При работе на линии более двух устройств, следует позаботиться о корректной работе приемника и передатчика каждого из устройств. Приемник и передатчик имеют отдельные входы управления активностью. Часто эти входы имеют инверсное управление. В этом случае их можно соединить и управлять приемом и передачей с помощью одного сигнала. (Когда разрешен прием - запрещена передача, и наоборот).
При следующем соединении и при совмещении управляющих входов устройство RS-422 преобразуется в RS-485. О нем пойдет речь более подробно ниже.

соединение RS-422 в RS-485

RS-485 - Данный драйв используют при необходимости подключения нескольких (более одного) устройств в режимах как Master, так и Slave. Причем число устройств как Master, так и Slave может быть произвольным. Главная особенность - передавать может только одно устройство в один момент времени.
При передаче данных аппаратный передатчик занимает линию, и вмешательство другого передатчика в этот момент разрушит передаваемые данные.
Длинна линии связи не более 1,5 км. Для большинства коммуникационных сетей этого более чем достаточно. Амплитуда сигнала изменяется в пределах от +5 до -5 вольт.
Подходит для соединения двух устройств в режиме HALF DUPLEX (передача и прием в разное время). Помехоустойчивый обмен обеспечивается за счет компараторного принципа работы триггера.
Принцип передачи данных выглядит следующим образом:

Master RT - передает/принимает <=====> Slave RT - принимает/передает
RS485+ = +5v RS485- = 0 v | Передача/Прием логической "1" <===> Прием/Прием логической "1" | RS485+ = +5v RS485- = 0 v
RS485+ = 0 v RS485- = +5v | Передача/Прием логического "0" <===> Прием/Прием логического "0" | RS485+ = 0 v RS485- = +5v

В обмене данными участвует 2 провода + (желательно экран - заземленный, но можно без него, так как в таких устройствах часто реализован механизм передачи данных по витой паре, т.е. компараторный триггер).
При работе на линии любого числа устройств, следует позаботиться о корректной работе приемника и передатчика каждого из устройств. Приемник и передатчик имеют отдельные входы управления активностью. Часто эти входы имеют инверсное управление. В этом случае их можно соединить и управлять приемом и передачей с помощью одного сигнала. (когда разрешен прием - запрещена передача, и наоборот).
На сегодняшний день - этот драйв нашел наибольшее применение в сетях коммуникаций промышленной автоматики.

Применение интерфейса RS485.

Опыт использования интерфейса RS485 для систем распределенного сбора данных.

Введение.

При автоматизации узлов учета расхода жидкости и газа, а также при автоматизации поверочных установок для расходомеров и счетчиков мы часто сталкиваемся с проблемой сбора данных от датчиков, сильно разнесенных в пространстве. Система обычно должна была собирать данные о температуре, давлении и плотности от удаленных источников и обрабатывать их по соответствующему алгоритму. В качестве центрального процессора мы применяли обыкновенный офисный компьютер, как в силу своей распространенности, так и чисто по экономическим соображениям.
От системы, в которой платы АЦП, счетчиков и дискретного ввода-вывода ставятся внутрь корпуса компьютера мы сразу решили отказаться. Во-первых, потому, что придется тянуть множество проводов от датчиков на большое расстояние (что вносит дополнительную погрешность в измерения), во-вторых, из-за ограниченного количества свободных слотов, и в третих - из-за низкой помехозащищенности.
Было решено, что целесообразнее всего применить несложные контроллеры, которые устанавливались бы непосредственно возле датчиков, производили измерения и передавали данные в компьютер по каналу связи. Выгоднее всего оказалось применить в качестве канала связи последовательный интерфейс, так как для этого требуется более дешевый кабель с меньшим числом проводов, что в свою очередь облегчает задачу гальванической развязки.
В начале наши системы строились на базе интерфейса RS232, но ряд ограничений, налагаемых применением интерфейса, таких как небольшая дальность передачи данных (10 метров) и трудность при построении многоточечной сети при наличии в компьютере одного свободного COM-порта привели нас к применению интерфейса RS485.
Я не буду останавливаться подробно на вопросах, касающихся расчета канала связи - это описано в литературе [1]. Остановлюсь только на чисто практических аспектах применения данного интерфейса.

Технические характеристики.

Основные технические характеристики приведены в таблице 1.

Таблица 1.

Параметр | Значения
1. Тип линии связи | симметричная
2. Выходное напряжение передатчика без нагр., В | ± (1,5...6)
3. Выходное напряжение передатчика на нагр. Rn = 5 Om, В | ± (1,5...6)
4. Ток короткого замыкания на общий провод, mA | менее 250
5. Синфазное напряжение на выходе передатчика, В | -1...+3
6. Синфазное напряжение на входе передатчика, В | -7...+11
7. Чувствительность приемника, В | ± 0,2 *
8. Входное сопротивление приемника, kOm | более 12
9. Максимальная длина кабеля, м | 1200
10. Максимальная скорость передачи, Мб/с | 10 **
11. Число приемников, нагружаемых на один передатчик | 32

* В случае применения оптронной развязки чувствительность может оказаться ниже порядка 0,5 В из-за падения на переходе входного светодиода.
** В таблице приведены данные стандарта EIA RS485. Реальная скорость зависит от длины кабели и применяемых схем передатчиков и приемников.

 Передача полезного сигнала осуществляется изменением направления протекания тока (1 - в прямом направлении, 0 - в обратном, рис.1).

В неактивном состоянии передатчик переводится в 3-е состояние с высоким импендансом. Обычно вход приемника и выход передатчика объединены вместе и связь осуществляется по двум проводам (витой паре). Кроме того, прокладывается и третий провод, так называемый дренажный проводник, который присоединяется к сигнальным землям каждого устройства. Допускается непосредственное присоединение сигнальной земли к точкам с нулевым потенциалом (корпусная земля) на устройстве, но только в случае гарантированного равенства потенциалов земли в местах размещения оборудования системы.
Для большей помехозащищенности провода рекомендуется поместить в экран. Не следует использовать экран в качестве дренажного провода.
Возможно увеличение дальности передачи числа устройств до 256 при применениии репитеров.

Программная реализация.

Клиенты сети подключаются простым подсоединением к витой паре с соблюдением полярности. В этом случае возможен конфликт, когда могут работать передатчики нескольких устройств. Он решиется чисто программными методами. Дело в том, что при реализации интерфейса RS485 существует главное устройство, именуемое хостом и устройства, которыми оно управляет - клиенты. Каждому клиенту обычно присваивается уникальный адрес. Клиенты изначально находятся в состоянии приема сигнала. Хост посылает в сеть команду, в начале которой указывается адрес клиента, которому она предназначается. Команда выполяется только в случае совпадения адреса клиента и адреса, указанного в самой команде. Остальные устройства находятся в пассивном состоянии.
Стандарт EIA RS485 определяет только электрические и физические характеристики интерфейса. Программная же реализация определяется конкретным применением. В нашем случае удобнее всего было применить протокол обмена интерфейса RS232. Временная диаграмма передачи байта изображена на рис.2

В этом случае с точки зрения программиста обмен между устройствами ничем не отличается от обмена по RS232, что позволяет использовать одни и те же драйвера.
В наших разработках в основном используются промышленные модули снятия сигнала фирмы Advantech серии Adam4000. В этих модулях обмен осуществляется в ASCII-кодах. Команда передается в следующем формате: в начале идет символ - признак команды (обычно это один из редко используемых символов #, $, ~ и т.д), затем два байта - адрес модуля, к которому идет обращение. Далее следует код команды. Вся посылка завершается кодом CR - "перевод каретки"(0Dh). После выполнения команды модуль посылает ответ опрашивающему устройству, подтверждающий успешное выполнение или ошибку. Например, команда сброса счетчика по адресу 01 канала 1 модуля ADAM4080 будет выглядеть следующим образом:

Команда: $01R1<CR>

Ответ: !01<CR>

Подобную систему команд мы применяем и для разработанных нами контроллеров.
Построение команд способом, изложенным выше, позволяет использовать для контроля и настройки оборудования любую терминальную программу, не используя при этом специального программного обеспечения, например, терминал из Norton Commander'a версии 5.0.

В дальнейшем будет описана аппаратная реализация.

Сопряжение RS485 (токовая петля) и RS232 интерфейсов.

Наиболее простыми каналами связи с ПК являются RS232 последовательный интерфейс и Centronix -параллельный интерфейс (принтерный). Недостатком первого является относительно малое расстояние: так для скорости 56Кб кабель должен быть не более 1.5м. Этого зачастую недостаточно. Альтернативой является интерфейс RS485. Однако, покупка платы расширения с таким интерфейсом не самый удачный вариант: во-первых, они достаточно дороги (20 $ и выше); во-вторых, необходимо вскрывать корпус вашего компьютера.

Можно использовать модуль сопряжения. Об одном из возможных вариантов модуля здесь и будет более подробно рассказано. По стоимости это в 5 раз дешевле (около 4 $). В качестве макета была разработана и сделана методом Press-n-Peel однослойная плата.

Схема состоит из трех частей. Первая часть - приемопередатчик RS232 - собрана на драйвере MAX232 (ADM232,...). Из всего разнообразия желательно выбрать с минимальным током потребления. Питание на эту часть берётся с самого порта. Учитывая низкую нагрузочную способность линии RS232 интерфейса - использовались 2 линии, которые были объединены по схеме "ИЛИ" при помощи 2-х диодов (на схеме не показаны, так как для отладки использовали питание +12 В от системного блока). В дальнейшем запаивали непосредственно в разъеме COM порта. Сигнал Tx с ТТЛ уровнями подается на оптрон U3 (можно использовать любые) в нашем случае 4N35. С выхода оптрона U1 сигнал Rx подается на вход драйвера.

Вторая часть - приемопередатчик RS485 собран на драйвере MAX485. Сигнал Tx с оптрона U3 подается на ТТЛ вход DI MAX485. С ТТЛ выхода RO MAX485 сигнал подается на U1. Выходы А и В драйвера используются для управления линии с RS485 интерфейсом. На таймере U5 (использовали советский) собран одновибратор, который переключает драйвер MAX485 в режим передачи данных. В схеме параметры цепочки R12C9 рассчитаны для скорости 9600 б/с. Если планируется другая скорость - следует пересчитать.

Оптическая развязка обязательна, если вы не желаете смерти COM порту своего компьютера.

Третья часть - блок питания для приемопередатчика RS485. Использовался стандартный, собранный в вилке (от АОНа).

Теоретически, RS485 позволяет работать на расстояниях до 1 км. Но на такие дистанции мы не проверяли. Однако, если возникают проблемы при передаче на большие расстояния, попробуйте использовать кабель "витая пара". А если и это не помогает - снизить скорость передачи.

Детали использовались самые доступные. Диоды КД522, Стабилизатор трехвыводной миниатюрный 78L05 (150mA), резисторы 0.125 Вт - любые

ИС последовательного ассинхронного

интерфейса WD8250

--------------------------------------------------------------

       ХАРАКТЕРНЫЕ ОСОБЕННОСТИ

   * Спроектирована  для  наиболее  простого  подсоединения  к
самым широко используемым микропроцессорам (Z-80,  8080А, 6800
и т.д.).
   * Полная двойная буферизация.
   * Независимое  управление   передачей,   приемом,   линиями
состояния, прерыванием.
   * Программируемый  генератор  скорости  передачи  позволяет
делить любые входные синхроимпульсы на число от 1 до (2**16-1)
и производит внутренную шестнадцатикратную синхронизацию.
   * Независимый ввод синхронизирующих импульсов приемника.
   * Полностью программируемый последовательный интерфейс.
    Характеристики:
    - 5, 6, 7 или 8-ми битовые данные;
    - формирование бита контроля четности или нечетности и его
обнаружение;
    - формирование 1, 1,5  или 2-х стоповых битов;
    - формирование скорости в бодах (канал связи со скоростью
до 56 Кбод);
    - обнаружение ложного стартового бита;
   *  Полные характеристики сообщений о состоянии
   * ТТL-драйвер с 3-мя состояниями для  двунаправленной  шины
данных и шины управляющей.
   * Генерация и обнаружение прерывания передачи.
   * Характеристики внутреннего диагностирования
    - контроль линии связи для обнаружения неисправной изоляции.
    - моделирование ошибок прерывания передачи, паритета,
переполнения,кадрирования.
    * Полностью управляемая приоритетная система приревания.
    * Единственный источник питания +5 В.

        ОПИСАНИЕ

    WD8250 представляет    собой    программируемый    элемент
ассинхронной  связи (ACE) в 40-контактном корпусе.  Устройство
изготавливается по технологии кремнеевых затворов N/MOS.
    ACE является    программируемым    устройством,    которое
использует двунаправленную 8-ми битовую  шину  данных  с  3-мя
состояниями.
    АСЕ используется для преобразования параллельных  данных в
последовательный  формат  со стороны передачи и преобразования
последовательных данных в параллельные со  стороны  приемника.
Последовательный  формат  представляет собой стартовый бит для
передачи и приема следующие от 5-ти до 8-ми битов  данных, бит
паритета ( если запрограммирован) и один, полтора (только 5-ти
битовый  формат)   или   два   стоповых   бита.   Максимальная
рекомендуемая  скорость  передачи  данных 56 Кбод.  Внутренние
регистры  дают   возможность   пользхователю   программировать
различные   типы  прерываний,  сигналов  управления  модема  и
знаковые форматы. Пользователь может считывать состояние АСЕ в
любое время,  читая регистры состояния, прерывания и состояния
модема.
    Дополнительной характерной   особенностью   АСЕ   является
программируемый генератор скорости,  который может делить  или
внутренний  синхронизирующий  сигнал  от  кварца  или  внешную
частоту уровня TTL на число от 1 до 2**16-1.
    АСЕ спроектирован  для  работы  как  в управляемой системе
прерывания так и в  системе  опроса,  которая  программируется
пользователем   и   работает   под   управлением  программного
обеспечения с использованием внутреннего регистра.

     ОПИСАНИЕ КОНТАКТОВ
-----*---------*----------*-------------------------------------
Номер¦ Мнемони-¦Наименова-¦
кон- ¦    ка   ¦ние сиг-  ¦         Функция
такта¦         ¦нала      ¦
-----+---------+----------+-------------------------------------
 1   ¦   2     ¦    3     ¦          4
-----+---------+----------+-------------------------------------
  1  ¦ D0      ¦ Шина     ¦ Линии ввода /вывода с 3-мя состояни-
 до  ¦ до D7   ¦ данных   ¦ ми. Двунаправленные линии связи меж-
  8  ¦         ¦          ¦ ду WD8250 и шиной данных. Все ском-
     ¦         ¦          ¦ понованные данные TX и RX, управля-
     ¦         ¦          ¦ ющие слова и информация о состоянии
     ¦         ¦          ¦ передаются через шину данных D0-D7.
  9  ¦ RCLK    ¦Вход син- ¦ Этот вход является входом задающей
     ¦         ¦хронизации¦ частоты для приемника на ИМС (может
     ¦         ¦приемника ¦ быть подсоединен к 15-му контакту
     ¦         ¦          ¦ BAUDOUT) (частота равна скорость в
     ¦         ¦          ¦ бодах умноженная на 16)
  10 ¦ SIN     ¦Вход после¦ Ввод получаемых данных с канала
     ¦         ¦дователь- ¦ связи (от перифирийного устройства,
     ¦         ¦ных данных¦ модема или устройства сопряжения).
  11 ¦ SOUT    ¦Выход пос-¦ Вывод передаваемых данных, предостав-
     ¦         ¦ледовате- ¦ ляемых в последовательном коде в ка-
     ¦         ¦льных дан-¦ нал связи. Сигнал SOUT устанавлива-
     ¦         ¦ных       ¦ ется в определенное состояние (лог.1)
     ¦         ¦          ¦ при общем сбросе.
     ¦         ¦Входы     ¦
  12 ¦ CSO     ¦Выбор ИМС0¦ Когда сигналы CS0 и CS1 высокие, а
  13 ¦ CS1     ¦Выбор ИМС1¦ CS2 низкий, выбирается ИМС. Выбор
  14 ¦ CS2     ¦Выбор ИМС2¦ выполняется, когда строб адреса ADS
     ¦         ¦          ¦ фиксирует выбранные сигналы ИМС.
  15 ¦ BAUDOUT ¦Выход син-¦ 16-ти кратный синхросигнал передчи-
     ¦         ¦хронизации¦ ка ИМС WD8250. Частота синхросигна-
     ¦         ¦передатчи-¦ ла равна частоте генератора, разде-
     ¦         ¦ка        ¦ ленной на число, загруженное в ре-
     ¦         ¦          ¦ гистр делителя. Сигнал BAUDOUT может
     ¦         ¦          ¦ быть использован  для синхронизации
     ¦         ¦          ¦ приемника при подключении его к
     ¦         ¦          ¦ RCLR ( контакт 09).
  16 ¦ XTAL1   ¦Вход внеш-¦ К этим контактам подключают кварц
     ¦         ¦него синх-¦ или внешний задающий генератор для
     ¦         ¦росигнала ¦ задания требуемой скорости передачи
  17 ¦ XTAL2   ¦Выход вне-¦ (см. рис. 5 и 6).
     ¦         ¦шнего синх¦
     ¦         ¦росигнала ¦
  18 ¦ DOSTR   ¦Вход строб¦ Когда ИМС выбрана, низкий уровень
  19 ¦ DOSTR   ¦вывода дан¦ сигнала DOSTR или высокий уровень
     ¦         ¦ных       ¦ сигнала DOSTR позволяют запомнить
     ¦         ¦          ¦ данные в выбранном регистре WD8250
     ¦         ¦          ¦ (записывает ЦПУ). Только одна из
     ¦         ¦          ¦ этих линий должна использоываться.
     ¦         ¦          ¦ Установите неиспользуемую линию
     ¦         ¦          ¦ в неактивное состояние:
     ¦         ¦          ¦ DOSTR - высокий уровень,
     ¦         ¦          ¦ DOSTR - низкий уровень.
  20 ¦ Vss     ¦Заземление¦   Заземление
  21 ¦ DISTR   ¦Вход строб¦ Когда ИМС выбрана низкий сигнал
  22 ¦ DISTR   ¦ввода дан-¦ DISTR или высокий сигнал DISTR
     ¦         ¦ных       ¦ позволяет считывать с выбранного
     ¦         ¦          ¦ регистра WD8250 (читает ЦПУ).
     ¦         ¦          ¦ Только одна из этих линий может
     ¦         ¦          ¦ быть использована. Установите не-
     ¦         ¦          ¦ используемую линию в неактивное
     ¦         ¦          ¦ состояние: DISTR - высокий уровень
     ¦         ¦          ¦            DISTR - низкий уровень.
  23 ¦ DDIS    ¦Выход бло-¦ Выход низкий всякий раз когдда данные
     ¦         ¦кировка бу¦ считываются с WD8250. Может быть ис-
     ¦         ¦фера дан- ¦ пользован для изменения направления
     ¦         ¦ных       ¦ данных от внешнего приемопередатчи-
     ¦         ¦          ¦ ка.
  24 ¦ CSOUT   ¦Выход вы- ¦ Выход высокий всякий раз, когда ИМС
     ¦         ¦бора ИМС  ¦ выбрана. Передача данных в линию не
     ¦         ¦          ¦ может быть инициирована до тех пор,
     ¦         ¦          ¦ пока CSOUT высокий.
  25 ¦ ADS     ¦Вход строб¦ При низком сигнале обеспечивается
     ¦         ¦адреса    ¦ фиксирование сигналов для выбора ре-
     ¦         ¦          ¦ гистра (А0, А1, А2) и выбора ИМС
     ¦         ¦          ¦ (CS0, CS1,CS2).
     ¦         ¦          ¦ Примечание:
     ¦         ¦          ¦ Положительный фронт сигнала ADS
     ¦         ¦          ¦ необходим,
     ¦         ¦          ¦ когда сигналы выбора регистра (А0,
     ¦         ¦          ¦ А1, А2) и выбора ИМС (CS0, CS1,CS2)
     ¦         ¦          ¦ нестабильны во время операции считы-
     ¦         ¦          ¦ вания или записи. Если это не требу-
     ¦         ¦          ¦ ется, вход ADS может быть постоянно
     ¦         ¦          ¦ низким.
     ¦         ¦ Входы    ¦
  26 ¦ A2      ¦Выбор ре- ¦ Эти 3 входа используются для выбора
     ¦         ¦гистра А2 ¦ внутреннего регистра WD8250 во вре-
  27 ¦ A1      ¦Выбор ре- ¦ мя считывания и записи. См.таблицу
     ¦         ¦гистра А1 ¦ ниже.
  28 ¦ A0      ¦Выбор ре- ¦
     ¦         ¦гистра А0 ¦
  29 ¦ NC      ¦ Нет  под-¦   Не используется
     ¦         ¦соединения¦
  30 ¦ INTRPT  ¦ Выход пре¦ Вывод высокий всякий раз, когда при-
     ¦         ¦рывания   ¦ сутствует разрешенное прерывание.
  31 ¦ OUT2    ¦ Выход 2  ¦ Выход предназначенный для пользова-
     ¦         ¦          ¦ теля, который может быть запрограм-
     ¦         ¦          ¦ мирован 3-тим битом регистра управ-
     ¦         ¦          ¦ ления модема. Бит равный 1 формиру-
     ¦         ¦          ¦ ет OUT2 низким.
  32 ¦ RTS     ¦ Выход за-¦ Когда выход низкий, он сообщает мо-
     ¦         ¦прос пере-¦ дему или устройству сопряжения, что
     ¦         ¦дачи      ¦ WD8250 готов передать данные.
     ¦         ¦          ¦     См. регистр управления модема.
  33 ¦ DTR     ¦ Выход го-¦ Если выход низкий, он сообщает мо-
     ¦         ¦товность  ¦ дему или устройству сопряжения, что
     ¦         ¦терминала ¦ WD8250 готов получить данные.
     ¦         ¦данных    ¦
  34 ¦ OUT1    ¦ Выход 1  ¦ Выход, предназначенный для пользова-
     ¦         ¦          ¦ теля, может быть запрограммирован
     ¦         ¦          ¦ 2-ым битом регистра управления мо-
     ¦         ¦          ¦ дема. Бит равный 1 формирует выход 1
     ¦         ¦          ¦ низким.
  35 ¦ MR      ¦ Вход  об-¦ Высокий сигнал сбрасывает регистры
     ¦         ¦щий сброс ¦ в состояния, указанные в табл. 1.
  36 ¦ CTS     ¦ Вход го- ¦ Сигнал с АПД, указывающий, что ус-
     ¦         ¦тов для   ¦ тройство готово к передаче данных.
     ¦         ¦передачи  ¦  См. регистр состояния модема.
  37 ¦ DSR     ¦ Вход уст-¦ Сигнал с АПД, используемый для ука-
     ¦         ¦ройство со¦ зания состояния готовности устрой-
     ¦         ¦пряжения  ¦ ства сопряжения.
     ¦         ¦готово    ¦   См. регистр состояния модема.
  38 ¦ RSLD    ¦ Вход де- ¦ Сигнал с АПД, указывающий, что
     ¦         ¦тектор при¦ идет получение сигнала, который
     ¦         ¦нимаемого ¦ удовлетворяет условиям качества
     ¦         ¦линейного ¦ сигнала.
     ¦         ¦сигнала ка¦   См. регистр состояния модема.
     ¦         ¦нала дан- ¦
     ¦         ¦ных       ¦
  39 ¦ RI      ¦ Вход ин- ¦ Вход низкий, указывает, что
     ¦         ¦дикатор   ¦ сигнал вызова получен модемом или
     ¦         ¦вызова    ¦ устройством сопряжения.
     ¦         ¦          ¦   См. регистр состояния модема.
  40 ¦ Vcc     ¦ +5 В     ¦  Питание +5 В.
-----+---------+----------+-----------------------------------

        ВЫБОР ИМС И АДРЕСАЦИЯ РЕГИСТРОВ

     Строб адреса (ADS  25-тый  контакт):  при  низком  уровне
обеспечивает  разрешение анализа сигналов выбора регистра (А0,
А1, А2) и выбора ИМС (СS0, CS1, CS2).
 Примечание: положительный фронт сигнала ADS необходим
           для фиксации,  когда сигналы выбора  регистра  (А0,
           А1, А2) и выбора ИМС (CS0, CS1, CS2) могут изменять
           во  время  считывания  или  записи.  Если  ADS   не
           используется  для  фиксирования,  то  на  этот вход
           необходимо подать  постоянный  разрешающий  уровень
           логического 0.
     Выбор ИМС (CS0,  CS1, CS2) контакты 12-14: для выбора ИМС
входы CS0 и CS1 должны иметь высокий уровень,  а CS2 - низкий.
Выбор ИМС производится после фиксирования стробом адреса (ADS)
или если вход ADS постоянно низкий.
     Выбор регистра  (А0,  А1,  А2)  контакты  26-28:  условия
выбора регистра при считывании или записи см. табл. 2.
 Примечание: разрядом  доступа  к  регистрам  делителя  (DLAB)
           является самый старший разряд в регистре управления
           линией.  DLAB должен быть запрограммирован в 1  для
           обеспечения доступа к регистрам делителя генератора
           скорости передачи.

-----*-----*----*-----*-------------------------------------
DLAB ¦  А2 ¦ А1 ¦ А0  ¦        Регистр
-----+-----+----+-----+-------------------------------------
  0  ¦  0  ¦ 0  ¦  0  ¦ Буферный регистр приема (чтение)
     ¦     ¦    ¦     ¦ Регистр хранения информации
     ¦     ¦    ¦     ¦ передатчика (запись)
  0  ¦  0  ¦ 0  ¦  1  ¦ Регистр разрешения прерывания
  х  ¦  0  ¦ 1  ¦  0  ¦ Регистр идентификации прерывания
     ¦     ¦    ¦     ¦ (только чтение)
  х  ¦  0  ¦ 1  ¦  1  ¦ Регистр управления линией
  х  ¦  1  ¦ 0  ¦  0  ¦ Регистр управления модемом
  х  ¦  1  ¦ 0  ¦  1  ¦ Регистр состояния линии
  х  ¦  1  ¦ 1  ¦  0  ¦ Регистр состояния модема
  х  ¦  1  ¦ 1  ¦  1  ¦   Нет
  1  ¦  0  ¦ 0  ¦  0  ¦ Регистр делителя (младший байт)
  1  ¦  0  ¦ 0  ¦  1  ¦ Регистр делителя (старший байт)
-----+-----+----+-----+--------------------------------------

        ПРИНЦИП ДЕЙСТВИЯ WD8250

     Установка ИМС в исходное состояние.
     Высокий уровень  на входе на 35-ом контакте устанавливает
WD8250 в положение, указанное в табл. 1.
     Доступ к регистрам WD8250.
     Программист системы имеет доступ  к  любому  регистру  из
табл.  2.  Характеристики  отдельных  регистров  приводится на
следующих страницах.

                                          Таблица 1
--------------------*--------------*------------------------
  Регистр/сигнал    ¦  Установка   ¦  Исходное состояние
--------------------+--------------+------------------------
 Буферный регистр   ¦ полученное   ¦    данные
 приемника          ¦ первое слово ¦
--------------------+--------------+------------------------
 Регистр хранения   ¦ запись в этот¦
 информации передат-¦ регистр      ¦    данные
 чика               ¦              ¦
--------------------+--------------+------------------------
 Регистр разрешения ¦ общий сброс  ¦ все разряды низкие
 прерываний         ¦              ¦
--------------------+--------------+------------------------
 Регистр идентифика-¦              ¦ разряд 0 высокий и разря-
 ции прерывания     ¦    -"-       ¦ ды с 1 по 7 постоянно
                    ¦              ¦ низкие
--------------------+--------------+------------------------
 Регистр управления ¦    -"-       ¦ Все разряды низкие
 линией             ¦              ¦
--------------------+--------------+------------------------
 Регистр управления ¦   -"-        ¦ Все разряды низкие
 модемом            ¦              ¦
--------------------+--------------+------------------------
 Регистр состояния  ¦   -"-        ¦ Все разряды низкие, а
 линии              ¦              ¦ разряды 5 и 6 высокие
--------------------+--------------+------------------------
 Регистр состояния  ¦ общий сброс  ¦ Разряды 0-3 низкие,
 модема             ¦ сигнальные   ¦ разряды 4-7  - входные
                    ¦ входы модема ¦ сигналы
--------------------+--------------+------------------------
 Регистр делителя   ¦ запись в ре- ¦  данные
 младший байт       ¦ гистр        ¦
--------------------+--------------+------------------------
 Регистр делителя   ¦ запись в ре- ¦  данные
 старший байт       ¦ гистр        ¦
--------------------+--------------+------------------------
  SOUT              ¦ общий сброс  ¦  высокий
--------------------+--------------+------------------------
  BAUDOUT           ¦ запись в лю- ¦
                    ¦ бой регистр  ¦  низкий
                    ¦ делителя     ¦
--------------------+--------------+------------------------
  CSOUT             ¦ сигнал строба¦
                    ¦ ADS и состоя-¦  высокий/низкий
                    ¦ ние линий вы-¦
                    ¦ бора ИМС     ¦
--------------------+--------------+------------------------
  DDIS              ¦DDIS=CSOUT x  ¦
                    ¦RCLKx DISTR   ¦
                    ¦(при общем сб-¦
                    ¦росе ЦП устан-¦   высокий
                    ¦авливает низк-¦
                    ¦ие RCLK и     ¦
                    ¦DISTR)        ¦
--------------------+--------------+------------------------
  INTRPT            ¦ общий сброс  ¦   низкий
--------------------+--------------+------------------------
  OUT2              ¦  -"-         ¦   высокий
--------------------+--------------+------------------------
  RTS               ¦  -"-         ¦   высокий
--------------------+--------------+------------------------
  DTR               ¦  -"-         ¦   высокий
--------------------+--------------+------------------------
  OUT1              ¦  -"-         ¦   высокий
--------------------+--------------+------------------------
 Линии шины данных  ¦В третье состо¦  Третье состояние
 D7 - D0            ¦яние, если    ¦  данные (от ИМС к ЦП)
                    ¦ CSOUTxDISTR =¦  данные (от ЦП  к ИМС)
                    ¦ высокий или  ¦
                    ¦ CSOUTxDOSTR =¦
                    ¦  высокий     ¦
--------------------+--------------+------------------------

        РЕГИСТР УПРАВЛЕНИЯ ЛИНИИ
   Разряды 0 и 1:  эти два разряда определяют количество битов
в  каждой  передаваемой  или  принимаемой   последовательности
символов. Кодирование битов 0 и 1 следующее
-------------------*-------------------*---------------------
      Бит 1        ¦    Бит 0          ¦  Длина символа
-------------------+-------------------+---------------------
       0           ¦      0            ¦     5 бит
       0           ¦      1            ¦     6 бит
       1           ¦      0            ¦     7 бит
       1           ¦      1            ¦     8 бит

   Разряд 2:  этот разряд определяет количество стоповых битов
в  последовательности символов.  Если разряд 2 является лог.0,
один стоповый бит формируется или контролируется  при передаче
или получении данных,  соответственно.  Если разряд 2 является
лог.1 ( при выбранной разрядами 1 и 0  длине  символа  в  5-ть
битов)  формируется или контролируется 1,5 стоповых бита. Если
разряд 2 является лог.1,  при длине слова 6,  7 или  8  битов,
формируется или проверяется два стоповых бита.
   Разряд 3:  это  разряд  разрешения  паритета.  Если  бит  3
является лог.1, бит паритета формируется (передача данных) или
контролируется  (получение  данных)  между   последним   битом
символа   и  стоповым  битом  последовательности  данных  (бит
паритета используется для формирования четного  или  нечетного
числа  единиц при суммировании битов символа и бита паритета).
   Разряд 4:  этот  бит  является  битом  выбора  проверки  по
паритету  на  четность.  Если  бит  3  является  лог.1 и бит 4
является лог.0,  нечетное число логических  единиц  передается
или  контролируется  в  битах  информационного  слова  и  бите
паритета.  Когда бит 3 является лог.1 и бит 4 является  лог.1,
передается или контролируется четное число битов.
   Разряд 5:  это бит фиксированного паритета.  Когда бит 3  и
бит   5  являются  лог.1,  бит  паритета  передается  и  затем
определяется приемником в  противоположном  режиме,  указанном
битом 4.
   Разряд 6:  это бит управления прерыванием  передачи.  Когда
бит   6   является   лог.1,   последовательный   выход  (SOUT)
устанавливается в состояние пробела (лог.0) и находится в этом
состоянии  (до  установки и исходное состояние битом 6 низкого
уровня) независимо от других сигналов управления передачи. Эта
особенность  позволяет ЦПУ подключать терминал в систему связи
ЭВМ.
   Разряд 7:  это бит доступа к регистру делителя ( DLAB ). Он
должен быть на высоком уровне (лог.1) для доступа  к регистрам
делителя  генератора  скорости  передачи  при  считывании  или
записи.  Он должен быть на низком уровне (лог.0) для доступа к
буферу приемника, регистру хранения информации передатчика или
регистру разрешения прерывания.

        ПРОГРАММИРУЕМЫЙ ГЕНЕРАТОР СКОРОСТИ ПЕРЕДАЧИ

    Этот генератор    может    принимать     любой     входной
синхронизирующий  сигнал  ( до 3,1 МГц ) и делить его на любое
число от 1 до 2**16-1. Частота выхода генератора - 16 умножить
на скорость передачи в бодах. Два 8-ми битовых регистра хранят
число - делитель в 16-ти битовом двоичном коде.  Эти  регистры
делителя надо загрузить во время инициализации для обеспечения
требуемого  режима  работы  генератора.  При  загрузке  любого
регистра   делителя,   немедленно  загружается  16-ти  битовый
счетчик бодов.  Это предотвротит работу счетчика без  исходной
загрузки.  Таблицы 3 и 4 иллюстрируют использование генератора
с двумя различными ведущими частотами.
     Таблица 3 - использование кварца 1,8432 МГц.
     Таблица 4 - использование кварца 3,072 МГц.

Примечание: максимальная частота генератора  -  3,1  МГц.  При
          использовании   делителя   6  и  меньших  делителей,
          максимальная частота равна 1/2 значения  делителя  в
          МГц.  Например,  если делитель равен 1, максимальная
          частота равняется 1/2 МГц.  Скорость передачи данных
          не должна превышать 56 Кбод.

                                     Таблица 3

        Применение кварца 1,8432 МГц в генераторе скорости
                          передачи
----------------*--------------------*----------------------
  Скорость в    ¦  Число-делитель    ¦  Ошибка в %
  бодах         ¦  синхронизации     ¦
----------------+--------------------+----------------------
         50     ¦     2304           ¦         -
         75     ¦     1536           ¦         -
        110     ¦     1047           ¦        0,026
        134,5   ¦      857           ¦        0,058
        150     ¦      768           ¦         -
        300     ¦      384           ¦         -
        600     ¦      192           ¦         -
       1200     ¦       96           ¦         -
       1800     ¦       64           ¦         -
       2000     ¦       58           ¦        0,69
       2400     ¦       48           ¦         -
       3600     ¦       32           ¦         -
       4800     ¦       24           ¦         -
       7200     ¦       16           ¦         -
       9600     ¦       12           ¦         -
      19200     ¦        6           ¦         -
      38400     ¦        3           ¦         -
      56000     ¦        2           ¦        2,86

Примечание: 1,8432 МГц - это стандартная частота 8080,
          деленная на 10.

                                         Таблица 4

         Применение кварца 3,072 МГц в генераторе скорости
                          передачи
---------------*---------------------*---------------------
 Скорость в    ¦  Число-делитель     ¦  Ошибка в %
  бодах        ¦  синхронизации      ¦
---------------+---------------------+---------------------
         50    ¦      3840           ¦        -
         75    ¦      2560           ¦        -
        110    ¦      1745           ¦       0,026
        134,5  ¦      1428           ¦       0,034
        150    ¦      1280           ¦        -
        300    ¦       640           ¦        -
        600    ¦       320           ¦        -
       1200    ¦       160           ¦        -
       1800    ¦       107           ¦        -
       2000    ¦        96           ¦        -
       2400    ¦        80           ¦        -
       3600    ¦        53           ¦       0,628
       4800    ¦        40           ¦        -
       7200    ¦        27           ¦       1,23
       9600    ¦        20           ¦        -
      19200    ¦        10           ¦        -
      38400    ¦         5           ¦        -
      56000    ¦         3           ¦      14,285

        РЕГИСТР СОСТОЯНИЯ ЛИНИИ
     Этот 8-ми  битовый регистр предоставляет ЦПУ информацию о
передаче данных. Формат регистра представлен в табл.2 и описан
ниже.
   Разряд 0:этот бит - индикатор готовности  данных  приемника
(DR).Бит  0 устанавливается в состояние лог.  1,  когда принят
весь  поступающий  символ  и  передан  на   буферный   регистр
приемника.Бит 0 может быть сброшен в состояние лог. 0 либо при
чтении ЦПУ данных в  буферном  регистре  приемника,  либо  при
записи ЦПУ лог. 0 в этот бит.
   Разряд 1:этот бит является индикатором  ошибки переполнения
(ОЕ).Бит  1  указывает  на то,  что данные в буферном регистре
приемника не были считаны ЦПУ до передачи следующего символа в
буферный  регистр приемника,  разрушая этим предыдущий символ.
Индикатор ОЕ сбрасывается при чтении ЦПУ  содержимого регистра
состояния линии.
   Разряд 2:этот  бит  является  индикатором  ошибки  паритета
(PE).  Бит  2  указывает на то,  что символ принятых данных не
имеет  правильного   четного   или   нечетного   паритета,   в
соответствии  с  установленным  битом выбора паритета.  Бит РЕ
устанавливается в состояние  лог.  1  при  обнаружении  ошибки
паритета   и  сбрасывается  в  лог.  0,  когда  ЦПУ  считывает
содержимое регистра состояния линии.
   Разряд 3:этот  бит  является индикатором ошибки кадра (FE).
Бит 3 указывает на то,  что принятый знак не  имеет  истинного
бита  останова.  Бит  3  устанавливается в лог.  1,  когда бит
останова,  следующий  за  последним  битом  данных  или  битом
паритета распознается как нулевой бит (уровень пробела).
   Разряд 4:этот бит является индикатором  прерывания передачи
(BI).  Бит  4  устанавливается в состояние лог.  1,  если вход
принимаемых данных удерживается в состоянии пробела (лог. 0) в
течении  времени,  превышающего время передачи полного символа
(т.е.,  общее время старт-бита + биты данных + паритет +  биты
останова). Примечание: Биты 1-4 идентифицируют ошибки, которые
формируют
          прерывание по состоянию линии приема при обнаружении
          соответствующих условий.
   Разряд 5:этот  бит  является  индикатором "регистр хранения
передатчика пуст" (THRE). Он указывает на то, что WD8250 готов
принять  новый  символ  для  передачи.  Кроме  того,  этот бит
вызывает  формирование  WD8250  прерывания  для   ЦПУ,   когда
установлен  высокий  уровень разрешения прерывания по ситуации
"регистр хранения передатчика пуст".  Бит THRE устанавливается
в состояние лог.  1,  когда символ передан с регистра хранения
передатчика на сдвиговый регистр передатчика. Бит сбрасывается
в   лог.   0   одновременно   с  загрузкой  регистра  хранения
передатчика ЦПУ.
   Разряд 6:этот  бит  является индикатором "сдвиговый регистр
передатчика пуст" (TSRS).  Бит 6 устванавливается  в  лог.  1,
когда   сдвиговый   регистр   передатчика   бездействует.   Он
сбрасывается в состояние  лог.  0,  когда  данные  переданы  с
регистра    хранения    передатчика   на   сдвиговый   регистр
передатчика. Бит 6 - бит только чтения.
   Разряд 7:этот  бит постоянно установлен в состояние лог. 0.

                РЕГИСТР ИДЕНТИФИКАЦИИ ПРЕРЫВАНИЯ
     WD8250 имеет встроенную  в  ИМС  возможность  прерывания,
которая  обеспечивает  гибкость  при сопряжении наиболее часто
используемых  микропроцессоров,  что  позволяет   использовать
минимальный   объем   программного  обеспичения  при  передаче
символов данных при разделении прерываний WD8250 по приоритету
на  4  уровня.  Среди  них  -  следующие  условия формирования
прерывания:
  - состояние линнии приема (приоритет 1),
  - готовность принимаемых данных (приоритет 2),
  - регистр хранения передатчика пуст (приоритет 3),
  - состояние модема (приоритет 4).
     Информация, указывающая    на    то,    что    прерывание
упорядоченное по приоритету  ждет,и  указывающая  на  источник
этого  прерывания записана в регистре идентификации прерывания
(см.  табл. 5).При адресации регистра идентификации прерывания
(IIR) на время обращения к ИМС замораживается состояние самого
высокого по преоритету  прерывания,  а  другие  прерывания  не
подтверждаются до тех пор, пока предыдущее прерывание не будет
обслужено  ЦПУ.  Содержимое  IIR  представлено  в  табл.  2  и
описывается ниже.
  Разряд 0:  этот бит  может  использоваться  при  программном
опросе и указывает на ожидание прерывания.  Когда бит 0 - лог.
0, прерывание ожидает, а содержимое IIR может использоваться в
качестве  указателя типа прерывания для программы обслуживания
прерывания. Когда бит 0 - лог. 1, ожидающего прерывания нет, и
опрос продолжается (если он используется).
  Разряды 1  и  2  :  эти  два  бита  IIR   используются   для
идентификации  старшего по приоритету прерывания, находящегося
в ожидании (см. табл. 5).
  Разряды 3 - 7: эти 5-ть битов IIR всегда в состоянии лог. 0.

                                       Таблица 5
      Функции управления прерыванием
-----------*--------------------------------------------------
Регистр    ¦ Условия установки и сброса прерывания
индикации  +-------*-------------*--------------*--------------
прерывания ¦Уровень¦   Флаг      ¦  Источник    ¦  Управление
---*---*---+приори-¦ прерывания  ¦  прерывания  ¦  сбросом
Бит¦Бит¦Бит¦тета   ¦             ¦              ¦  прерывания
 2 ¦ 1 ¦ 0 ¦       ¦             ¦              ¦
---+---+---+-------+-------------+--------------+--------------
 0 ¦ 0 ¦ 1 ¦  -    ¦  Нет        ¦   Нет        ¦      -
 1 ¦ 1 ¦ 0 ¦Самый  ¦Состояние ли-¦Переполнение, ¦Чтение регист-
   ¦   ¦   ¦высокий¦нии приема   ¦ошибка парите-¦ра состояния
   ¦   ¦   ¦       ¦             ¦та, ошибка    ¦линии
   ¦   ¦   ¦       ¦             ¦кадра,прерыва-¦
   ¦   ¦   ¦       ¦             ¦ние передачи  ¦
 1 ¦ 0 ¦ 0 ¦Второй ¦Наличие при- ¦ Наличие при- ¦Чтение реги-
   ¦   ¦   ¦       ¦нятых данных ¦нятых данных  ¦стра буфера
   ¦   ¦   ¦       ¦             ¦              ¦приемника
 0 ¦ 1 ¦ 0 ¦Третий ¦Регистр хра- ¦ Регистр хра- ¦ Чтение ре-
   ¦   ¦   ¦       ¦нения пере-  ¦нения пере-   ¦гистра IIR
   ¦   ¦   ¦       ¦датчика пуст ¦датчика пуст  ¦(как источни-
   ¦   ¦   ¦       ¦             ¦              ¦ка прерывания)
   ¦   ¦   ¦       ¦             ¦              ¦или запись в
   ¦   ¦   ¦       ¦             ¦              ¦регистр хране-
   ¦   ¦   ¦       ¦             ¦              ¦ния передат-
   ¦   ¦   ¦       ¦             ¦              ¦чика
 0 ¦ 0 ¦ 0 ¦Четвер-¦ Состояние   ¦ Готов к пере-¦ Чтение реги-
   ¦   ¦   ¦тый    ¦модема       ¦даче, ус-во   ¦стра состоя-
   ¦   ¦   ¦       ¦             ¦сопряжения да-¦ния модема
   ¦   ¦   ¦       ¦             ¦нных готово,  ¦
   ¦   ¦   ¦       ¦             ¦индикатор вы- ¦
   ¦   ¦   ¦       ¦             ¦зова, детектор¦
   ¦   ¦   ¦       ¦             ¦принимаемого  ¦
   ¦   ¦   ¦       ¦             ¦линейного сиг-¦
   ¦   ¦   ¦       ¦             ¦нала          ¦
---+---+---+-------+-------------+--------------+------------

                  РЕГИСТР РАЗРЕШЕНИЯ ПРЕРЫВАНИЯ

     Этот 8-ми   разрядный  регистр  разрешает  каждому  из  4
источников  прерывания  WD8250   в   отдельности   формировать
выходной   сигнал   прерывания  (INTRPT).  Возможно  полностью
отключить систему прерывания,  сбросив биты  0  -  3  регистра
разрешения  прерывания  в  состояние  лог.  0.  Подобно  этому
устанавливая соответствующие биты этого регистра  в  состояние
лог.  1,  могут быть разрешены выбранные прерывания.  Отключая
систему  прерывания,  мы   отключаем   регистр   идентификации
прерывания  и  активный  (высокий)  уровень  выходного сигнала
INTRPT.  Все другие функции ИМС действуют, как обычно, включая
установку  регистра  состояния,  регистров  состояния  линий и
модема. Содержимое регистра разрешения прерывания представлено
в табл. 2 и описано ниже.
  Разряд 0:  этот бит разрешает прерывание по наличию принятых
данных, если он установлен в состояние лог. 1.
  Разряд 1:  этот  бит  разрешает   прерывание,когда   регистр
хранения передатчика пуст, и он установлен в состояние лог. 1.
  Разряд 2:  этот бит разрешает прерывание по состоянию  линии
приема, когда он установлен в состояние лог. 1.
  Разряд 3:  этот бит разрешает прерывание по состоянию модема
при установке его в состояние лог. 1.
  Разряды 4 - 7:  эти 4 бита всегда  установлены  в  состояние
лог. 0.

                   РЕГИСТР УПРАВЛЕНИЯ МОДЕМОМ
    Восьмиразрядный регистр управляет интерфейсом с утройством
сопряжения,   или   модемом,   или  перефирийным  устройством,
иммитирующим модем.  Содержимое  регистра  управления  модемом
представлено в табл. 2 и описано ниже.
  Разряд 0:  этот бит управляет выходом  готовности  терминала
данных (DTR).  Когда бит 0 устанавливается в состояние лог. 1,
выход DTR принудительно устанавливается в  состояние  лог.  0.
Когда  бит  0  сбрасывается  в  состояние  лог.  0,  выход DTR
устанавливается в состояние  лог.  1.
 Примечание: выход    DTR    WD8250    может   подаваться   на
          инвертирующий линейный драйвер  (такой  как  DS1488)
          для    получения   выхода   нужной   полярности   на
          подключаемом модеме или устройстве сопряжения.
  Разряд 1: этот бит управляет выходом запроса передачи (RTS).
Бит 1 действует на выход аналогично биту 0.
  Разряд 2:  этот  бит  управляет  сигналом  "выход 1" (OUT1),
который   является   вспомогательным   выходом,   определяемым
пользователем. Бит 2 действует на выход аналогично биту 0.
  Разряд 3:  этот бит управляет  сигналом  "выход  2"  (OUT2),
который   является   вспомогательным   выходом,   определяемым
пользователем. Бит 3 действует на выход аналогично биту 0.
  Разряд 4:    этот    бит   обеспечивает   зацикливание   для
диагностического   тестирования   WD8250.    Когда    бит    4
устанавливается  в  состояние  лог.  1,  происходит следующее:
выход передатчика (SOUT)  устанавливается  в  состояние  лог.1
(высокий  уровень);  вход  приемника (SIN) отключается;  выход
сдвигового регистра передатчика замыкается на  вход здвигового
регистра приемника;  4-ре управляющих входа модема (CTS,  DSR,
RLSD,  RI) отключаются;  4-ре управляющих выхода модема  (DTR,
RTS,  OUT1,  OUT2)  внутренне  подключаются  к 4-м управляющим
входам модема.  В диагностическом режиме  передаваемые  данные
принимаются  немедленно.  Это  позволяет  процессору проверить
передающие и принимающие каналы данных WD8250.
      В диагностическом режиме работают прерывания приемника и
передатчика.  Прерывания по состоянию модема  выполняются  так
же,  но  источником  прерывания теперь являются 4 младших бита
регистра  управления  модемом,  а  не  4-ре  входа  управления
модема.    Прерывания    управляются    регистром   разрешения
прерываний.  Система прерывания WD8250  может  быть  проверена
записью  в  6-ть младших битов регистра состояния линии и 4-ре
младших бита регистра состояния модема. Установка этих битов в
состояние  лог.  1  (любого  из них) формирует соответствующее
прерывание,  если  оно  разрешено.   Сброс   этих   прерываний
происходит  так  же,  как и при нормальной работе WD8250.  Для
возвращения   к   реальной   работе   регистры   должны   быть
перепрограммированы  для  нормальной  работы,  а  затем  бит 4
должен быть сброшен в состояние лог. 0.
   Разряды 5  - 7:  эти биты постоянно установлены в состояние
лог. 0.

                    РЕГИСТР СОСТОЯНИЯ МОДЕМА

     Этот 8-ми разрядный регистр обеспечивает  чтение текущего
состояния  управляющих  линий  от  модема  (или  перефирийного
устройства) на ЦПУ.  Кроме этой информации о текущем состоянии
4-ре бита регистра состояния модема обеспечивают информацию об
изменении этого текущего состояния. Эти биты устанавливаются в
состояние  лог.  1,  когда  управляющий  вход от модема меняет
состояние.  Они сбрасываются в состояние  лог.  0,  когда  ЦПУ
читает регистр состояния модема. Содержимое регистра состояния
модема приведено в табл. 2 и описано ниже.
  Разряд 0:  этот  бит  является индикатором изменения сигнала
готовности к передаче (DCTS).  Бит 0 указывает, что вход CTS в
ИМС изменил состояние по отношению к тому, как он в предыдущий
раз был считан ЦПУ.
  Разряд 1:  этот бит - индикатор изменения сигнала готовности
терминала данных (DDSR).  Бит 1 указывает,  что вход DSR в ИМС
изменил состояние по отношению к тому, как он в предыдущий раз
считывался ЦПУ.
  Разряд 2:  этот  бит  -  детектор  заднего фронта индикатора
вызова (TERI).  Бит 2 указывает на  то,  что  вход  RI  в  ИМС
изменился с ON (лог.1) на OFF (лог.0).
  Разряд 3: этот бит - индикатор изменения детектора принятого
линейного  сигнала  канала данных (DRLSD).  Бит 3 указывает на
изменение состояния входа RLSD в ИМС.  Примечание:  когда биты
0,  1,  2 или 3 установлены в состояние лог.  1,  генерируется
прерывание по состоянию модема.
  Разряд 4:   этот  бит  -  дополнение  ко  входу  "готов  для
передачи" (CTS).
  Разряд 5:  этот  бит - дополнение входа готовности терминала
данных (DSR).
  Разряд 6:  этот  бит  -  дополнение входа "индикатор вызова"
(RI).
  Разряд 7: этот бит - дополнение входа "детектор принимаемого
линейного сигнала" (RLSD).

                                           Таблица 2
      Доступные регистры WD8250

---------*-------------------------*--------------------------
         ¦ Адрес регистра 0 DLAB 0 ¦ Адрес регистра 0 DLAB 0
         +-------------------------+--------------------------
 N бита  ¦ Регистр буфера приемника¦Регистр хранения передат-
         ¦  (только чтение)        ¦чика   (только запись)
---------+-------------------------+--------------------------
  0      ¦ Разряд данных 0     *   ¦ Разряд данных 0    *
---------+-------------------------+--------------------------
  1      ¦ Разряд 1                ¦       "       1
---------+-------------------------+--------------------------
  2      ¦ Разряд 2                ¦       "       2
---------+-------------------------+--------------------------
  3      ¦ Разряд 3                ¦       "       3
---------+-------------------------+--------------------------
  4      ¦ Разряд 4                ¦       "       4
---------+-------------------------+--------------------------
  5      ¦ Разряд 5                ¦       "       5
---------+-------------------------+--------------------------
  6      ¦ Разряд 6                ¦       "       6
---------+-------------------------+--------------------------
  7      ¦ Разряд 7                ¦       "       7
---------+-------------------------+--------------------------
  *Разряд 0 является найменьшим значащим разрядом, передавае-
мым или принимаемым.
---------*----------------------------------------------------
         ¦     Адрес регистра 1 DLAB 0
         +----------------------------------------------------
 N бита  ¦  Регистр разрешения прерывания
---------+----------------------------------------------------
   0     ¦ Разрешает прерывание по получению данных (ERBFI)
---------+----------------------------------------------------
   1     ¦ Разрешает прерывание при пустом буфере передатчика
         ¦ (ETBEI)
---------+----------------------------------------------------
   2     ¦ Прерывание по состоянию линии приема (ELSI)
---------+----------------------------------------------------
   3     ¦ Разрешение прерывания по состоянию модема (ЕDSSI)
---------+----------------------------------------------------
   4     ¦   0
---------+----------------------------------------------------
   5     ¦   0
---------+----------------------------------------------------
   6     ¦   0
---------+----------------------------------------------------
   7     ¦   0
---------+----------------------------------------------------

---------*----------------------------------------------------
         ¦     Адрес регистра 2
         +----------------------------------------------------
 N бита  ¦  Регистр идентификации прерывания
---------+----------------------------------------------------
   0     ¦  Наличие прерывания
---------+----------------------------------------------------
   1     ¦  Идентификация прерываний разряд 0
---------+----------------------------------------------------
   2     ¦  Идентификация прерываний разряд 1
---------+----------------------------------------------------
   3     ¦    0
---------+----------------------------------------------------
   4     ¦    0
---------+----------------------------------------------------
   5     ¦    0
---------+----------------------------------------------------
   6     ¦    0
---------+----------------------------------------------------
   7     ¦    0
---------+----------------------------------------------------

---------*----------------------------------------------------
         ¦   Адрес регистра 3
         +----------------------------------------------------
 N бита  ¦  Регистр управления линией
---------+----------------------------------------------------
   0     ¦  Выбор длины символа  разряд 0 (WLS0)
---------+----------------------------------------------------
   1     ¦  Выбор длины символа  разряд 1 (WLS1)
---------+----------------------------------------------------
   2     ¦  Количество битов останова (STB)
---------+----------------------------------------------------
   3     ¦  Разрешение паритета  (PEN)
---------+----------------------------------------------------
   4     ¦  Выбор паритета (EPS)
---------+----------------------------------------------------
   5     ¦  Фиксированный паритет
---------+----------------------------------------------------
   6     ¦  Прерывание передачи
---------+----------------------------------------------------
   7     ¦ Разряд доступа к регистрам делителя (DLAB)
---------+----------------------------------------------------

---------*----------------------------------------------------
         ¦      Адрес регистра 4
         +----------------------------------------------------
 N бита  ¦ Регистр управления модемом
---------+----------------------------------------------------
   0     ¦ Готовность терминала данных (DTR)
---------+----------------------------------------------------
   1     ¦ Запрос на передачу (RTS)
---------+----------------------------------------------------
   2     ¦ Вывод 1 (OUT1)
---------+----------------------------------------------------
   3     ¦ Вывод 2 (OUT2)
---------+----------------------------------------------------
   4     ¦  Зацикливание
---------+----------------------------------------------------
   5     ¦    0
---------+----------------------------------------------------
   6     ¦    0
---------+----------------------------------------------------
   7     ¦    0
---------+----------------------------------------------------

---------*----------------------------------------------------
         ¦   Адрес регистра 5
         +----------------------------------------------------
 N бита  ¦  Регистр состояния линии
---------+----------------------------------------------------
   0     ¦  Готовность данных (DR)
---------+----------------------------------------------------
   1     ¦  Ошибка переполнения (OR)
---------+----------------------------------------------------
   2     ¦  Ошибка паритета (PE)
---------+----------------------------------------------------
   3     ¦  Ошибка кадрирования (FE)
---------+----------------------------------------------------
   4     ¦  Прерывание приема (ВI)
---------+----------------------------------------------------
   5     ¦ Пуст регистр хранения данных передатчика (THRE)
---------+----------------------------------------------------
   6     ¦ Пуст сдвиговый регистр (TSRE)
---------+----------------------------------------------------
   7     ¦    0
---------+----------------------------------------------------

---------*-----------------------------------------------------
         ¦      Адрес регистра 6
         +-----------------------------------------------------
 N бита  ¦  Регистр состояния модема
---------+-----------------------------------------------------
  0      ¦  Изменение сигнала "свободен для передачи" (DCTS)
---------+-----------------------------------------------------
  1      ¦ Изменение сигнала "готовность передать данные" (DDSR)
---------+-----------------------------------------------------
  2      ¦ Отрицательный фронт сигнала "индикатор вызова"(TERI)
---------+-----------------------------------------------------
  3      ¦ Изменение детектора линейного сигнала (DSLSD)
---------+-----------------------------------------------------
  4      ¦ Свободен для передачи (CTS)
---------+-----------------------------------------------------
  5      ¦ Готовность передать данные (DSR)
---------+-----------------------------------------------------
  6      ¦ Индикатор вызова (RI)
---------+-----------------------------------------------------
  7      ¦ Детектор принимаемого линейного сигнала (RLSO)
---------+-----------------------------------------------------

-------*--------------------------*----------------------
       ¦Адрес регистра            ¦  Адрес регистра
       ¦    0 DLAB 1              ¦      1 DLAB 1
       +--------------------------+----------------------
N бита ¦Регистр делителя (LS)     ¦ Регистр делителя (MS)
-------+--------------------------+----------------------
   0   ¦  Разряд 0                ¦  Разряд 8
-------+--------------------------+----------------------
   1   ¦  Разряд 1                ¦  Разряд 9
-------+--------------------------+----------------------
   2   ¦  Разряд 2                ¦  Разряд 10
-------+--------------------------+----------------------
   3   ¦  Разряд 3                ¦  Разряд 11
-------+--------------------------+----------------------
   4   ¦  Разряд 4                ¦  Разряд 12
-------+--------------------------+----------------------
   5   ¦  Разряд 5                ¦  Разряд 13
-------+--------------------------+----------------------
   6   ¦  Разряд 6                ¦  Разряд 14
-------+--------------------------+----------------------
   7   ¦  Разряд 7                ¦  Разряд 15
-------+--------------------------+----------------------

РАБОТА С LPT

АППАРАТНАЯ часть - разъем порта
ДОСТУП и управление портом

   1. Аппаратная часть - разъем порта

   Соединительная розетка порта имеет следующий вид и расположение контактов:
   Назначение контактов (специфика работы с принтером) следующее:
 1     STROBE       - Строб (НИЗКИЙ означает что можно читать данные)
 2     DATA 1       - линия данных 1
 3     DATA 2       - "            2
 4     DATA 3       - "            3
 5     DATA 4       - "            4
 6     DATA 5       - "            5
 7     DATA 6       - "            6
 8     DATA 7       - "            7
 9     DATA 8       - "            8
 10    ACKNLG       - Принято (НИЗКИЙ показывает что данные считаны устройством)
 11    BUSY         - Занято (ВЫСКОЙ в следующих случаях:
                      (a) прием данных
                      (b) печать
                      (c) принтер офф-лайн
                      (d) ошибка принтера)
 12    PE           - Нет бумаги (ВЫСОКИЙ если в принтере не бумаги)
 13    SLCT         - Выбор (ВЫСОКИЙ если принтер выбран)
 14    AUTO FEED XT - Авто-перевод строки (НИЗКИЙ показывает принтер будет авто-
                      матически переводить строку после знака "возврат каретки".
                      Зависит от установки DIP переключателей принтера.
 15    n.c.
 16    0V           - Логичексая земля
 17    CHASSIS GND  - Шасси (земля)
 18    n.c.
 19-30 GND          - Сигнальная земля (оплетки жил от контактов 1-12)
 31    INIT         - Инициализация (НИЗКИЙ импульс для сброса принтера)
 32    ERROR        - Ошибка. НИЗКИЙ если:
                      (a) кончилась бумага
                      (b) устройство офф-лайн
                      (c) состояние ошибки
 33    GND          - Сигнальная земля
 34    n.c.
 35    LOGIC 1      - Логический ВЫСОКИЙ (обычно от источника +5 В через 3.3 кОм)
 36    SLCT IN      - Разрешение ввода (данные вводятся в принтер только если
                      на линии НИЗКИЙ, однако зависит от установки DIP переклю-
                      чателей)

   Как видно из этой таблицы, порт имеет достаточное количество входных и выход-
ных линий, что позволяет подключать множество самых разнообразных устройств,
требующих управления от компьютера. Нагрузочная способность выходов в нормальном
режиме не более 1 мА, максимум 5 мА и зависит от чипа, на котором реализован
интерфейс. Наибольшую нагрузку допускают порты, реализованные в виде отдельной
мультикарты, наименьшую - интергрированный в одном чипе контроллер периферии,
встроенный в материнскую плату. Для экспериментальной работы лучше использовать
отдельные MIO карты, так как при случайных повреждениях страдает дешевая карта,
в то время как при повреждении интегрированного контроллера в негодность прихо-
дит вся материнская плата.
   Порт можно использовать и для питания подсоединенных устройств и позволяет
обойтись без внешнего источника питания в случае, если потребляемый ток не
превышает 10 мА (КМОП-схемы). Для этого через диоды объединяют неиспользуемые
выходы шиной (аноды к выходам, катоды на шину), последовательно устанавливают
резистор сопротивлением не менее 100 оМ (для защиты от перегрузки выходов при
случайном коротком замыкании), и параллельно на землю - конденсатор емкостью не
менее 10 мкФ, для сглаживания пульсаций питающего тока. Так как микросхемы КМОП
потребляют ток только в момент переключения, напряжение на конденсаторе будет
примерно равно напряжению логической единицы, т.е. не менее 3.6 вольта, что
вполне достаточно для питания большинства микросхем.
   Для питнаия более мощных устройств использется питание от клавиатуры (через
отводной разъем-переходник) или от внешнего источника.
   Внимание! При питании от сети надо соединить устройство с разъемом порта, и
только потом включить штепсель блока питания в сеть, иначе из-за разницы земля-
ных потенциалов в момент соединения разьема порта какие-либо входы/выходы могут
оказаться соединенными раньше, чем вывод земли, и окажутся под потенциалом до
127 вольт, что приведет к выходу из строя чипа порта и/или деталей устройства.
Перед расстыковкой разъема сначала отключают штепсель сети.
   Порт можно использовать для превращения компьютера в мощный контроллер, для
управления чипами, программирования ПЗУ, в качестве светомузыки, и т. п. В
случае, если требуется посдоединять не-ТТЛ оборудование или управлять цепями с
повышенной нагрузкой/напряжением, используйте стандартные ТТЛ-развязки и
адаптеры. Ключ +22 В показан на схеме читалки в статье ТАКСОФОННЫЕ СМАРТ-КАРТЫ.
Для управления сетевыми устройствами рекомендуется использовать гальванически
развязанный через оптрон адаптер, гарантирующий полную безопасность:

   Номиналы указаны для оптрона с индексом Б. Для оптрона с индексом А номинал
входного резистора надо уменьшить с 470 Ом до 330 Ом, а резистор базы с 82 кОм
до 15 кОм.

   2. Доступ и управление портом

   Компьютер IBM может управлять тремя параллельными портами LPT1-LPT3. Базовый
адрес LPT1 находится в ячейке BIOS 0040:0008 (слово), LPT2 - 0040:000A и т. д.
Какой адаптер назначен какому LPT не определено и зависит от конфигурации
компьютера и ОС, поэтому программа должна определить используемые ими адреса.
При инициализации базовому адресу присваивается 0, если адаптер не установлен.

   Адаптер
   Регистр входных данных
   Регистр статуса
   Регистр управления

   LPT1
   378h
   379h
   37Ah

   LPT2
   278h
   279h
   27Ah

   Регистр выходных данных - тот адрес порта, через который проходит каждый
байт данных, посылаемый в порт. Регистр статуса сообщает различную информацию
о входных линиях; процессор может постоянно опрашивать его, чтобы распознать
момент, когда все в порядке и можно посылать данные. Регистр статуса сообщает
также, что произошла ошибка (линия ERROR). Регистр управления инициализирует
адаптер и управляет выводом данных. Он может также подготавливать параллельный
порт для операций преры- вания, с тем чтобы устройство посылало прерывание к
процессору, когда оно готово к приему очередной порции данных, оставляя процес-
сор свободным для других дел. Ниже перечислены значения битов регистров статуса
и управления:

   Регистр управления

   бит 0
   0 = нормальная установка
   1 = вызывает вывод байта данных

   бит 1
   0 = нормальная установка
   1 = автоматический перевод строки после
возврата каретки

   бит 2
   0 = инициализировать порт принтера
   1 = нормальная установка

   бит 3
   0 = отмена выбора принтера
   1 = нормальная установка

   бит 4
   0 = прерывание принтера запрещено
   1 = разрешено

   биты 5-7 - не используются

   Регистр статуса

   биты 0-2 - не используются

   бит 3
   0 = ошибка принтера
   1 = нет ошибки

   бит 4
   0 = принтер off-line
   1 = принтер on-line

   бит 5
   0 = бумага вставлена
   1 = нет бумаги

   бит 6
   0 = принтер подтверждает прием символа
   1= нормальная установки

   бит 7
   0 = принтер занят
   1 = принтер свободен

   Из этих таблиц видно, как соотностятся входные линии порта и биты регистров
управления и статуса.
   Мы можем управлять отдельно каждой выходной линией порта, послыая
соответствующий байт в базовый регистр, и знать состояние каждой входной линии,
читая из регистров статуса/управления. Для получения базового адреса порта
прочитаем его из BIOS:
   (ASM):
MOV AX,0040h
MOV ES,AX			; записали сегмент BIOS в ES
MOV DX,ES:[8]			; прочитали базовый адрес
MOV LPT_BASE, DX		; и запомнили
INC DX
MOV LPT1_CONTROL,DX		; добавили 1 и получили рег. управления
INC DX
MOV LPT1_STATUS,DX		; добавили еще 1 и получили рег. статуса
...
MOV AL,...			; что-то занесли в AL
OUT DX,AL			; и записали в порт статуса
Def Seg = h40                   ' установили сегмент BIOS
LPT1Base = Peek (9) + hFF * Peek (8)
LPT1Control = LPTBase + 1
LPT1Status = LPTBase + 2
...
OUT LPT1Base, MyByte		' вывод данных в порт
...
Status = INP (LPTControl)	' чтение регистра управления

   Если нам необходимо изменить состояние только одного из битов регистра,
сначала надо прочитать из него значение и с произвести с ним логическиую
операцию OR или AND с маской, где выставлен изменяемый бит, в зависимости от
того, хотим мы установить или сбросить этот бит. Например, требуется
установить ВЫСОКИЙ уровень на линии SLCT IN (выбор принтера). Из таблиц видим,
что этой линией управляет бит 3 регистра управления. Проделаем следующее:
   - прочитаем из этого регистра - с прочитанным значением делаем операцию OR
с маской 00001000b, при этом все немаскированные биты (значение 0 в маске),
сохранят свое прежнее значение, а бит 3 станет единцей.
   - запишем полученное в регистр
   Для сброса этой линии в НИЗКИЙ уровень делаем так:
   - прочитаем из этого регистра - с прочитанным значением делаем операцию
AND с маской 11110111b, при этом все маскированные биты (значение 1 в маске),
сохранят свое прежнее значение, а бит 3 станет нулем.
   - запишем полученное в регистр
   Рассмотрим фрагмент кода для таких операций:
   (ASM):
   установим ВЫСОКИЙ уровень
MOV DX,LPT1_CONTROL             ; загрузили адрес регистра в DX
MOV AH, 00001000b               ; маску - в AH
IN AL,DX                        ; прочитали регистр
OR AL,AH                        ; отмаскировали
OUT DX,AL                       ; записали обратно
...
; установим НИЗКИЙ
MOV DX,LPT1_CONTROL             ; загрузили адрес регистра в DX
MOV AH, 11110111b               ; маску - в AH (для циклического изменения
                                  используем NOT)
IN AL,DX                        ; прочитали регистр
AND AL,AH                       ; отмаскировали
OUT DX,AL                       ; записали обратно
...
...
                                ' установка ВЫСОКОГО уровня
Mask=8		                ' 00001000b
Value = INP (LPT1Control)
Value = Value OR Mask
OUT LPT1Control, Value
...
                                ' установка НИЗКОГО уровня
Mask=247	' 11110111b
Value = INP (LPT1Control)
Value = Value AND Mask
OUT LPT1Control, Value
...

   В статье ТАКСОФОННЫЕ СМАРТ-КАРТЫ описана читалка карточек, подсоединяемая к
LPT. Ниже помещен текст программы, использовавшейся для отладки читалки, напи-
санный на языке Basic, которую можно запускать под интерпретатором, входящим в
поставку МС-ДОС. Подпрограмма writecard() пишет 0 или 1 во все адреса карточки.
' ---
' --- PayPHONE CARDS ---
' ---
DECLARE SUB writecard ()
DECLARE FUNCTION iif$ (arg AS INTEGER, truepath AS STRING, falsepath AS STRING)
DECLARE SUB shortdelay ()
DECLARE SUB delay (value AS INTEGER)
DECLARE SUB readcard ()
DECLARE SUB cardreset ()

' using LPT#1 port

CONST lptbase = H378
CONST lptstatus = lptbase + 1
CONST lptctrl = lptbase + 2

DIM SHARED cardtype

' --------------------------
'     PinOut Connection:
' --------------------------
'  Wire    Signal    Reader
' --------------------------
'    2       D0      Reset
'    3       D1      Clock
'    4       D2      R/W
'   11      BUSY     I/O
'   25      GND      GND
' --------------------------

start:

CLS	' clear screen

PRINT "Select casd type ISO1 - [1]  or ISO2 - [2]:"

locr0:	' loop cicle waiting when user press a key
a$ = UCASE$(INKEY$)
IF a$ = "1" THEN cardtype = 1: GOTO locr1
IF a$ = "2" THEN cardtype = 2: GOTO locr1
GOTO locr0

locr1:

PRINT "Insert a card and press [R] for Reading; [W] for Writing."

loc0:	' loop cicle waiting when user press a key
a$ = INKEY$
a$ = UCASE$(a$)	' this function make upper-case char
IF a$ = "R" THEN GOTO reading
IF a$ = "W" THEN GOTO writing
GOTO loc0

reading:

OUT lptctrl, datanorm		' port initialization

CLS		' clear screen

PRINT "Resetting card. Please wait..."

cardreset

CLS

PRINT "Reading card:"
PRINT
PRINT "    byte number     bit number       value        descrtption"
PRINT "     Dec Hex     7 6 5 4 : 3 2 1 0   Dec Hex       (optional)"
PRINT "--8<------------ | | | |   | | | | --------------------------"

readcard

PRINT "--8<---------------------------------------------------------
PRINT
PRINT "[N] for new card or [Q] for quit"

loc1:	' loop cicle waiting when user press a key
a$ = INKEY$
a$ = UCASE$(a$)
IF a$ = "N" THEN GOTO start
IF a$ = "Q" THEN END
GOTO loc1

writing:

CLS
PRINT "Resetting card..."
cardreset
CLS
PRINT "Writing card"
LOCATE 2, 2: PRINT STRING$(32, "°")

writecard

PRINT "Now test reading card. Press a key"
SLEEP		' wait for user press a key
GOTO reading

tr1:
PRINT "Ops! An error "; ERR; " occured."

END

' ------------------------------
' SubRoutines & Functions
' ------------------------------

SUB cardreset
   IF cardtype = 2 THEN
      OUT lptbase, &H4        ' CLK & RESET DOWN
      delay 1
      OUT lptbase, &H6        ' CLK UP
      delay 1
      OUT lptbase, &H4        ' CLK DOWN
      delay 1
      OUT lptbase, &H0        ' RESET UP - to normal position
      delay 1
   ELSE
      OUT lptbase, &H0        ' CLK & RESET DOWN
      delay 1
      OUT lptbase, &H2        ' CLK UP
      delay 1
      OUT lptbase, &H0        ' CLK DOWN
      delay 1
      OUT lptbase, &H1        ' RESET UP - to normal position
      delay 1
   END IF
END SUB

' ---------------------------

SUB delay (value AS INTEGER)
   DIM t AS SINGLE
   t = TIMER + value / 100
   WHILE t > TIMER: WEND
END SUB

' ---------------------------

FUNCTION iif$ (arg AS INTEGER, truepath AS STRING, falsepath AS STRING)
   IF arg THEN iif$ = truepath ELSE iif$ = falsepath
END FUNCTION

' ---------------------------

SUB readcard
   DIM i AS INTEGER
   DIM j AS INTEGER
   DIM bit AS INTEGER
   DIM value AS INTEGER
   DIM french AS INTEGER
   CONST true = -1, false = 0

   FOR i = 1 TO 32

      ' right align the columns

      IF i < 10 THEN
       PRINT "Byte "+STR$(i)+"(0x"+iif(LEN(HEX$(i))=2,HEX$(i),"0"+HEX$(i))+")";
      ELSE
       PRINT "Byte"+STR$(i)+"(0x"+iif(LEN(HEX$(i))=2,HEX$(i),"0"+HEX$(i))+")";
      END IF

      ' start to reading new byte

      FOR j = 1 TO 8

         ' after chip has reseted
         ' we already have bit #1
         ' on I/O pin, then get it:

         bit = -NOT (-(INP(lptstatus) AND &H80) \ &H80)
         PRINT STR$(bit);

         IF j = 4 THEN PRINT " :";

         value = value + (2 ^ (8 - j) * bit)

         IF cardtype = 2 THEN

            OUT lptbase, &H0     ' drop CLK, RESET still raised
            shortdelay
            OUT lptbase, &H2     ' raise CLK
            shortdelay
            OUT lptbase, &H0     ' drop CLK
            shortdelay

         ELSE

            OUT lptbase, &H1
            shortdelay
            OUT lptbase, &H3     ' raise CLK
            shortdelay
            OUT lptbase, &H1     ' drop CLK
            shortdelay

         END IF

         ' now card have a next bit

      NEXT j

   PRINT "  " + STR$(value);
   PRINT SPACE$(5 - LEN(STR$(value)));
   PRINT "(0x" + HEX$(value) + ") ";

   ' check what screen filled and scrollup after key press
   IF i= 16 THEN
      PRINT
      PRINT "Press a key to continue...";
      SLEEP
   END IF

   PRINT

   value = 0

   NEXT i
END SUB

' ---------------------------

SUB shortdelay
   FOR t = 0 TO 1000: NEXT
END SUB

' ---------------------------

SUB writecard
   OUT lptbase, 0
   delay 5
   zero = -1 ' (pisat nuli ili edinici)
      FOR i = 1 TO 256
            IF zero THEN
               OUT lptbase, 4
               shortdelay
               OUT lptbase, 0
               shortdelay
               OUT lptbase, 2
               shortdelay
               OUT lptbase, 0
               shortdelay
               OUT lptbase, 2
               shortdelay
               OUT lptbase, 0
               shortdelay
            ELSE
               OUT lptbase, 4
               delay 1
               OUT lptbase, 0
               delay 1
               OUT lptbase, 2
               delay 1
               OUT lptbase, 0
               delay 1
               OUT lptbase, 4
               delay 1
               OUT lptbase, 0
               delay 1
               OUT lptbase, 2
               delay 1
               OUT lptbase, 0
               delay 1
               OUT lptbase, 2
               delay 1
               OUT lptbase, 0
               delay 1
            END IF
         LOCATE 2, 2: PRINT STRING$(i / 8, "_")
      NEXT i
END SUB

   Прграмма не является законченным средством для обработки карточек и служит
для ознакомительных целей, иллюстрируя работу с портом и подсоединенным
устройством.