Смекни!
smekni.com

Комп’ютерне моделювання роботи послідовного порта (стр. 4 из 4)

Другий метод використовує переривання BIOSINT 14h, що дозволяє виконувати конфігурування порту з програм користувача. Для цього необхідно в регістр АН завантажити 0, а в DX- число від 0 до 3, що вказує на відповідний порт (СОМ1 - COM4). У регістр AL завантажується байт ініціалізійних даних, значення бітів якого показані нижче:

BD2 BD1 BDO PAR1 PAR0STOP DA1DA0

BD2 - BDO(швидкість) 111 = 9600

011 = 600

110 = 4800

010 = 300

101 = 2400

001 =150

100 = 1200

000=110

PAR1,0 (перевірка на парність) 00 чи 10 = немає перевірки

01 = непарна

11 = парна

STOP (кількість стопових бітів) 0 = 1

1 = 2

DA1,0 (довжина блоку даних) 10 = 7 біт

11 = 8 біт

Наступна програма на мові ТР6 робить те ж, що і команда DOSMODEСОМ1:96,n,8,1.

Procedureinitialize;

{СОМ1: 9600, без перевірки на парність, 0 біт даних, 1 стоповий біт.}

var

register: registers;

begin

with register do

begin

ah:=0; {Завантаження номера функції переривання.}

al:=128+64+32+0+0+0+2+1; {Завантаження ініціалізаційного коду 11100011B.}

dx:=0; {Номер порту: DX=0:COM1, DX=1:COM2 і т.д.}

intr($14,register); {Виклик переривання BIOS.}

end;

end;

Обмеження описаного методу полягає в тому, що можна задати швидкість тільки 9600 бод. UART 16450 здатний працювати зі швидкістю 115200 бод, це досягається безпосереднім звертанням до регістра. Третій, найбільш гнучкий метод конфігурує порт за допомогою запису даних у регістр формату даних UART(зсув 03h). Наступна програма на ТР6 дозволяє налаштувати сам регістр, для цього потрібна базова адреса порту, що конфігурується, швидкість, режим перевірки, довжина блоку даних і кількість стопових бітів. Процедура переводить задану швидкість у шістнадцятибітовий дільник і завантажує його у відповідні регістри.

(*-Бібліотека ресурсів № А9 (запис у регістр формату даних).-*)

Procedure Write_data_format (RS232_address, Baud, Parity, Data_bit,

Stop_bit:integer);

var

byte1,byte2,output_byte:byte;

divisor:integer;

begin

divisor:=115200 div Baud;

if divisor<=255 then begin byte1:=divisor; byte2:=0; end;

if divisor>255 then begin byte1:=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):=byte1; {Молодший байт дільника дорівнює 1.}

port(RS232_address+1);=byte2; {Старший байт дільника дорівнює 0.}

port(RS232_address+3):=output_byte; {Завантаження дільника й інших параметрів.}

end;

Наступна функція, написана мовою TurboPascal для Windows, виконує те ж саме:

(*-Бібліотека ресурсів № A9 (запис у регістр формату даних).-*)

Function Write_data_format(RS232_address, Baud, Parity, Databit,

Stop_bit:integer):integer; export;

Var

byte1, byte2,output_byte:byte;

divisor:integer;

begin

divisor:=115200 div Baud;

if divisor<=255 then begin byte1:=divisor; byte2:=0; end;

if divisor>255 then

begin

byte1:=divisor mod 256;

byte2:=divisor div 256;

end;

output_byte:=(data_bit-5)+4*(stop_bit - 1)+8*(parity);

port(RS232_address+3):=126;

{Завантаження ініціалізаційних даних, перший біт регістра порівнює 1.}

port(RS232_address+0):=byte1; {Молодший байт дільника дорівнює 1.}

port(RS232_address+1):=byte2; {Старший байт дільника дорівнює 0.}

port(RS232_address+3):=output_byte; {Завантаження дільника й інших параметрів.}

end;

Передача і прийом послідовних даних

Існує кілька способів прийому і передачі даних через послідовний порт: за допомогою команд операційної системи, переривань BIOS чи безпосереднього доступу до порту. Останній спосіб найбільш зручний при проведенні операцій введення/виведення загального призначення. Розглянемо приклад для порту СОМ1. Щоб передати дані, можна записати їх безпосередньо в буферний регістр передавача 3F8hвикористовуючи наступний оператор мови QBASIC:

OUT3F8h,X

де X- дані в десятковому форматі. Для одержання даних з порту СОМ1 зчитуються дані з буферного регістра приймача 3F8h. З цією метою використовується інший оператор мови QBASIC (Y- вхідні дані в десятково-му форматі):

Y=INP(3F8h)

Наступні дві процедури написані на мові ТР6 і виконують ті ж функції.

(*Бібліотека ресурсів № А10 (запис даних в буферний регістр передавача).*)

Procedure write_transmit_buffer(RS232_address,output_byte:integer);

Begin

port(RS232_address):=output_byte;

end;

(*Бібліотека ресурсів № A12 (зчитування даних з буферного регістра прий-мача).*)

Functionread_receive_buffer(RS 232_addгеss,output_byte: integer]: integer;

begin

read_receive_buffer:=port(RS232_address);

end;

Нижче показані дві функції, написані на TurboPascal для Windows.

(*Бібліотека ресурсів № А10 (запис даних в буферний регістр передавача).*)

Functionwrite_transmit_butfer(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;


Передача даних по лініях взаємодії

Для виводу даних через лінії RTSі DTRу регістр керування модемом (зміщення 04h) необхідно записувати біти 1 і 0, що відповідають сигналам RTSі DTR. Лінії керуються процедурами на мовах TP6 і TurboPascalдля Windows, що вимагають базову адресу обраного СОМ-порту і стан цих ліній - або 0, або 1. Причому RTE і DTR інвертуються перед подачею в порт з метою компенсації інверсії перетворювачами TTЛ/RS232, що також використовуються для трансформації рівня напруги.

(*-Бібліотека ресурсів № А11 (запис даних у регістр стану модему).-*)

procedurewrite_modem_status(RS232_address, RTS, DTR:integer);

(*RTSі DTRінвертуються за допомогою МАХ238 на експериментальній платі *)

(*RTS=біт1, DTR=біт0регістру керування модемом, зміщення 04h.*)

begin

RTS.=1-RTS,

DTR:=1-DTR;

port(RS232_address+4):=RTS*2+DTR; (*3апис у регістр 04h *)

end;

(*-Бібліотека ресурсів №A11 (запис даних у регістр стану модему).-*)

Function wrile_modem_stalus(RS232_address, RTS, DTR:integer):integer; export;

(*RTSі DTRінвертуються за допомогою MAX238 на експериментальній платі.*)

(*RTS=біт1, DTR=біт0 регістра керування модемом, зміщення 04h.*)

begin

RTS:=1-RTS;

DTR:=1-DTR;

port(RS232_address+4):=RTS*2+DTR; (*Запис в регістр 04h.*)

end.

Щоб зчитати дані з ліній DSR, CTS і DCD, необхідно зчитати регістр стану модему. Для цього служать нижчеподані процедури на мовах TP6і TPW, що вимагають базову адресу обраного СОМ-порту. Лінії DSR, CTS і DCD інвертуються для компенсації інверсії перетворювачами TTJI/RS232.

(*-Бібліотека ресурсів №A13 (читання даних з регістра стану модема).-*)

Functionread_modem_status(RS232_address, x:integer):integer;

(*х=1 - вибір біта DCD, х=2 - вибір біта DSR, х=З - вибір біта CTS.*) (*DCD=біт 7, DSR=біт 5, CTS=біт 4 регістру стану модема, зміщення 06h.*) (*Всі біти інвертуються за допомогою МАХ238 на експериментальній пла-ті.*)

var

input_byte:byte;

begin

input_byte:=port(RS232_address+6),

case x of

1: Read_modem_status = 1- round((input_byte and 128)/128);

2: Read_modem_status = 1- round((input_byte and 32)/32);

3: Read_modem_status = 1- round((input_byte and 16)/16);

end;

end;

(*-Бібліотека ресурсів №A13 (читання даних з регістра стану модему).-*)

Function read_modem_status(RS232_address, x:integer):integer; export;

(*x=l - вибір біта DCD, x=2 - вибір біта DSR, x=3 - вибір біта CTS.*)

(*DCD=біт 7, DSR=біт 5, CTS= біт 4 регістри стану модему, зміщення 06h.*)

(*Усі біти інвертуються за допомогою МАХ238 на експериментальній пла-ті.*)

var

input byte:byte;

begin

input_byte:=port|RSZ32_addres+GJ;

case x of

1: Read_modem_status:=1-round((input_byte and 128)/128);

2: Read_modem_status:=1-round((input_byte and 32)/32);

3: Read_modem_status:=1-round((input_byte and 16)/16);

end;

end;

2.2 Опис алгоритму і функціонування програми

Алгоритм програми полягає в записі даних у файл, а також зчитуванні даних з файлу, при моделюванні обміну даними через послідовний порт.

2.3 Опис організації вхідних та вихідних даних

В якості вхідних даних використано текстове повідомлення, в якості вихідних даних – файл зі значеннями напруг, які описують передане повідомлення у порт.

2.4 Опис організації вибору технічних і програмних засобів

Розроблений програмний продукт орієнтований на роботу в ОС Windows 95/98/NT/XP, тому для коректної роботи програми необхідне стабільне функціонування ОС. Під час виконання, програма не звертається до інших програмних продуктів, таких як Microsoft Office та ін., але звертається до реєстру ОС.

Для усунення виявлених помилок та створення завантажувального файлу необхідний встановлений пакет інструментальних засобів Borland Delphi 6.0.

До технічних засобів відносимо ПК, які знаходяться у лабораторії №57, де проходять лабораторні заняття з курсу „Архітектура комп’ютерів”. Мінімальними вимогами, за яких програма працюватиме та буде видавати достовірні результати, до апаратної частини ПК, можна вважати:

• процесор 6-го покоління Intel Celeron 533 МГц;

• об’єм оперативної пам’яті 64 Мб.;

• графічний адаптер S3 Savage 4 Мб.;

• жорсткий диск ємністю 10 Гб.;

• привід гнучких дисків (дисковод).


3. ОЧІКУВАНІ ТЕХНІКО – ЕКОНОМІЧНІ ПОКАЗНИКИ

Використовуючи розроблений програмний продукт, студент має можливість візуально вивчати формат передачі даних через послідовний порт

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

До переваг такої програми можна віднести її вузьку спеціалізацію з наявним програмним кодом, на відміну від її можливих аналогів. Використовуючи програмний код, можна розширювати функціональні можливості програми, в залежності від потреб. Таким чином, можна покращити його техніко – економічні показники та ефективність використання в навчальному процесі.


Список використаних джерел

1. Агуров П.В. Последовательные интерфейсы ПК. Практика программирования. –СПб.: БХВ-Петербург, 2004.– 496с.

2. Ан П. Сопряжение ПК с внешними устройствами: Пер. с англ.– М.: ДМК Пресс, 2001.– 320 с.