КАК УПРАВЛЯТЬ ПОРТОМ ЧЕРЕЗ ПАСКАЛЬ
Я знаю что существует массив port . но как толком им пользоваться я не знаю
Цитата:
Originally posted by Hadok
как через паскаль управлять портом, например вводим цифру 2- две ячейки проводят , вводим цифру 3 две другие проводят ток.
Я знаю что существует массив port . но как толком им пользоваться я не знаю
как через паскаль управлять портом, например вводим цифру 2- две ячейки проводят , вводим цифру 3 две другие проводят ток.
Я знаю что существует массив port . но как толком им пользоваться я не знаю
port[x]:=y
portW[x]:=y
portL[x]:=y
в порт x записать y
y:=port[x];
в y записать значение из порта x.
например port[$60] - потр клавиатуры
для com lpt ...:
port[$3f8] - com1
port[$2f8] - com2
port[$378] - lpt1
Как эти числа определить сейчас сказать не могу, но потом да, через недельку премерно:D
Цитата:
Originally posted by Hadok
как через паскаль управлять портом, например вводим цифру 2- две ячейки проводят , вводим цифру 3 две другие проводят ток.
Я знаю что существует массив port . но как толком им пользоваться я не знаю
как через паскаль управлять портом, например вводим цифру 2- две ячейки проводят , вводим цифру 3 две другие проводят ток.
Я знаю что существует массив port . но как толком им пользоваться я не знаю
Дело в том, что для любого коммуникационного порта используется несколько адресов. Например для LPT1 используется не 1 адрес, а, по-моему, аж 8. Если хочешь могу дать описание всего процесса управления портом LPT1
Обычно этот порт имеет базовый адрес 378h (LPT1), 278h (LPT2), 3BCh (LPT3). Окончание "h" свидетельствует о шестнадцатиричной системе счисления, так уж принято записывать адреса. Порт занимает три адреса, первый из них называется базовым. Так, для LPT1 диапазон занимаемых им адресов: 378h-37Ah. Базовый адрес служит для посылки/чтения байта на/из линии d0-d7 (пины 2-9 разъёма DB-25). Посылка не инвертируется. Приведу фрагмент программы, посылающей в порт число 170.
{начало программы}
...
begin
Port[$378]:=170
end.
{конец программы}
При запуске её на линиях d0-d7 появится число 170 в двоичном виде, что соответсвует 10101010. Т.е. единичный сигнал будет присутствовать на выводах d1, d3, d5, d7 (обозначени выводов начинается с d0!). Число 170 останется на выводах разъёма до тех пор, пока ты не перешлёш туда же другое число (это может сделать и другая программа) или не выключите компьютер. Заметь, что адрес порта в команде задан в шестнадцатиричном виде, а посылка - в десятиричном. Если вместо команды
Port[$378]:=170;
ты примениш
d:=Port[$378];
где d - некоторая переменная, то переменная примет значение последнего посланного в порт байта или, при переходе в режим приёма, значение байта, поданного на порт внешним устройством.
Базовый+1 адрес (379h для LPT1) служит для чтения состояний принтера, поступающих на входы ACK, -BUSY, PE, SLCT, ERROR. Сигнал -BUSY - инвертированныё, т.е. при подаче на него +5В компьютер будет считывать "0". Для опроса линий используются только старшие 5 битов. "1" в третьем бите соответствует высокому уровню сигнала на входе ERROR. В четвёртом бите она индицирует о высоком уровне сигнала на входе SLCT, в пятом - на входе PE. Единица в шестом бите соответствует высокому уровню сигнала на ACK, а ноль в седьмом - выскому уровню на -BUSY. Если твой компьютер имеет однонаправленный порт передачи данных, то эти пять линий предоставляют единственную возможность в опросе состояний внешних датчиков.
Ниже - пример программы, опрашивающей входные линии порта:
begin
d:=Port[$379]
end.
В переменной d после выполнения программы будет отображено состояние порта. Допустим, переменная вернула значение 126. В двоичном виде оно выглядит как 01111110. Младшие (правые) три бита (нулевой, первый и второй) не используются, и всегда равны 1, 1 и 0. Третий бит - 1, значит на ERROR высокий уровень. Та же ситуация на SLCT, PE, ACK и BUSY.
Базовый+2 адрес (37Ah) служит для записи битов на линии -STROBE, -AUTO FD, INIT, -SLCT IN. Нулевой бит посылает сигнал на -STROBE, первый - на -AUTO FD, второй - на INIT, и четвёртый - на -SLCT IN. Принцип записи - тот же, что и по базовому адресу. Нам же очень интересны следующие биты: Пятый бит служит для разрешения/запрещения прерывания от внешнего устройства. Это полезно, если ты умееш писать обработчики прерываний.
Шестой бит служит для перевода линий d0-d7 в режим приёма!!! Но перед этим необходимо убедиться, что в BIOS в типе порта поставлено SPP/EPP. Вот пример программы, которая считывает бит с линий данных:
begin
Port[$37A]:=32; {32 "зажигает" единицу в шестом бите}
d:=Port[$378];
end.
Если ты собрал устройство, которое через порт принтера опрашивает, допустим, один датчик, подключенный к d0 (pin 2), а остальные линии просто оставил "висеть" на воздухе, то в случае, когда на втором контакте порта будет единица, принимаемый байт будет не "1" а 255, т.к. неподключенные контакты имеют высокий уровень.