Паралельні інтерфейси Centronics і LPT-порт

[ виправити ] текст може містити помилки, будь ласка перевіряйте перш ніж використовувати.

скачати

Введення

Паралельні інтерфейси характеризуються тим, що в них для передачі біт у слові використовуються окремі сигнальні лінії, і біти передаються одночасно. Паралельні інтерфейси використовують логічні рівні ТТЛ (транзисторних-транзисторної логіки), що обмежує довжину кабелю через невисоку перешкодозахищеності ТТЛ-інтерфейсу. Гальванічна розв'язка відсутня. Паралельні інтерфейси використовують для підключення принтерів. Передача даних може бути як односпрямованої (Centronics), так і двобічної (Bitronics). Іноді паралельний інтерфейс використовують для зв'язку між двома комп'ютерами - виходить мережа, "зроблена на коліні" (LapLink). Нижче будуть розглянуті протоколи інтерфейсів Centronics, стандарт IEEE 1284, а також реалізують їх порти PC.

Інтерфейс Centronics і LPT-порт

Для підключення принтера по інтерфейсу Centronics в PC був введений порт паралельного інтерфейсу - так виникла назва LPT-порт (Line PrinTer - порядковий принтер). Хоча зараз через цей порт підключаються не тільки построкові принтери, назва "LPT" залишилося.

Інтерфейс Centronics

Поняття Centronics відноситься як до набору сигналів і протоколу взаємодії, так і до 36-контактного роз'єму на принтерах. Призначення сигналів наведено в табл. 1. Інтерфейс Centronics підтримується принтерами з паралельним інтерфейсом. Його вітчизняним аналогом є інтерфейс ІРПР-М. Традиційний порт SPP (Standard Parallel Port) є односпрямованим портом, через який програмно реалізується протокол обміну Centronics. Порт виробляє апаратне переривання по імпульсу на вході Ack #. Сигнали порту виводяться на роз'єм DB-25S (розетка), встановлений безпосередньо на платі адаптера (або системної плати) або сполучається з нею плоским шлейфом. Назва та призначення сигналів рознімання порту (табл. 2) відповідають інтерфейсу Centronics.

Таб. 1. Призначення сигналів Centronics.

Сигнал

I / O *

Контакт

Призначення

Strobe

I

1

Строб даних. Дані фіксуються за низьким рівнем сигналу

Data [0:7]

I

2-9

Лінії даних. Data 0 (контакт 2) - молодший біт

Ack #

0

10

Acknowledge - імпульс підтвердження прийому байта (запит на прийом наступного). Може використовуватися для формування запиту переривання

Busy

0

11

Зайнято. Прийом даних можлива тільки при низькому рівні сигналу

PaperEnd

0

12

Високий рівень сигналізує про кінець паперу

Select

0

13

Сигналізує про включення принтера (обичноно в принтері з'єднується резистором з ланцюгом +5 В)

AutoLF #

I

14

Автоматичний переклад рядка. При низькому рівні принтер, отримавши символ CR (Carriage Re turn - повернення каретки), автоматично виконує і функцію LF (Line Feed - новий рядок)

Error

0

32

Помилка: кінець паперу, стан OFF-Line або внутрішня помилка принтера

lnit #

I

31

Ініціалізація (скидання в режим параметрів умовчання, повернення до початку рядка)

Select ln #


36

Вибір принтера (низьким рівнем). При високому рівні принтер сприймати інші сигнали інтерфейсу

GND

-

19-30, 33

Загальний провід інтерфейсу

Рис. 1. Передача даних по протоколу Centronics

Таб. 2. Назва та призначення сигналів рознімання порту

Контакт DB-25S

Номер проводу в кабелі

Призначення



I / O *

Reg. Bit **

Сигнал

1

1

0 / 1

CR.O

Strobe

2

3

0 (1)

DR.0

Data 0

3

5

0 (1)

DR.1

Data 1

4

7

0 (1)

DR.2

Data 2

5

9

0 (1)

DR.3

Data3

6

11

0 (1)

DR.4

Data 4

7

13

0 (1)

DR.5

Data 5

8

15

0 (1)

DR.6

Data 6

9

17

0 (1)

DR.7

Data 7

10

19

1 ***

SR.6

Ack #

11

21

1

SR.A

Busy

12

23

1

SR.5

PaperEnd

13

25

1

SR.4

Select

14

2

0 / 1

CR.1

Auto LF #

15

4

1

SR.3

Error *

16

6

0 / 1

CR.2

lnit #

17

8

0 / 1

CR.3

Select ln #

18-25

10, 12,14,

16, 18.20,

22, 24, 26

-



* I / O задає напрям передачі (вхід / вихід) сигналу порту. 0 / 1 позначає вихідні лінії, стан яких зчитується при читанні з портів виведення; (I) - вихідні лінії, стан яких може бути лічено тільки при особливих умовах (див. нижче).

** Символом "\" відзначені інвертовані сигнали (1 в регістрі відповідає низькому рівню лінії).

*** Вхід Ack # з'єднаний резистором (10 кОм) з харчуванням +5 В.

Традиційний LPT-порт

Адаптер паралельного інтерфейсу є набором регістрів, розташованих в просторі введення / виводу. Регістри порту адресуються щодо базової адреси порту, стандартними значеннями якого є 3BCh, 378h і 278h. Порт може використовувати лінію запиту апаратного переривання, звичайно IRQ7 або IRQ5. Порт має зовнішню 8-бітну шину даних, 5-бітну шину сигналів стану і 4-бітну шину керуючих сигналів, BIOS підтримує до чотирьох (іноді до трьох) LPT-портів (LPT1-LPT4) своїм сервісом - перериванням INT 17h, які забезпечують них зв'язок з принтером по інтерфейсу Centronics. Цим сервісом BIOS здійснює виведення символу (за опитуванням готовності, не використовуючи апаратних переривань), ініціалізацію інтерфейсу й принтера, а також опитування стану принтера.

Стандартний порт має три 8-бітових регістра, розташованих по сусідніх адресах у просторі введення / виводу, починаючи з базового адреси порту (BASE). Data Register (DR) - регістр даних, адреса = ВЛ5Е. Дані, записані в той порт, виводяться на вихідні лінії інтерфейсу. Дані, лічені з цього регістра, залежно від схемотехніки адаптера відповідають або раніше записаним даним, або сигналам на тих же лініях, що не завжди одне і те ж. Якщо в порт записати байт з одиницями у всіх розрядах, а на вихідні лінії інтерфейсу через мікросхеми з виходом типу "відкритий колектор" подати якийсь код (або з'єднати ключами якісь лінії зі схемної землею), то цей код може бути лічений з того ж регістра даних. Таким чином, на багатьох старих моделях адаптерів можна реалізувати порт введення дискретних сигналів, однак вихідних ланцюгів передавача інформації доведеться "боротися" з вихідним струмом логічної одиниці вихідних буферів адаптера. Схемотехніка ТТЛ такі рішення не забороняє, але якщо зовнішній пристрій виконано на мікросхемах КМОП, їх потужності може не вистачити для "перемоги" в цьому шинному конфлікті. Однак сучасні адаптери часто мають у вихідному ланцюзі узгоджувальний резистор з опором до 50 Ом. Вихідний струм короткого замикання виходу на землю зазвичай не перевищує 30 мА. Простий розрахунок показує, що в разі короткого замикання контакту роз'єму на землю при виведенні "одиниці" на цьому резисторі падає напруга 1,5 В, що вхідний схемою приймача буде сприйнято як "одиниця". Так що такий спосіб введення не буде працювати на всіх комп'ютерах. На деяких адаптерах портів вихідний буфер відключається перемичкою на платі. Тоді порт перетворюється на звичайний порт введення.

Status Register (SR) - регістр стану; являє собою 5-бітний порт введення сигналів стану принтера (біти SR.4-SR.7), адресу == 8ЛЗЕ +7. Біт SR. 7 інвертується - низькому рівню сигналу відповідає одиничне значення біта в регістрі, і навпаки.

Призначення біт регістра стану (у дужках дано номери контактів роз'єму):

SR. 7 - Busy - інверсні відображення стану лінії Busy (11): при низькому рівні на лінії встановлюється одиничне значення біта - дозвіл на виведення чергового байта.

SR.6 - Ack (Acknowledge) - відображення стану лінії Ack # (10).

SR.5 - РЕ (Paper End) - відображення стану лінії Paper End (12). Одиничне значення відповідає високому рівню лінії - сигналу про кінець паперу в принтері.

SR.4 - Select - відображення стану лінії Select (13). Одиничне значення відповідає високому рівню лінії - сигналу про включення принтера.

SR.3 - Error - відображення стану лінії Error (15). Нульове значення відповідає низькому рівню лінії - сигналу про будь-яку помилку принтера.

SR.2 - PIRQ - прапор переривання по сигналу Ackft (тільки для порту PS / 2). Біт обнуляється, якщо сигнал Ack # викликав апаратне переривання. Одиничне значення встановлюється по апаратному скиданню і після читання регістра стану.

SR [1: O] - зарезервовані.

Control Register (CR) - регістр управління, wpec ^ BASE +2. Як і регістр даних, цей 4-бітний порт виведення допускає запис і читання (біти 0-3), але його вихідний буфер звичайно має тип "відкритий колектор". Це дозволяє коректно використовувати лінії даного регістра як вхідні при програмуванні в високий рівень. Біти О, 1, 3 інвертуються.

Призначення біт регістра керування:

CR [7:6] - зарезервовані.

CR.5 - Direction - біт управління напрямом передачі (тільки для портів PS / 2). Запис одиниці переводить порт даних в режим введення. При читанні стан біта не визначено.

CR.4 - AcklntEn (Ack Interrupt Enable) - одиничне значення дозволяє переривання по спаду сигналу на лінії Ack # - сигнал запиту наступного байта.

CR.3 - Select In - одиничне значення біта відповідає низькому рівню на виході Select ln # (17) - сигналу, дозволяючим роботу принтера по інтерфейсу Centronics.

CR.2 - Init - нульове значення біта відповідає низькому рівню на виході - сигналу апаратного скидання принтера.

CR. 1 - Auto LF - одиничне значення біта відповідає низькому рівню на виході Auto LF # (14) - сигналу на автоматичний переклад рядка (LF - Line Feed) по при йому байта повернення каретки (CR). Іноді сигнал і біт називають AutoFD або AutoFDXT.

CR.O - Strobe - одиничне значення біта відповідає низькому рівню на виході Strobeft (1) - сигналу стробування вихідних даних.

Запит апаратного переривання (обьлно IRQ7 або IRQ5) виробляється по негативному перепаду сигналу на виведення 10 роз'єму інтерфейсу (Ack #) при установці CR.4 = i. Щоб уникнути помилкових переривань контакт 10 з'єднаний резистором з шиною +5 В. Переривання виробляється, коли принтер підтверджує прийом попереднього байта. Як вже було сказано, BIOS це переривання не використовує і не обслуговує.

Процедура виведення байта по інтерфейсу Centronics включає наступні кроки (в дужках наведено необхідну кількість шинних операцій процесора):

- Висновок байта в регістр даних (1 цикл IOWR #).

- Введення з регістра стану і перевірка готовності пристрою (біт SR. 7 - сигнал Busy). Цей крок зациклюється до отримання готовності або до спрацьовування програмного тайм-ауту (мінімум 1 цикл IORD #).

Після отримання готовності висновком в регістр управління встановлюється строб даних, а наступним виведенням строб знімається (2 циклу IOWR #). Зазвичай, щоб переключити тільки один біт (строб), регістр управління попередньо зчитується, що додає ще один цикл IORD #. Видно, що для виведення одного байта потрібно 4-5 операцій вводу / виводу з регістрами порту (у кращому випадку, коли готовність виявлена ​​за першого читання регістра стану). Звідси випливає головний недолік виводу через стандартний порт - невисока швидкість обміну при значному завантаженні процесора. Порт вдається розігнати до швидкостей 100-150 Кбайт / с при повному завантаженні процесора, що недостатньо для друку на лазерному принтері. Інший недолік - функціональний - складність використання в якості порту введення.

Стандартний порт асиметричний - при наявності 12 ліній (і біт), нормально працюють на висновок, на введення працюють тільки 5 ліній стану. Якщо необхідна симетрична двунаправленная зв'язок, на всіх стандартних портах працездатний режим полубайтного обміну - Nibble Mode. У цьому режимі, званому також Hewlett Packard Bitronics, одночасно передаються 4 біти даних, п'ята лінія використовується для квитування. Таким чином, кожен байт передається за два цикли, а кожен цикл потребує щонайменше 5 операцій введення / виводу.

Розширення паралельного порту

Недоліки стандартного порту частково усували нові типи портів, що з'явилися в комп'ютерах PS / 2. Двонаправлений порт 1 (Type 1 parallel port}-інтерфейс, введений в PS / 2. Такий порт крім стандартного режиму може працювати в режимі вводу або двунаправленном режимі. Протокол обміну формується програмно, а для вказівки напрямку передачі в регістр управління порту введений спеціальний біт CR .5:0 - буфер даних працює на висновок, 1 - на введення. Не плутайте цей порт, званий також enhanced bi-directional, з ЕРР. Даний тип порту прижився і в звичайних комп'ютерах.

Порт з прямим доступом до пам'яті (Type 3 DMA parallelport) застосовувався в PS / 2 моделей 57, 90, 95. Був введений для підвищення пропускної здатності і розвантаження процесора при виведенні на принтер. Програмі, що працює з портом, потрібно тільки поставити в пам'яті блок даних, що підлягають висновку, а потім висновок по протоколу Centronics проводився без участі процесора.

Пізніше з'явилися інші адаптери LPT-портів, що реалізують протокол обміну Centronics апаратно - Fast Centronics.

Деякі з них використовували FIFO-буфер даних - Parallel Port FIFO Mode. Не будучи стандартизованими, такі порти різних виробників вимагали використання власних спеціальних драйверів. Програми, що використовують пряме управління регістрами стандартних портів, не вміли більш ефективно їх використовувати. Такі порти часто входили до складу Мультикарта VLB. Існують їх варіанти з шиною ISA, в тому числі вбудовані.

Стандарт IEEE 1284

Стандарт на паралельний інтерфейс IEEE 1284, прийнятий в 1994 році, визначає порти SPP, ЕРР і ЕСР. Стандарт визначає 5 режимів обміну даними, метод узгодження режиму, фізичний і електричний інтерфейси. Згідно IEEE 1284, можливі наступні режими обміну даними через паралельний порт:

- Режим сумісності (Compatibility Mode) - односпрямований (висновок) за протоколом Centronics. Цей режим відповідає стандартного порту SPP.

- Полубайтном режим (Nibble Mode) - введення байта в два цикли (по 4 біта), використовуючи для прийому лінії стану. Цей режим обміну може використовуватися на будь-яких адаптерах.

- Байтний режим (Byte Mode) - введення байта цілком, використовуючи для прийому лінії даних. Цей режим працює тільки на портах, що допускають читання вихідних даних (Bi-Directional або PS / 2 Type 1).

- Режим ЕРР (Enhanced Parallel Port) (EPP Mode) - двонаправлений обмін даними. Керуючі сигнали інтерфейсу генеруються апаратно під час циклу звернення до порту. Ефективний при роботі з пристроями зовнішньої пам'яті і адаптерами локальних мереж.

- Режим ЕСР (Extended Capability Port) (ECP Mode) - двонаправлений обмін даними з можливістю апаратного стиснення даних методом RLE (Run Length Encoding) і використання FIFO-буферів і DMA. Керуючі сигнали інтерфейсу генеруються апаратно. Ефективний для принтерів і сканерів.

У комп'ютерах з LPT-портом на системній платі режим - SPP, ЕРР, ЕСР або їх комбінація - задається в BIOS Setup.

Режим сумісності повністю відповідає стандартному порту SPP. Інші режими докладно розглянуто нижче.

Фізичний і електричний інтерфейси

Стандарт IEEE 1284 визначає фізичні характеристики приймачів і передавачів сигналів. Специфікації стандартного порту не задавали типів вихідних схем, граничних значень величин навантажувальних резисторів і ємності, що вноситься ланцюгами і провідниками. На відносно невисоких швидкостях обміну розкид цих параметрів не викликав проблем сумісності. Проте розширені (функціонально і за швидкістю передачі) режими вимагають чітких специфікацій. IEEE 1284 визначає два рівні інтерфейсної сумісності. Перший рівень (Level I) визначений для пристроїв повільних, але використовують зміну напрямку передачі даних. Другий рівень (Level II) визначений для пристроїв, що працюють в розширених режимах, з високими швидкостями і довгими кабелями

До передатчикам пред'являються наступні вимоги:

Рівні сигналів без навантаження не повинні виходити за межі -0,5 ... +5,5 В.

Рівні сигналів при струмі навантаження 14 мА повинні бути не нижче +2,4 В для високого рівня (УОН) і вище +0,4 В для низького рівня (VoiJ на постійному струмі.

Вихідний імпеданс Ro, виміряний на роз'ємі, має становити 50 ╠ 5 Ом на рівні VoH ~ VoL. Для забезпечення заданого імпедансу використовують послідовні резистори у вихідних ланцюгах передавача. Узгодження імпедансу передавача та кабелю знижує рівень імпульсних перешкод.

Швидкість наростання (спаду) імпульсу повинна перебувати в межах 0,05-0,4 В / нс.

Вимоги до приймачів:

Допустимі пікові значення сигналів -2,0 ... +7,0 В.

Пороги спрацьовування мають бути не вище 2,0 В (V ^) для високого рівня і не нижче 0,8 В (Vi ^) для низького.

Приймач повинен мати гістерезис в межах 0,2 ... 1,2 В (гістерезисом мають спеціальні мікросхеми - тригери Шмідта).

Вхідний струм мікросхеми (що втікають і витікаючий) не повинен перевищувати 20 мкА, вхідні лінії з'єднуються з шиною живлення +5 В резистором 1,2 кОм.

Вхідна ємність не повинна перевищувати 50 пФ.

Коли з'явилася специфікація ЕСР, фірма Microsoft рекомендувала застосування динамічних термінаторів на кожну лінію інтерфейсу. Проте в даний час йдуть специфікації IEEE 1284, в якій динамічні термінатори не застосовуються. Рекомендовані схеми вхідних, вихідних і двонаправлених ланцюгів наведено на рис. 2.

Стандарт IEEE 1284 визначає три типи використовуваних роз'ємів. Типи A (DB-25) і В (Centronics-36) використовуються в традиційних кабелях підключення принтера, тип С - новий малогабаритний 36-контактний роз'єм.

Рис. 2. Прикінцеві ланцюга ліній інтерфейсу IEEE 1284: а - односпрямований, б - двонаправлених

Традиційні інтерфейсні кабелі мають від 18 до 25 проводів, в залежності від кількості провідників ланцюга GND. Ці провідники можуть бути як перевитими, так і немає. До екрануванню кабелю жорстких вимог не висувалося. Такі кабелі навряд чи будуть надійно працювати на швидкості передачі 2 Мбайт / с і при довжині більше 2 м. Стандарт IEEE 1284 регламентує властивості кабелів.

Всі сигнальні лінії повинні бути перевитими з окремими зворотними (загальними) проводами.

Кожна пара повинна мати імпеданс 62 ╠ б Ом в частотному діапазоні 4-16 Мгц.

Рівень перехресних перешкод між парами не повинен перевищувати 10%.

Кабель повинен мати екран (фольгу), покриває менше 85% зовнішньої поверхні. На кінцях кабелю екран повинен бути окольцован і з'єднаний з контактом роз'єму.

Кабелі, що відповідають цим вимогам, маркуються написом "lEEEStd 1284-1994 Compliant". Вони можуть мати довжину до 10 метрів, позначення типів наведено в табл. 3.

Таб. 3. Типи кабелів

Тип

Розшифровка

Роз'єм 1

Штекер 2

АМАМ

Type A Male - Type A Male

А (вилка)

А (вилка)

AMAF

Туре A Male - Type A Female

А (вилка)

А (розетка)

АВ

Type A Male - Туре У Plug (стандартний кабель до принтера)

А (вилка)

У

АС

Type A Male - Type З Plug (новий кабель до принтера)

А (вилка)

З

НД

Type У Plug - Type З Plug

У

З

СС

Турі З Plug - Type З Plug

З

З

Нутрощі LPT порту

Якщо говорити на побутовому рівні, то можна сказати, що LPT порт це набір контактів, на яких ми можемо встановити напругу 0 або +5 В (логічна 0 і 1) з програми або це може зробити зовнішній пристрій зовні. Давайте розберемося, якими контактами ми можемо оперувати, а якими ні. У цьому нам допоможе рис. нижче (його малював не я, автор мені невідомий. Але він аж надто хороший, я і сам ним постійно користуюся)

З рис. видно, що висновки порту можна розділити на чотири групи: це 'земляні' висновки (не зрозуміло чим керувалися розробники інтерфейсу LPT, зробивши цих висновків аж 8 штук). Вони позначені чорним кольором (контакти 18-25). Всі вони з'єднані між собою, тому для своїх розробок в якості землі можна використовувати будь-який з них.

Червоним кольором позначено висновки так званого регістру Data (контакти 2-9). Під регістром будемо розуміти (на побутовому рівні) об'єднання групи контактів LPT порту. У регістрі Data їх 8 штук. Це найбільш розумний регістр - він дозволяє нам як з програми, так і з зовнішнього пристрою встановити на його контактах логічну 0 або 1, тобто він двонаправлений. Саме його ми й використали в нашій першій програмі Port.exe - підключали світлодіод до 2-го висновку порту (як тепер зрозуміло, цей висновок належить регістру Data, є його нульовим бітом) і 25 висновку (земля), і за допомогою програми управляли подачею напруги на висновок 2 щодо землі. Щоб звертатися до цього регістру, треба знати його адресу: 0x378 - в 16-річної системі або 888 у десятковій (на рис. Написано & H378 - це теж саме що і 0x378, просто перше позначення властиво мови Pasсal і йому подібним, ми ж пишемо на Сі).

Знову згадуючи програму Port.exe, зауважимо, що зверталися ми до регістру за допомогою наступної функції _ outp (Address, 0); де змінна Address була попередньо визначена як 888. Тепер зрозуміло, що цим ми вказували функції _outp, що ми хочемо працювати саме з регістром Data.

Продовжимо розгляд порту. Залишилося ще два регістри. Наступним буде регістр Status (контакти 10-13, 15). Це односпрямований регістр. Керувати ним можна тільки з зовні, через зовнішній пристрій (мається на увазі змінювати дані на ньому, читати можна з будь-якого регістра в будь-яку сторону). Він має адресу 0x379 - в 16-річної системі або 889 у десятковій. І регістр Control (контакти 1, 14, 16-17). Він має всього 4 контакту і може управлятися лише програмою. Його адреса: 890 в десятковій системі.

У результаті ми отримали:

8 двонаправлених контактів (регістр Data) - дані туди може записати і програма і зовнішній пристрій

5 односпрямованих контактів (регістр Status) - дані туди може записати тільки зовнішній пристрій

4 односпрямованих контакту (регістр Control) - дані туди може записати тільки програма

Висновок: у нас є 17 висновків якими ми можемо управляти на свій розсуд.

Тепер розглянемо, а як відбувається запис і читання даних в регістри LPT порту, тобто як нам встановити на потрібних висновках 0 або 1.

Запис / читання даних у регістр Data

Отже, розглянемо відразу практичну задачу. Хочу щоб на виведенні регістру Data під номером 3 (3 - це номери виведення LPT порту) була встановлена ​​логічна 1 (тобто щоб між ним і землею було +5 В) і на інших висновках цього регістра (2,4-9 висновки порту) були нулі. Пишемо код:

int Address = 888;

int data = 2;

Out32 (Address, data);

Я використовував функцію Out32 бібліотеки inpout32.dll, будемо звикати до неї, тому що подальші приклади будемо розбирати саме на цій бібліотеці. Якщо цей код виконати, то вийде що на виводі порту 3 є +5 В, а на 2,4-9 висить нуль. Як це вийшло?

Почнемо розбиратися: першим параметром функції Out32 ми передаємо число 888. Як Ви вже знаєте, це адреса регістра Data LPT порту. Тепер функція знає куди їй писати дані. Далі другим параметром ми передаємо число 2. Прошу звернути увагу, що двійка в десятковій системі числення. Що далі робить функція? Їй треба цю двійку запхнути в регістр Data, а от проблема: регістр абсолютно не розуміє що таке 2. Він знає 0 або 1. Більше нічого. Тоді функція як би "переводить цю двійку у двійкову систему числення" (це не зовсім вірно, але для пояснення на пальцях згодиться) і кожен розряд двійкового числа справа наліво, записує по порядку в регістр починаючи з молодшого розряду D0 (вивід 2 порту) і закінчуючи старшим D7 (висновок 9). Якщо Ви перекладете число 2 з десяткової в двійкову систему числення то отримаєте 10. Функція бере перший розряд двійкового числа - це 0 (саму праву) і пише її в D0, далі бере 1 і пише її в D1. Оскільки регістр 8-ми розрядний (у нього є 8 контактів), функція продовжує брати дані з права на ліво і писати в наступний біт регістра. Оскільки наше число закінчилося, то функція як би дописує нулями наше двійкове число зліва, щоб воно стало 8-ми розрядним. Ця операція змістом не суперечить, тому що наприклад, що 23 руб. так і 00023 руб. - Одне і теж.

Ну що, мозок опух поки прочитали? Зараз стане зрозуміліше. Давайте в регістр Data запишемо число 245. Пишемо код:

int Address = 888;

int data = 245;

Out 32 (Address, data);

Знову переводимо 245 в двійкову систему числення і праворуч на ліво записуємо розряди вересня відповідні біти регістра. У результаті отримаємо, що на висновках LPT порту під номерами 2,4,6-9 присутня напруга +5 В, на висновках 3,5 нуль.

Ну що, тепер я думаю, з записом даних у регістр Data ми розібралися. Треба відзначити, що діапазон десяткових чисел, які можна записати в регістр Data лежить в межах від 0 до 255. Регістр він у нас 8-ми розрядний, значить Максимальна кількість комбінації 0 і 1 на його висновках становить 2 8 -1 = 256-1 = 255.

Читання даних

Тепер давайте отримаємо дані з порту, а саме з його регістра Data, до нас в програму. Ми хоті дізнатися, на яких висновках регістру Data зараз високий рівень напруги, а на яких низький. Пам'ятайте, вище ми записали в порт число 245? Давайте його зараз отримаємо з порту. Пишемо код:

int Address = 888;

int data;

data = Inp 32 (Address);

Inp32 це функція для читання даних з порту бібліотеки inpout32.dll. Єдиним параметром для неї є адреса того регістра, звідки ми хочемо прочитати дані. На виході вона повертає десяткове число, відповідне поточному вмісту регістра. Виконавши цей код, мінлива data буде містити число 245. Що це означає? Щоб розібратися, переводимо число 245 з десяткової в двійкову і сміливо можемо сказати, що на висновках порту 2,4,6-9 зараз +5 В а на висновках 3,5 0 В. (див. рис. Вище)

Як я вже згадав вище, до реєстру Data дані записати може і зовнішній пристрій. Проте розгляд цього питання поки що залишимо, тому що це зажадає зовнішніх джерел живлення. Спочатку, давайте повністю розберемося з базовими операціями.

Запис / читання даних у регістр Control

Тепер по управляємо регістром Control. Він односпрямований, дані в нього може записати тільки наша програма. Зверніть увагу на кілька особливостей цього регістра. По-перше, про містить лише чотири робочих виводу. Значить у нього можна записати число в діапазоні від 0 до 2 4 -1 = 16-1 = 15. По-друге, він має дуже неприємну особливість: деякі з його висновків інвертовані, тобто якщо Ви на цей висновок пишете 1, то на ній встановлюється 0. І навпаки, читаєте 1, а насправді там 0. Тому, значення записуваних даних і читаних дані не зовсім очевидні. Для розбору необхідно просто спробувати писати в регістр різні дані і дивитися, що виходить. Наведу приклад запису числа в регістр Control. Пишемо код:

int Address = 890; / / адреса регістра Control

int data = 10;

Out32 (Address, data);

І приклад читання:

int Address = 890; / / адреса регістра Control

int data;

data = Inp32 (Address);

Запис / читання даних у регістр Status

Нарешті, дісталися до регістру Status. Він односпрямований, дані в нього може записати тільки зовнішній пристрій, тобто ми в програмі можемо тільки читати вміст цього регістру. Нараховуються дані з Status, і перевівши їх у двійкове число, відразу досить важко зрозуміти що ж реально діється з напругами на виходах цього регістра. По-перше, він теж має інвертовані висновки, а по-друге робочими є біти під номерами 4-7, а 0-3 не використовуються, і отже число записується досить хитро. Щоб розібратися, краще просто кілька разів робити читання при різних даних у реєстрі.

Виникає питання, а як ці дані на ньому встановити? Досить просто. В якості зовнішнього пристрою, поки, будете виступати Ви. Виконайте такий код.

int Address = 889; / / адреса регістра Status

int data;

data = Inp32 (Address);

Ви отримаєте деяке число. Тепер візьміть провідник і з'єднайте їм будь-який із земляних висновків порту (18-25) з яким-небудь висновком регістру Status (10-13, 15), наприклад з десятим. І знову виконайте читання. Ви отримаєте інше число. Приберіть провідник. Прочитавши, отримуєте вихідне число. Як це працює? Початково, на всіх висновках цього регістра знаходиться високий рівень напруги +5 В. Коли ми з'єднали один з його висновків із землею, то на ньому, відповідно, напруга стало рівним нулю, тобто логічний нуль. Тепер двійковим даними в регістрі відповідає інше десяткове число. Можна спробувати замикати й інші висновки регістру Status на землю, замикати відразу декілька. Кожного разу при читанні вийде різний результат.

Слід зауважити, що при таких дослідах з регістром Status виникає не зовсім зрозуміла ситуація з іншими висновками порту LPT. Після першого замикання висновків Status, починають мигати висновки Data і Control. Це пов'язано з тим, що порт LPT призначений для підключення принтера, а висновки Status він використовує, для того щоб повідомити комп'ютера деяку службову інформацію. Зміни на висновках Status реєструє системний драйвер операційної системи. Він же проводить і дії у відповідь, для нас спостерігаються у вигляді періодичної зміни стану інших висновків. Тут вже ні чого не поробиш. Я зазвичай, просто на початку роботи з портом роблю замикання який-небудь лінії регістру Status на землю і чекаю приблизно хвилину, поки драйвер не втихомириться. Після цього порт вільний, і нові операції над регістром Status не призводять до неконтрольованих процесів в порту.

Додати в блог або на сайт

Цей текст може містити помилки.

Програмування, комп'ютери, інформатика і кібернетика | Реферат
86.5кб. | скачати


Схожі роботи:
Послідовні інтерфейси СОМ-порт
Навігаційний проект переходу судна типу Сормовський за маршрутом порт Анапа порт Порт-Саїд
Навігаційний проект переходу судна типу Буг за маршрутом порт Феодосія порт Палермо
Навігаційний проект переходу судна типу Сормовський за маршрутом порт Ялта порт Неаполь
Навігаційний проект переходу судна типу Орель за маршрутом порт Новоросійськ порт Трапані
Навігаційний проект переходу судна типу ДЕСНА за маршрутом порт Скадовськ порт Марсель
Навігаційний проект переходу судна типу Волго - Балт за маршрутом порт Одеса порт Трієст
Навігаційний проект переходу судна типу Волго-Балт за маршрутом порт Анапа порт Тріполі Лівія
Використання інтерфейсу Centronics для керування зовнішніми пристроями
© Усі права захищені
написати до нас