Программирование СОМ-порта       Только на обменРабота с USB в Turbo Pascal***

*** - Только на обмен


Программирование параллельного порта (LPT).

18-25    GND                            Signal Ground



_xLPT: Base
выводы 2,3,4,5,6,7,8,9
Status (+1)
выводы 10,11,12,13,15
Control (+2)
выводы 1,14,16,17
3xLPT: $3BC
$378
$278
$3BD
$379
$279
$2BE
$37A
$27A
2xLPT: $378
$278
$379
$279
$37A
$27A
1xLPT: $378 $379 $37A

Для обращения к регистрам LPT удобно использовать следущий алгоритм :

CONST
base=$378;
status=base+1;
control=base+2;
...


Работа с параллельным портом (LPT) :


  • base-регистры ($378 [$278 или $3BC]) :

    pas asm
    Port[$378]:=x mov al,x
    mov dx,378h
    out dx,al
    где x - число типа "byte" (0..255),
    например при посылки 170 (dec) = 10101010 (bin) на линии d0-d7 единичный сигнал будет присутствовать на выводах d1, d3, d5, d7 (обозначение выводов начинается с d0). Число 170 останется на выводах разъёма до тех пор, пока Вы не перешлёте туда же другое число (это может сделать и другая программа) или не выключите компьютер. Заметьте, что адрес порта в команде задан в шестнадцатиричном (hex) виде, а посылка - в десятиричном (dec). Если вместо команды
    Port[$378]:=170;
    Вы примените
    d:=Port[$378];
    где d - некоторая переменная, то переменная примет значение последнего посланного в порт байта или, при переходе в режим приёма, значение байта, поданного на порт внешним устройством.



  • status-регистры ($379 [$279 или $3BD]) :

    begin
        d:=Port[$379];
        writeln(d)

    end.

    Базовый+1 адрес служит для чтения состояний принтера, поступающих на входы ACK, BUSY, Paper Empty, SELECT, ERROR. Сигнал BUSY - инвертированный, т.е. при подаче на него +5В компьютер будет считывать  "0". Для опроса линий используются только старшие 5 битов. "1" в третьем (справа) бите соответствует высокому уровню сигнала на входе ERROR. В четвёртом бите она указывает на высокий уровень сигнала на входе SELECT, в пятом - на входе Paper Empty. Единица в шестом бите соответствует высокому уровню сигнала на ACK, а ноль в седьмом - высокому уровню на BUSY. Если ваш компьютер имеет однонаправленный порт передачи данных, то эти пять линий предоставляют единственную возможность в опросе состояний внешних датчиков.

    В переменной d после выполнения программы будет отображено состояние порта. Допустим, переменная вернула значение 126 (dec). В двоичном (bin) виде оно выглядит как 01111110. Младшие (правые) три бита (нулевой, первый и второй) не используются, и почти всегда равны 1, 1 и 0. Третий бит - 1, значит на ERROR высокий уровень. Та же ситуация на SELECT, Paper Empty, ACK и BUSY.




  • control-регистры ($37A [$27A или $3BE]) :

    pas asm
    Port[$37A]:=x mov al,x
    mov dx,37Ah
    out dx,al
    x - число типа "byte" (0..255).
    Нулевой бит посылает сигнал на STROBE, первый - на AUTO FEED, второй - на Initiliaze Printer, и четвёртый - на -SELECT INPUT. Принцип записи - тот же, что и по базовому адресу. Нам же очень интересны следующие биты:
    Пятый бит служит для разрешения/запрещения прерывания от внешнего устройства. Это полезно, если Вы умеете писать обработчики прерываний.
    Шестой бит служит для перевода линий d0-d7 в режим приёма. Но перед этим необходимо убедиться, что в BIOS в типе порта поставлено SPP/EPP. Вот пример программы, которая считывает бит с линий данных:

    begin
    Port[$37A]:=32; {32 "зажигает" единицу в шестом бите}
    d:=Port[$378];
    end.




    Алгоритм обмена данными :


    Схема обмена.

    Рассмотрим алгоритм обмена данными между двумя компьютерами с подтверждением (справедливо для SPP-режима LPT порта). Этот процесс показан в виде диаграммы на рисунке сбоку. Пусть первый компьютер будет передающим, а второй - принимающим.

    В момент времени t0 (начало передачи) передающий компьютер (передатчик) выставляет данные для передачи (записывает их в порт 378h). Причём в каждом цикле обмена записывается один полубайт в регистр передачи 378h, бит 3 должен быть сброшен (= 0). Таким образом значения битов 0, 1, 2, 3 данного полубайта записываются в биты 0, 1, 2, 4 регистра передачи, а бит 3 регистра передачи равен 0.

    В момент времени t1 передатчик выставляет сигнал готовности (ACK1), который означает, что данные переданы и принимающий компьютер (приёмник) может их считать из приёмного регистра 379h. Чтобы выставить сигнал готовности нужно в бит 3 регистра передачи 378h записать 1.

    В момент времени t2 приёмник определяет, что поступил сигнал готовности от передатчика и данные можно считать. Приёмник считывает данные из приёмного регистра (см. ниже) и устанавливает сигнал подтверждения приёма (ACK2). Это нужно для того, чтобы передатчик смог определить, когда можно будет посылать следующие данные. Если этого не сделать, то передатчик может послать данные в тот момент, когда приёмних их ещё не считал и это может привести к сбою передачи или приёма.

    В момент времени t3 передатчик получает сигнал подтверждения приёма (ACK2) от приёмника и сбрасывает сигнал готовности (ACK1). Это нужно для того, чтобы приёмник смог сбросить свой сигнал подтверждения (ACK2). Если этого не сделать то цикл обмена будет нарушен, так как в следущем цикле обмена передатчик не будет знать принял ли приёмник данные или нет, если сигнал ACK2 будет всегда установлен.

    В момент времени t4 приёмник определяет, что сигнал готовности (ACK1) сброшен и сбрасывает свой сигнал подтверждения приёма (ACK2). Таким образом завершается цикл обмена полубайтом - передатчик снова готов к передачи данных, а приёмник - к приёму.

    В следующем цикле посылается другой полубайт - если посылался младший полубайт, то посылается старший и наоборот. В следующем за этим цикле обмена снова посылается младший полубайт и т.д.

    При чтении данных из приёмного регистра 379h следует учитывать, что бит 7 приёмного регистра является инверсией бита 4 регистра передачи. Таким образом при чтении данных бит 7 приёмного регистра необходимо инвертировать.

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




    Хостинг от uCoz