- •1. Паралельний і послідовний порти
- •Лабораторна робота №1 Тема: Управління об’ктами за допомогою lpt порта пк.
- •1.1. Паралельний порт
- •1.1.2. Внутрішній пристрій
- •Група даних
- •Група управління
- •Група стану
- •1.1.3. Програмне управління Отримання базової адреси паралельного порту
- •Ввід/вивід даних через паралельний порт
- •Команди принтера і процедури переривань bios
- •Безпосередній доступ до регістрів порту
- •Вага біта
- •Лабораторна робота №2 Тема: Управління об’ктами за допомогою сом порта пк.
- •1.2. Послідовний інтерфейс rs232
- •1.2.1. Послідовна передача даних
- •1.2.2. Роз'єм і кабель порту rs232
- •1.2.3. Внутрішня апаратна конструкція
- •Перетворювачі напруги
- •Базові адреси сом-портів
- •1.2.4. Програмне управління Отримання базової адреси послідовного порту
- •Ініціалізація сом-порта
- •Передача і приймання послідовних даних
- •Передача даних по лініях взаємодії
- •2.4. Експериментальні плати паралельного, послідовного та ігрового портів
- •2.4.1. Експериментальна плата паралельного порту
- •2.4.2. Експериментальна плата послідовного порту
- •3. Програми управління експериментальними платами
- •3.1. Програмне забезпечення для експериментальної плати паралельного порту
- •3.1.1. Опис програми centexp.Pas
- •Текст програми centexp.Pas
- •3.2. Програмне забезпечення для експериментальної плати послідовного порту
- •3.2.1. Опис програми rs232exp.Pas
- •Текст програми rs232exrpas
- •Лабораторна робота №3 Тема: Управління об’ктами за допомогою usb порта пк.
- •Функція
- •Механізм передачі даних
Ввід/вивід даних через паралельний порт
Існує декілька способів запису інформації в паралельний порт.
Команди принтера і процедури переривань bios
У Тр6 команда виводу на друк writeln(lst). Інший спосіб управління принтером полягає у використанні переривання BIOS - INT 17h. Тимчасові діаграми виведення даних через паралельний порт показані на рис. 1.5. Спочатку комп'ютер перевіряє, чи готовий принтер до прийому нових даних. Для цього необхідно проконтролювати стан лінії BUSY. Коли на ній низький рівень («не зайнятий»), ПК записує дані в регістр даних. Через 500 нс комп'ютер переводить сигнал STROBE в низький рівень, який, у свою чергу, переводить принтер в стан «зайнятий» (BUSY=1). Принтер приймає і обробляє дані, а тоді переводить сигнал АСК в низький рівень для індикації, що прийняті дані оброблені. В той же час принтер переводить лінію BUSY в низький рівень.
Рис. 1.5. Тимчасові діаграми взаємодії комп'ютера з принтером
Практично в кожній мові програмування існують інструкції по управлінню принтером. Проте потрібно враховувати, що цей метод недостатньо гнучкий для операцій вводу/виводу при з’єднанні ПК із зовнішніми пристроями.
Якщо до комп'ютера приєднана зовнішня схема, то в ній повинна бути спеціальна схема для генерації сигналів BUSY і АСК. Найзручніше, якщо ПК при взаємодії використовуватиме тільки лінії АСК. BUSY постійно з'єднується з цифровою «землею» для індикації, що схема готова до прийому даних, а РЕ показує, що в принтері є папір; на лінію ERROR подається високий рівень. Якщо не з'єднати таким чином лінії РЕ і ERROR, при запиті комп'ютера на друк видаватимуться повідомлення про помилку. Більш гнучкіший спосіб управління паралельним портом - безпосередній доступ до регістрів порту.
Безпосередній доступ до регістрів порту
Це метод управління портом за допомогою безпосереднього доступу до його регістрів. Паралельний порт розглядається як три окремі регістри вводу/виводу, два з яких призначені для виведення даних, а один - для вводу.
Наступні процедури на мові Тр6 записують інформацію в регістри даних і управління. Обом процедурам потрібні базова адреса вибраного паралельного порту і значення вихідних даних. Вихідні дані для регістра управління передбачають проведення деяких перетворень над бітами.
(*-Бібліотека ресурсів № А4 (запис інформації в порт даних комп'ютера) -.*)
Procedure Write_data_port(P_address:integer, port_data:byte);
(*Біти регістра даних не інвертовані.*)
begin
port(P_address):=port_data; (*Введення байта даних в регістр даних.*)
end;
(*-Бібліотека ресурсів № А5 (запис даних в регістр управління.) -.*)
Procedure Write_control_port(P_address:integer; port_data:byte);
(*Біти 0, 1 та 3 інвертовані. Потрібні перетворення над бітами.*)
begin
if port_data and 1=1 then port_data:=port_data and (255-1)
else port_data:=port_data or 1;
if port_data and 2=2 then port_data:=port_data and (255-2)
else port_data:=port_data or 2;
if port_data and 8=8 then port_data:=port_data and (255-8)
else port_data:=port_data or 8;
port(P_address+2):=port_data; (*Введення байта даних в регістр управління.*)
end;
Наступна функція на мові Тр6 зчитує біти з 3 по 6 регістри стану. Вона вимагає базову адресу вибраного паралельного порту. Функція також виконує бітові перетворення і повертає значення чотирьохбітових вхідних даних.
(*-Бібліотека ресурсів № A3 (зчитування даних в комп'ютер).-*)
Function Read_status_port(P_address:integer):byte;
var
byte1:byte;
begin
bytel:=port(P_address+1); (*Зчитування байта з регістра стану.*)
bytel:=byte1 and 120; (*01111000 (від старшого до молодшого) and 0dddd... = 0dddd000.*)
Read_status_port:=byte1 shr 3;
(*Зсув на 3 біта вправо, Read_status_port=0000hhhh.*)
end;
У наступних прикладах, написаних на мові Turbo Pascal для Windows, представлено ввід і виведення даних через паралельний порт.
(*-Бібліотека ресурсів № А4 (запис інформації в регістр даних).-*)
Function Write_data_port(P_address:integer, port_data:integer); export;
(*Біти регістра даних не інвертовані.*)
begin
port(P_address):=port_data (*Введення байта в регістр даних.*)
end;
(*-Библиотека ресурсів № А5 (запис даних в регістр управління).-*)
Function Write_control_port(P_addres3:integer; port_data:integer) integer;
export;
(*Біти 0, 1 і 3 інвертовані Потрібні перетворення над бітами.*)
begin
if port_data and 1=1 then port_data:=port_data and (255-1)
else port_data:=port_data or 1;
if port_data and 2=2 then port_data:=port_data and (255-2)
else port_data:=port_data or 2;
if port_data and 8=8 then port_data:=port_data and (255-8)
else port_data:=port_data or 8
port(P_address+2):=port_data; (*Ввід байта даних в регістр управління.*)
end;
(*-Бібліотека ресурсів № A3 (зчитування даних в комп'ютер).-*)
Function Read_status_port(P_address:integer).integer; export;
var
bytel byte;
begin
bytel =port(P_address+1); (*Зчитування байта з регістра стану *)
bytel =byte1 and 120; (*01111000 (від старшого до молодшого) and 0dddd = 0dddd000 *)
Read_status_port:=byte1 shr 3; (*Зсув на 3 біта вправо, Read_status_port-0000hhhh.*)
end;