Смекни!
smekni.com

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

0 0 0 0 0 ID1 ID0 PND

PND1 = немає переривання

0 = переривання

ID1, ID0 00 = зміна вхідного сигналу RS232 (пріоритет 3)

01 = регістр передавача порожній (пріоритет 2)

10 = у буферному регістрі приймача дані готові (пріоритет 1)

11 = помилка передачі даних чи зупинка (пріоритет 0, вищий ступінь)

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

ID1 = 0, ID0 = 0 читання вмісту регістра стану модему (06h)

ID1 = 0, ID0 = 1 запис у регістр передавача (00h)чи читання регістра ідентифікації переривань (02h)

ID1 = 1, ID0 = 0 читання байта даних з буферного регістра приймача (00h)

ID1 = 1, ID0 = 1 читання регістра стану прийомопередавача (05h)

По зсуву 03h знаходиться регістр формату даних, що визначає такі параметри переданих даних, як швидкість, кількість бітів даних, кількість стопових бітів і настроювання перевірочного біту. Призначення бітів регістра приведене нижче:

DLABBRKPAR2 PAR1 PAR0 STOPDAB1 DAB0

DLAB1 = доступ до установки швидкості 0 = доступ до регістра приймача/регістру передавача (00h) й до регістра дозволу переривань

BRK1 = зупинка включена

0 = зупинка виключена

PAR2,1,0 000 = немає перевірки

001 = непарна

011 = парна

101 = завжди 1

111 = завжди

STOP1 = 2 стопових біти

0 = 1 стоповий біт

DAB1,0 00 = 5 біт даних

01 = 6 біт даних

10 = 7 біт даних

11 = 8 біт даних

Коли біт DLAB дорівнює 1, регістри прийомопередавача (00h) і дозволу переривань (01h) використовуються для завантаження дільника швидкості обміну. У перший записується молодший, у другий - старший байт дільника. Вони формують шістнадцятибітовий дільник, значення якого обчислюється за наступною формулою:

Дільник = байтрегістр 00h + 256×байт регістр 01h

У комп'ютері тактова частота, що подається в UART, складас 1,8432 Мгц. Усередині UARTеталонна частота утвориться як тактова, ділена на 16, і дорівнює 115200 Гц. Співвідношення між значеннями дільника і швидкістю можна представити у виді формули:

Для одержання швидкості 9600 бод необхідно, щоб дільник був рівний 12. Отже, у буферний регістр прийомопередавача (00h) повинно бути записане число 12, а в регістр дозволу переривань (01h) - нуль. Якщо в регістри дільника записана одиниця, то вийде найвища швидкість - 115200 бод.

По зсуву 04h розташований регістр керування модемом. У загальному випадку він використовується для керування двома виходами інтерфейсу - RTSі DTR. Призначення бітів регістра наступні:

0 00 LOOPОUT2 ОUT1 RTSDTR

біти 7-5 завжди нулі

LOOP1 = зворотний зв'язок доступний

0= зворотний зв'язок недоступний

ОUT2 1 = включено

0 = виключено, для внутрішнього використання

OUT1 1 = включено

0 = виключено, для внутрішнього використання

RTS1 = включено

0= виключено, є присутнім на роз’ємі RS232

DTR1 = включено

0 = виключено, є присутнім на роз’ємі RS232

По зсуву 05hзнаходиться регістр стану прийомопередавача, що містить інформацію про стан приймача і передавача UART. При використанні разом з регістром ідентифікації переривань (02h) можна установити джерело переривань. Призначення бітів регістра приведені нижче:

0 ТХЕ ТВЕ BREKFRMEPAREOVFERxRD

ТХЕ (передавач порожній) 1 = немає байту в регістрі передавача і регіcтрі зміщення

0 = у регістрі передавача та регістрі зміщення один байт

ТВЕ (буфер передавача порожній) 1 = немає байту в регістрі передавача 0 = у регістрі передавача один байт

BREK(зупинка) 1 = виявлена зупинка

0 = немає зупинки

FRME(помилка блоку) 1 = виявлена помилка

0 = немає помилки

PARE(помилка перевірки на парність) 1 = виявлена помилка

0 = немає помилки

OVFE(помилка переповнення) 1 = виявлена помилка

0 = немає помилки

RxRD(прийняті дані готові) 1 = прийняті дані знаходяться в регістрі приймача

0 = немає прийнятих даних


По зсуву 06h знаходиться регістр стану модему, що може використовуватися для визначення стану вхідних сигналів, зокрема DCD, DSR, CTS, RI, а також для зчитування чотирьох цифрових вхідних ліній. Призначення бітів регістру наступні:

DCDRIDSRCTSDDCDDRIDDSRDCST

DCD(виявлена несуча передачі даних) 1 = DCDактивна

0 = DCD неактивна

RI (індикатор дзвоника) 1 = RI активна

0 = RI неактивна

DSR (набір даних готовий) 1 = DSR активна

0 = DSRнеактивна

CTS(скидання для передачі) 1 = CTSактивна

0 = CTSнеактивна

DDCD(дельта DCD)1 = DCDзмінена з моменту останнього зчитування

0 = DCDбез змін

DRI(дельта RI)1 = RIзмінена з моменту останнього зчитування

0 = RI без змін

DDSR (дельта DSR) 1 = DSR змінена з моменту останнього зчитування

0 = DSR без змін

DCTS (дельта CTS) 1 = CTS змінена з моменту останнього зчитування

0 = CTS без змін

Регістр зі зсувом 07h - це байт пам'яті. Запис даних у регістр не впливає на операції UART.

Перетворювачі напруг

Вихідні сигнали керування (RTSта DTR)і вхідні сигнали стану (CTS, DSR, DCD) послідовного порту інвертовані. Послідовні сигнали даних SIN і SOUT не інвертовані. UART працює тільки з рівнем напруг ТТЛ/КМОП. Перетворювачі напруг розташовані між UART і роз’ємом RS232. Перетворювачі передавачів конвертують рівень напруги ТТЛ у рівень RS232, а перетворювачі приймачів - навпаки.

При включенні чи перезавантаженні комп'ютера BIOSперевіряє адреси всіх установлених послідовних портів. Якщо вона знаходить такий порт, то заносить базову адресу (двобайтове слово) у певну комірку пам'яті. Для СОМ1 це комірки 0000:0400h і 0000:0401h. Базову адресу можна одержати, злічивши їхній вміст. Комірки пам'яті, у яких міститься інформація про базові адреси встановлених послідовних портів, приведені нижче:

СОМ1: 0000:0400h - 0000:0401h

COM2: 0000:0402h - 0000:0403h

COM3: 0000:0404h - 0000:0405h

COM4: 0000:0408h - 0000:0407h

Однобайтова комірка пам'яті 0000:0411h у першому, другому і третьому бітах містить загальну кількість установлених СОМ-портів:

біт 3 = 0, біт 2 = 0, біт 1 = 0 СОМ-порти не встановлені

біт 3 = 0, біт 2 = 0, біт 1 = 1 встановлено один СОМ-порт

біт 3 = 0, біт 2 = 1, біт 1 = 0 встановлено два СОМ-порти

біт 3 = 0, біт 2 = 1, біт 1 = 1 встановлено три СОМ-порти

біт 3 = 1, біт 2 = 0, біт 1 = 0 встановлено чотири СОМ-порти

2.1.3 Способи керування портами у WINDOWS95 таWINDOWSXP

Програмне керування

У розділі приведені основні варіанти програмування послідовного порту.

Одержання базової адреси послідовного порту

Представлена програма, написана мовою QBASIC, виводить загальну кількість СОМ-портів, вбудованих у ПК, і їхні базові адреси. Рядок 20 зчитує байт з комірки пам'яті 0000:0411 h, використовуючи команду РЕЕК(). Біти 0,1 і 2 містять інформацію про кількість встановлених СОМ-портів. На ці три біти накладається маска за допомогою оператора AND(1+2+4) для визначення кількості портів. Рядок 30 зчитує два байти з комірок пам'яті, що містять базову адресу СОМ1. Рядки 40, 50 і 60 роблять те ж саме для інших портів.

10 DEFSEG=0

20 PRINT "Number of RS232 ports:", (PEEK(&H411) AND (1+2+4))

30 PRINT "Address of COM1:", PEEK(&H400)+256*РЕЕК(&H401)

40 PRINT "Address of CОM2:", PEEK(&H402)+256*PEEK(&H403)

50 PRINT "Address of COM3:", PEEK(&H404)+256*PEEK(&H405)

60 PRINT "Address of COM4:", PEEK(&H406)+256*PEEK(&H407)

70 INPUTX

Наступна функція, написана мовою TP6, зчитує інформацію про кількість встановлених портів і привласнює отримане значення змінній Number_of_ COM. Потім вона зчитує базові адреси з комірок пам'яті, де вони зберігаються, і привласнює адресу обраного порту змінній RS232_address.

(*-Бібліотека ресурсів № А6 (визначення базових адрес СОМ-портів).-*)

ProcedureCOM_address;

(* $0000:$0400 містить базову адресу порту СОМ1,

$0000:$0402 містить базову адресу порту COM2,

$0000:$0404 містить базову адресу порту COM3,

$0000:$0406 містить базову адресу порту COM4,

$0000:$0411 містить кількість СОМ-портів в двійковому форматі.*)

var

СOM:аггау[1..4] of integer;

COM_number.number_of_COM,code:integer;

Kbchar;char;

begin

clrscr;

COM_number:=1; (*Установка порту за замовчуванням.*)

Number_of_COM:=mem($0000:$0411); (*3читування кількості СОМ-портів.*)

Number_of_COM:=(Number_of_COM and (8+4+2)) shr 1;

COM[1]:=memw($0000:$0400); (*Процедура зчитувань з пам'яті.*)

СОМ[2]:=memw($0000:$0402);

СОМ[3]:=memw($0000:$0404);

СОМ[4]:=memw($0000:$0406);

Textbackground(blue); clrscr;

Textcolor(yellow); Textbackground(red); window(10,22,70,24); clrscr;

Writeln('Number of COM installed:', Number_of_COM:2);

writeln('Addresses for COM1 to COM4: ', COM[1];3', COM[2]:3', COM[3]:3', COM[4]:3);

write('Select COM to be used (1,2.3,4):');

delay(1000);

ifnumber_of_COM>1 then

begin(*Вибір конкретного порту, якщо встановлено кілька портів.*)

repeat

kbchar:=readkey; (*3читування значення з клавіші, що вводиться.*)

val(kbchar,COM_number,code); (*Перетворення символу в число.*)

until (COM_number>=1) and (COM_number<=4) and (COM[COM_number]<>0);

end; clrscr;

RS232_address:=COM[COM_number];

writeln('Your selected RS232 interface: COM', COM_number:1);

write('RS232 address:', RS232_address:4);

delay(1000);

textbackground(black);

window(1,1,80,25); clrscr;

end;

В наступному прикладі показана функція RS232(X), написана мовою TurboPascal для Windows. RS232(0) повертає кількість установлених СОМ-портів, RS232(1) - базову адресу СОМ1, RS232(2) - базову адресу COM2 і т.д.

(*-Бібліотека ресурсів № A6(визначення базових адрес СОМ-портів).-*)

(Universal auto detection of COM base address)

Function RS232(X:integer):integer; export;

(* $0000:$0400 містить базову адресу порту COM1,

$0000:$0402 містить базову адресу порту COM2,

$0000:$0404містить базову адресу порту COM3,

$0000:$0406 містить базову адресу порту COM4,

$0000:$0411 містить кількість СОМ-портів в двійковому форматі.*)

var

number_of_COM, СОМ1, COM2, COM3, COM4: integer;

begin

number_of_COM:=mem($40:$11); (*3читує кількість СОМ-портів *)

number_of_COM:=(number_of_COM and (8+4+2)) shr 1;

COM1:=0; COM2:=0; COM3: =0; COM4:=0;

COM1:=memw($40:$00); (*Процедура зчитування з пам'яті.*)

COM2.=memw($40:$02);

COM3:=memw($40:$04);

COM4:=memw($40:$06);

Case X of

0: RS232:=number of COM;

1: RS232:=COM1;

2: RS232:=COM2;

3: RS232:=COM3;

4: RS232:=COM4;

end;

end.

Ініціалізація СOM-порту

Перед тим як використовувати СOM-порт, його необхідно настроїти на визначений формат передачі даних, тобто встановити швидкість, кількість бітів даних, кількість стопових бітів та біт перевірки. Існує три методи настроювання. Перший полягає у використанні команди MODEопераційної системи MSDOS. Синтаксис команди можна представити так:

MODE COMm: baud=b, parity=p, data=d, stop=s, retry=r

або MODE COMm:b,p,d,s,r

MODECOM1:96,n,8,1 конфігурує порт СОМ1 з наступними параметрами: швидкість 9600 бод, без перевірки на парність, 8 біт даних, 1 стоповий біт. Зазначена команда може бути включена у файл autoexec.bat. Недолік такого методу - неможливість змінювати формат передачі даних у користувацьких програмах.