- •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 порта пк.
- •Функція
- •Механізм передачі даних
Ініціалізація сом-порта
Перш ніж використовувати СОМ-порт, його необхідно налаштувати на певний формат передачі даних, тобто встановити швидкість, кількість бітів даних, кількість стопових бітів та біт перевірки.
Procedure initialize;
{C0M1: 9600, без перевірки на парність, 8 біт даних, 1 стоповий біт.}
var
register: registers;
begin
with register do
begin
ah:=0; { Завантаження номера функції переривання.}
al:=128+64+32+0+0+0+2+1; { Завантаження коду
ініціалізації 11100011В.}
dx:=0; { Номер порту: DX=0:C0M1, DX=1:C0M2 і так далі}
intr($14,register); { Виклик переривання BIOS.}
end;
end;
Обмеження описаного методу полягає в тому, що можна задати швидкість тільки 9600 бод. UART 16450 здатний працювати із швидкістю 115200 бод, це досягається безпосереднім зверненням до регістра.
Наступна програма на Тр6 дозволяє набудувати регістр формату даних UART (зсув 03h), для цього потрібна базова адреса порту, що настроюється, швидкість, режим перевірки, довжина блоку даних і кількість стопових бітів. Процедура переводить задану швидкість в шістнадцятибітовий дільник і завантажує його у відповідні регістри.
("*Бібліотека ресурсів № А9 (запис в регістр формату даних).-*)
Procedure Write_data_format (RS232_address, Baud, Parity, Data_bit, Stop_bit:integer);
var
bytel, byte2, output_byte:byte;
divison:integer;
begin
divisor:=115200 div Baud;
if divisor<=255 then
begin
byte1:=divisor;
byte2:=0;
end;
if divisor>255 then
begin
bytel:=divisor mod 256;
byte2:=divisor div 256;
end;
output_byte:=(data_bit-5)+4*(stop_bit-1)+8*(parity);
port(RS232_address+3):=128; { Завантаження даних ініціалізацій,
перший біт регістра рівний 1.}
port(RS232_address+0):=bytel; { Молодший байт дільника рівний 1.}
port(RS232_address+1):=byte2; { Старший байт дільника рівний 0.}
port(RS232_address+3):=output_byte; { Завантаження дільника та
інших параметрів.}'
end;
Наступна функція, написана на мові Turbo Pascal для Windows, виконує те ж саме.
(*-Бібліотека ресурсів № А9 (запис в регістр формату даних).-*)
Function Write_data_format(RS232_address, Baud, Parity, Data_bit, Stop_bit:integer):integer;
export;
var
bytel, byte2, output_byte:byte;
divison:integer;
begin
divisor:=115200 div Baud;
if divisor<=255 then
begin
bytel:=divisor;
byte2:=0;
end;
if divisor>255 then
begin
bytel:=divisor mod 256;
byte2:=divisor div 256;
end;
output_byte:=(data_bit-5)+4*(stop_bit-1)+8*parity;
port(RS232_address+3):=i28; { Завантаження даних ініціалізацій
перший біт регістра рівний 1.}
port(RS232_address+0):=byte1; { Молодший байт дільника рівний 1.}
port(RS232_address+1):=byte2; { Старший байт дільника рівний 0.}
port(RS232_address+3):=output_byte; { Завантаження дільника та
інших параметрів.}
end;
Передача і приймання послідовних даних
Існує декілька способів прийманняу і передачі даних через послідовний порт: за допомогою команд операційної системи, переривань BIOS або безпосереднього доступу до порту. Останній спосіб найбільш зручний при проведенні операцій вводу/виводу загального призначення.
Наступні дві процедури написано на мові Трб для передачі і прийому даних.
(*Бібліотека ресурсів № А10 (запис даних в буферний регістр передавача).*)
Procedure write_transmit_buffer(RS232_address, output_byte:integer);
begin
port(RS232_address):=output_byte;
end;
(*Бібліотека ресурсів № A12 (читання даних з буферного регістра приймача) *)
Function read_receive_buffer(RS232_address, output_byte:integer):integer;
begin
read_receive_buffer:=port(RS232_address);
end;
Нижче наведено дві функції, написані на Turbo Pascal для Windows.
(*Бібліотека ресурсів № А10 (запис даних в буферний регістр передавача).*)
Function write_transmit_buffer(RS232_address, output_byte:integer):integer;
export;
begin
port(RS232_address):=output_byte;
end;
(*Бібліотека ресурсів № A11 (читання даних з буферного регістра приймача).*)
Function read_reseive_buffer(RS232_address, output_byte:integer):integer;
export;
begin
read_reseive_buffer:=port(RS232_address);
end;