Режим
|
Напрям
|
Швидкість, Кбайт/с
|
Півбайтовий (4біт)
|
ввід
|
50
|
байтовий
|
ввід
|
50
|
сумісний
|
вивід
|
150
|
ЕРР
|
ввід/вивід
|
500-2000
|
ЕСР
|
ввід/вивід
|
500-2000
|
Після 1993 – ЕРР/ЕСР
Двонаправлений порт 1 (Type1
parallel port), вперше використаний в комп’ютерах PS/2. Дозволяє передачу і
прийом через регістр даних. Напрям передачі вказує спеціальний біт регістру
управління CR5 (від 0) (=0 – вивід, 1 - ввід).
Порт з прямим доступом до
пам’яті (Type 3 DMA parallel port), для PS/2 моделей 57, 90, 95.
Для введення даних звичайно
використовується режим півбайтного обміну (4біт – Nible Mode) Паралельний порт розміщений на
материнській платі або на платі розширення (мультикарті).
Протоколи
1) Стандартний протокол
LPT-порта (SPP – Standard Parallel Port) – однонапрявлений порт, на базі якого
програмно реалізується протокол обміну Centronics.
2) протокол порта з
розширеними можливотсями (ECP – Extended Capability Port).
Протокол SPP / ECP – в BIOS.
3. Фізичний і електричний
інтерфейс
Фізичні характеристики
передавачів і приймачів сигналів визначає стандарт ІЕЕЕ 1284 (1994 рік).
Вимоги до передавачів:
1) рівні сигналів без
навантаження повинні бути в межах від -0,5В до +5,5В.
2) рівні сигналів при струмі
навантаження 14 мА повинні бути не нижчі +2,4В для високого рівня (VOH, Volt
Out H) і +0,4В для низького рівня (VOL).
3) вихідний опір 50 Ом (+/-
5).
4) Швидкість наростання
(спаду) імпульсу у межах 0,05 – 0,4 В/нс.
Вимоги до приймачів:
1) допустимі пікові значення
сигналу від -2,0 до 7 В.
2) поріг спрацьовування 2,0 В
для високого рівня (VIH) і 0,8 В для низького рівня (VIL).
3) вхідний струм не більше 20
мА.
4) вхідна ємність не більше
50 пФ.
Стандарт визначає три типи
роз’ємів:
А - роз’єм в комп’ютері (DB-25)
/ ІЕЕЕ 1284-А
В - на принтері (Centronics-36)
/ ІЕЕЕ 1284-В
С - малогабаритний роз’єм (36
контактів)/ ІЕЕЕ 1284-С
Вимоги до кабелів:
1) кожна лінія повинна мати
хвильовий опір (імпеданс) 62 Ом( +/- 6 Ом) у частотному діапазоні 4 – 16 МГц.
2) рівень перехресних
перешкод між парами провідників не більше 10%.
3) вита пара (для принтерів
НР)
Якщо кабель фольгований і всі
сигнальні лінії перевиті, то довжина до 10м (до 2 Мбайт/с).
Хост – комп’ютер, що володіє
паралельним портом.
Програмне управління портами
принтера
Управління портами можливе
мовою асемблера, але більш зручно використовувати асемблері вставки на мові
високого рівня (Turbo Pascal 7.0). Асемблерний блок може розміщуватися як в
тесті основної програми, так і в тексті процедури. Початок асемблерного блоку
позначається службовим словом asm, кінець блоку позначається службовим словом
end. У такому випадку в асемблерній вставці можна писати безпосереднього
арифметичні і логічні команди, команди переходу і вводу-виводу.
Простота програмування –
доступ до кожного біта.
Розглянемо
програму Port.pas, яка повинна записати в порт принтера 1 байт даних, а потім
зчитати з порта принтера 1 байт. Процедура Write_Port1(Bout) виконує запис 1
байту в порт, процедура Read_Port2(Bin) зчитує 1 байт з порта.
PROGRAM
Port;
USES
Crt; CONST Port1=$00378; Port2=$00379; { Адреси портiв } VAR Bin,BOut:byte;
Begin
asm
mov
dx,port1 { Адреса порта } mov al,bOut
out
dx,al { вивід даних bOut в порт }
end;
End;
Procedure
Read_Port2(var Bin:byte); Var b0:byte;
Begin
asm
mov
dx,port2 in al,dx { зчитування даних з порта }
mov
b0,al
end;
Bin:=b0;
End;
BEGIN
ClrScr;
writeln('Програма з асемблерними вставками для роботи з портами '); bOut:=$08;
Write_Port1(BOut);
writeln(' В порт записано значення BOut = ',BOut);
Read_Port2(Bin);
writeln(' З порта зчитано значення Bin = ',Bin); readln;
END.
Для зчитування
/запису даних через порти зручно написати спеціалізовані процедури, які будуть
також проводити первинну обробку даних. Обробка бітів можна приводити в
Асемблері, або ж перетворити байт b1 даних у масив бітів mb[7],.. mb[0] (у
двійкове число, 7 - 0111) на мові високого рівня (Паскаль) і оперувати тільки
елементами цього масиву (зменш. Швидкість).
1. Маскування –
встановлення фільтру, тобто операції виконуються тільки з певними бітами.
Asm
Mov al,ba
And al,0100 0000b
Mob b2,al
end
2. Інверсія
виконується на рівні асемблеру () або нарівні Паскалю.
neg al
3. Зсув. В
асемблері зсув , у Паскалі зсув на n бітів вправо означає ділення на 2n.
В Паскалі є також
наступні команди роботи з портами:
Adres:=$00378;
Port[Adres]:=255;
// запис 1111 1111
B1:=port[Adres+1];
// зчитування
Стробування
Швидкість обміну
через порт принтера залежить від швидкодії комп’ютера. Тому для зовнішніх
пристроїв низької і середньої швидкодії потрібно забезпечувати затримку
сигналів (наприклад стробу) на певні проміжки часу (затримка 1 мс: в Паскалі :
Delay(1) , в – Delphi : Sleep(1)).
У процесі початкового
тестування POST BIOS перевіряє наявність паралельних портів LPT1-LPT4 по
адресах 3BCh, 378h, 278h і поміщає базові адреси виявлених портів в пам’ять за
адресами: 0:0408h, 040Ah, 040Ch, 040Eh. Після виявлення порти ініціалізуються –
на порт подається сигнал Init і в порт записуються нульові значення.
Програмне переривання BIOS int
17h забезпечує наступні функції підтримки LPT-порту:
00h - вивід символу з
регістру AL, строб формується після готовності принтера
01h - ініціалізація принтера
02h - опитування стану
принтера
При виклику INT 17h номер
функції задається в регістрі AH, а номер порту – у регістрі DX (0 – LPT1, 1 –
LPT2..). Дані з порта повертаються у регістр AH.
Використання переривань: LPT1
– IRQ7, LPT2 – IRQ5.
4. Проектування апаратури для
спряження з Centronics
Для Centronics
характерні такі особливості:
1)
обмін
даними є програмно-керованим (обробка переривань і прямий доступ до пам’яті
неможливі).
2)
Невисока
швидкість обміну
3)
Обмеження
на довжину лінії зв’язку (2м)
4)
Немає
шини живлення.
Розглянемо
підключення до комп’ютера найпростішого пристрою – набору світло діодів і
кнопок.
Для керування
використано сигнали Strobe – стробування запису даних та Init – очистка
регістру.
Після світло
діода сигнал з напругою (0, +5В ) і струмом 10мА можна подати на підсилювач
напруги та струму і далі на виконавчий пристрій. Для безпосереднього керування
виконавчими пристроями використовують тиристори, оптопари, реле.
Рис.9.2.
Під’єднання до комп’ютера зовнішнього пристрою через Centronics
Для збільшення
розрядності вхідних даних використовують мультиплекс ори (вхід – 16 біт, вихід
– 4 ), а для збільшення розрядності вихідних даних – демультиплексори (вхід – 4
біт, вихід – 16 біт). Для побудови мультиплексорів використовують буфери з
трьома станами (0В, 5В, відключено), наприклад К155ЛП8.
Для формування
команд – дешифратори (напр.. К155ИД3 : на вхід біти D0-D3, на виході команди
K0-K15).
Рис. 2. Разъем интерфейсного адаптера Cetronics
DB-25S
5. Програмування паралельного
порта під Windows NT/2000/XP
Windows працює з
портами як з файлами і вимагає точного дотримання протоколу обміну даними.
Наприклад при передачі навіть одного біту на паралельний порт система вимагає
також відпрацювання сигналів Strobe і Ask (відповідь – підтвердження).
Спочатку порт
потрібно відкрити як файл функцією CreateFile, що надається Win32 API i
прототип якої:
HANDLE
CreateFile(
LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwSharedMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDistribution,
DWORD dwFlagAndAttributes,
HANDLE hTemplateFile
); де:
lpFileName - назва
порта: COM1, COM2, ..., LPT1, LPT2, ..
вказівник на
рядок з нульовим символом у кінці (PCHAR) , яка визначає назву об’єкту, що створюється
(файл, канал, почтовый слот, ресурс связи (в данном случае порты), дисковое
устройство, приставка, или каталог)
dwDesiredAccess -
тип доступу до файлу: GENETIC_READ - файл для зчитування, GENETIC_WRITE - файл
для запису, GENETIC_READ | GENETIC_WRITE - файл для зчитування / запису.
lpSecurityAttributes
- атрибут захисту файлу (=Null)
dwCreationDistribution
Определяет поведение
функции если объект уже существует и как он будет открыт в этом случае
Принимает одно из следующих значений :
CREATE_NEW
Создает новый объект
(файл) Выдает ошибку если указанный объект (файл) уже существует.
CREATE_ALWAYS
Создает новый объект
(файл) Функция перезаписывает существующий объект (файл)
OPEN_EXISTING
Открывает объект (файл)
Выдает ошибку если указанный объект (файл) не существует.(Для более детального
смотрите SDK)
OPEN_ALWAYS
Открывает объект (файл),
если он существует. Если объект (файл) не существует, функция создает его, как
будто dwCreationDistribution были CREATE_NEW.
TRUNCATE_EXISTING
Открывает объект (файл).
После этого объект (файл) будет усечен до нулевого размера.Выдает ошибку если
указанный объект (файл) не существует
DwFlagsAndAttributes
Атрибуты объекта (файла),
атрибуты могут комбинироваться
· FILE_ATTRIBUTE_ARCHIVE
· FILE_ATTRIBUTE_COMPRESSED
· FILE_ATTRIBUTE_HIDDEN
· FILE_ATTRIBUTE_NORMAL
· FILE_ATTRIBUTE_OFFLINE
· FILE_ATTRIBUTE_READONLY
· FILE_ATTRIBUTE_SYSTEM
· FILE_ATTRIBUTE_TEMPORARY
HTemplateFile
Определяет дескриптор с
GENERIC_READ доступом к временному объекту(файлу). Временный
объект(файл)поставляет атрибуты файла и расширенные атрибуты для создаваемого
объекта (файла) ИСПОЛЬЗУЕТСЯ ТОЛЬКО В WINDOWS NT Windows 95: Это значение
должно быть установлено в Nil.
LPTPort := 'LPT1';
hCommFile := CreateFile(Pchar(LPTPort),
GENERIC_WRITE, 0, nil,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
0);
6.
Використання бібліотеки IO.DLL для
доступу до портів у Windows 95/98/NT/2000/XP
При використанні DOS
і
Windows 95/98
доступ до портів вводу/виводу (I/O
ports) комп’ютера був
відносно простим. Проте у Windows
NT/2000/XP
(захищена операційна система) доступ до портів вв/вив значно ускладнився за
рахунок віртуалізації апаратного забезпечення (virtualize
hardware). Віртуалізація
означає, що програма вже не може звертатися безпосередньо до фізичного
пристрою, а звертається тільки до драйвера, який емулює (emulates)
роботу фізичного пристрою (відеоадаптеру, клавіатури, звукової карти чи
принтера). Програмна емуляція фізичних пристроїв (хороший стиль для станд.
задач) з одного боку підвищує надійність і захищеність роботи операційної
системи (помилкові команди перехоплюються), а з іншого обмежую можливості
керування нестандартними зовнішніми пристроями через порти вв/вив.
Тому команди вводу/вив в порт (IN
and OUT)
у Windows NT/2000/XP
не працюють, а операційна система працює із зовнішніми пристроями як з файлами
(команди запису/зчитування з файлу). Крім ускладнення програмування
використання драйвера як посередника значно змекншує швидкодію операцій вв/вив.
Тому для роботи з портами розроблена
динамічно під’єднувана бібліотека IO.DLL,
що дозволяє зручно виконувати команди вв/вив даних у порти для 95/98
and NT/2000/XP.
/ Licensing IO.DLL
is completely free! /
Download
io.zip
46k (Contains all
the files) io.dll
46k
The following two
files are for C++ users. There is more info on these in the prototypes section.
io.cpp
1k io.h
1k
C/C++
Prototypes
void WINAPI PortOut(short int Port, char Data);
void WINAPI PortWordOut(short int Port, short int Data);
void WINAPI PortDWordOut(short int Port, int Data);
char WINAPI PortIn(short int Port);
short int WINAPI PortWordIn(short int Port);
int WINAPI PortDWordIn(short int Port);
void WINAPI SetPortBit(short int Port, char Bit);
void WINAPI ClrPortBit(short int Port, char Bit);
void WINAPI NotPortBit(short int Port, char Bit);
short int WINAPI GetPortBit(short int Port, char Bit);
short int WINAPI RightPortShift(short int Port, short int Val);
short int WINAPI LeftPortShift(short int Port, short int Val);
short int WINAPI IsDriverInstalled();
procedure PortOut(Port : Word; Data : Byte); stdcall; external 'io.dll';
stdcall – параметр, що визначає режим передачі параметрів процедурі (через стек). По замовчуванню параметри передаються зліва направо (Left-to-right), а для параметра – справа наліво (Right-to-left). Для виклику зовнішніх процедур використовується stdcall (calls to external code)
Опис функцій
/ Function Descriptions
Please refer
to the prototype for the particular language you are using.
PortOut
Вивід байта у спеціальний порт / Outputs
a byte to the specified port.
PortWordOut
Вивід слова (16 біт) у порт / Outputs
a word
(16-bits) to the specified port.
PortDWordOut
Вивід подвійного слова у порт / Outputs
a double word
(32-bits) to the specified port.
PortIn
Зчитування байту з порта / Reads
a byte from the specified port.
PortWordIn
Зчитування слова / Reads
a word
(16-bits) from the specified port.
PortDWordIn
Зчитування подвійного слова / Reads
a double word
(32-bits) from the specified port.
SetPortBit
Встановлення бітів порта / Sets
the bit of the specified port.
ClrPortBit
Очищення бітів порта / Clears
the bit of the specified port.
NotPortBit
GetPortBit
Повернути стан порта / Returns
the state
of the specified bit.
RightPortShift
Shifts the specified port to the right.
The LSB is returned, and the value passed becomes the MSB.
LeftPortShift
Shifts the specified port to the left.
The MSB is returned, and the value passed becomes the LSB.
IsDriverInstalled
Повертає не 0, якщо io.dll
інстальовано. Returns non-zero if io.dll is installed
and functioning.
Приклад процедур у Delphi
function IsDriverInstalled : Boolean;
stdcall; external 'io.dll'; // протопити
procedure PortOut(Port: Word; Data:
Byte);stdcall; external 'io.dll';
function PortIn(Port: Word):
Byte;stdcall; external 'io.dll';
procedure TForm1.FormCreate(Sender:
TObject);
begin
if IsDriverInstalled then
begin
Label1.Caption:='Driver ready...';
end;
end;
procedure TForm1.Button1Click(Sender:
TObject);
var
i:byte;
begin
for i:=0 to 255 do
begin
PortOut($378,i);
Sleep(200);
Application.ProcessMessages;
end;
end;
procedure TForm1.Button2Click(Sender:
TObject);
var
b:byte;
begin
b:=PortIn($379);.Text:=IntToStr(b);
end;