Instytut Informatyki Gliwice 23.03.92r
Zakład Mikroinformatyki
i Teorii Automatów Cyfrowych
LABORATORIUM MIKROINFORMATYKI
Temat: Interfejs szeregowy i równoległy.
Układ przerwań.
Cel ćwiczenia:
1. Nauka programowania elementów interfejsu szeregowego i równoległego komputera typu IBM PC.
2. Nauka programowania układu przerwań komputera typu IBM PC.
Wymagania sprzętowe:
Dwa komputery typu IBM PC (w sieci NOVELL ) połączone kablem interfejsu szeregowego i równoległego.
Wymagania softwerowe:
assembler TASM, linker TLINK oraz TURBO DEBUGGER f-my Borland, edytor tekstu, program HELP (opis przerwań DOS).
Wprowadzenie:
Komputery typu IBM XT, AT, 386 i 486 posiadają wbudowane systemy transmisji szeregowej i równoległej. W wyposażeniu standardowym zaopatrzone są w dwa łącza szeregowe COM1 i COM2 (w standardzie RS232) oraz w zależności od karty graficznej jeden bądź dwa łącza transmisji równoległej (Centronics) LPT1 i LPT2. BIOS komputerów zawiera odpowiednie procedury ich obsługi. Konstrukcja płyty głównej komputera zapewnia rozbudowę łącza szregowego do czterech (COM1..COM4) oraz łącza równoległego (LPT1..LPT3).
Łącza szeregowe i równoległe z reguły umieszczone są na osobnej karcie (Multi I/O).
Typowa karta zawiera dwa gniazda 9-pin i 25-pin dla łączności szeregowej, jedno gniazdo 25-pin dla łączności równoległej (Centronics printer port) oraz jedno gniazdo specjalne we/wy równoległych analogowych (Game port) do podłączenia joystick'a.
Karty video HERCULES zawierają dodatkowo łącze równoległe Centronics i dlatego istnieje konieczność konfigurowania kart Multi I/O oraz HERCULES tak aby adresy portów LPT nie pokrywały się.
Konfigurowanie Karty Multi I/O polega na odpowiednim ustaleniu adresu bazowego portu LPT, odblokowaniu/zablokowaniu sygnałów przerwań generowanych przez porty oraz odblokowaniu/zablokowaniu portów. Włączanie i wyłączanie odbywa się poprzez odpowiednie przełączanie zworek (jumpers) opisane w instrukcji dla danej karty.
Obsługa interfejsu szeregowego i równoległego może być zrealizowana na dwa sposoby:
• programowe odpytywanie buforów danych transmitowanych w pętli programowej (tzw. pooling),
• poprzez wykorzystanie układu przerwań do nadawania lub odbioru danych.
Połączenie komputerów poprzez interfejs szeregowy realizowane jest przy pomocy kabla łączności szeregowej asynchronicznej 3-żyłowego. Jego konstrukcja jest następująca:
Pin:
2-TxD 3-RxD
3-RxD 2-TxD
4-RTS 4-RTS
5-DTR 5-DTR
6-CTS 6-CTS
20-DSR 20-DSR
7-GND 7-GND
gdzie:
TxD - Transmit Data,
RxD - Receive Data,
CTS - Clear To Send,
RTS - Request To Send,
DTR - Data Terminal Ready,
DSR - Data Set Ready,
GND - Ground,
Adresy portów szeregowych:
COM1: 3F8h..3FFh przerwanie IRQ4 obsługiwane przez wektor INT 0Ch
COM2: 2F8h..2FFh przerwanie IRQ3 obsługiwane przez wektor INT 0Bh
Obsługa portów szeregowych zaimplementowana jest w BIOSie poprzez INT 14h, możliwe jest także bezpośrednie sterowanie interfejsem szeregowym poprzez oprogramowanie odpowiednich rejestrów karty Multi I/O.
Funkcje rejestrów interfejsu szeregowego:
Port Znaczenie
3F8h zapis: bufor nadawczy (8 bitowy),
odczyt: bufor odbiorczy (8 bitowy),
dla DLAB=1 dzielnik częstotliwości (młodszy bajt dzielnika)
częstotliwość dzielnik
110 1040
150 768
300 384
600 192
1200 96
2400 48
4800 24
9600 12
3F9h zapis: starszy bajt dzielnika dla DLAB=1
zapis: rejestr blokady przerwań
bit:
0: 1 - odblokuj intr. dla danych odbieranych,
1: 1 - odblokuj intr. gdy bufor nadawczy jest pusty,
2: 1 - odblokuj intr. na odbiorczej linii statusu
3: 1 - odblokuj intr. dla stsusu modemu (CTS,DSR,RI,RLSD),
4..7 = 0.
3FAh odczyt: rejestr identyfikacji przerwania,
bit:
0: 1 - nie ma przerwań (np. pooling)
1..2 00 - status intr. odbiornika
przepełnienie, błąd odczytu, parzystość ,
01 - dane odebrane ważne, wyzerowanie po odczycie 3F8h
10 - bufor nadawczy pusty, zerowanie poprzez zapis do 3F8h
11 - modem status, wykrywanie stanów CTS,DSR,RI,RLSD
3FBh odczyt/zapis: rejestr kontroli linii,
bit:
0..1: długość słowa 00 - 5, 01 - 6, 10 - 7, 11 - 8,
2: bity stopu 0 - 1, 1 - 2,
3..4: parzystość: x0 - brak, 01 - odd, 11 - even,
5: nie używane przez BIOS
6: odblokowanie sterowania przerwań 1 - start wysyłania spacji,
7: DLAB 1 prędkość transmisji, 0 - normalny
3FCh zapis: rejestr sterujący modemem,
bit:
0: 1 - uaktywnienie DTR, 0 - blokada,
1: 1 - uaktywnienie RTS, 0 - blokada,
2: 1 - uaktywnienie OUT1 (wyjscie użytkownika)
3: 1 - uaktywnienie OUT2
4: 1 - uaktywnienie pętli diagnostycznej
3FDh odczyt: rejestr statusu linii,
bit:
0: 1 - dane gotowe /DR/ reset poprzez odczyt,
1: 1 - błąd /OE/ poprzedni znak zostaje utracony,
2: 1 - błąd parzystości /PE/ reset poprzez odczyt linii statusu,
3: 1 - błąd ramki /FE/ zły bit stopu,
4: 1 - wykrycie przerwy /BI/ odebranie podtrzymania,
5: 1 - bufor nadawczy pusty, OK dla następnego znaku do nadania,
6: 1 - nadajnik pusty, brak danych do wysłania,
7: 0,
3FEh odczyt: rejestr statusu modemu,
bit:
0: 1 - DCTS zmienił stan,
1: 1 - DDSR zmienił stan,
2: 1 - TERI aktywny,
3: 1 - DDCD zmienił stan,
4: 1 - CTS aktywny,
5: 1 - DSR aktywny,
6: 1 - RI aktywny,
7: 1 - DCD aktywny,
Opis INT 14h.
Przerwanie BIOSa obsługi portów transmisji szeregowej (praca w poolingu; nie korzysta z przewań !!!)
AH: Obsługa:
00h inicjalizacja parametrów transmisji,
wejście: DX - numer portu 0..1,
AL - parametry inicjalizujące
0..1: długość słowa
10 - 7 bitów,
11 - 8 bitów,
2: bit stopu,
0 - 1,
1 - 2,
3..4: kod parzystości,
x0 - brak,
01 - odd,
11 - even,
5..7: prędkość transmisji,
000 - 110,
001 - 150,
010 - 300,
011 - 600,
100 - 1200,
101 - 2400,
110 - 4800,
111 - 9600,
wyjście: AH COM status,
01h wysłanie znaku,
wejście: DX - nr portu,
AL - znak do wysłania,
wyjście AH - status:
bit 7: 1 - błąd,
0..6: - status linii,
02h odebranie znaku,
wejście: DX - nr portu,
wyjście: AL - znak odebrany,
AH - różny od zera błąd,
03h pobierz status portu,
wejście: DX - nr portu,
wyjście: AX - status portu,
AH - status linii, AL - status modemu,
Treść ćwiczenia:
1. Napisać program transmisji znaków poprzez interfejs szeregowy, wykorzystując funkcje INT 14h oraz rejestry karty Multi I/O bez wykorzystania przerwań.
2. Napisać program transmisji znaków poprzez interfejs szeregowy, wykorzystując układ przerwań komputera,
Przykład programu transmisji znaków z wykorzystaniem układu przerwań w j. Pascal:
uses Dos,Crt;
const
COM = 01; {COM1 = 00, COM2 = 01}
COM_INT = $0B; {COM1 = $0C, COM2 = $0B}
COM_BAS = $200; {COM1 = $300, COM2 = $200}
var
IntSave : Pointer;
procedure Init_COM;
begin
{ inicjacja portu }
Odblokowanie kontrolera przerwań 8259:
INT0..INT7 - bit 0..7 rej. maski przerwań,
adres rej. maski $21,
ustawienie parametrów transmisji:
prędkość, parzystość, l.bitów danych, l bitów stopu,
odblokowanie przerwań dla danych odbieranych (port COM_BAS+$F9)
aktywacja OUT2, DTR, RTS (port COM_BAS+$FC),
odczyt bufora danych (port COM_BAS+$F8)
end;
procedure Send_Message (Snd_Buffer : string);
begin
.... { wysłanie znaków }
end;
procedure Recv_Message;interrrupt;
begin
{ odbiór znaków do bufora odczytu }
odblokowanie układu przerwań port $20,
Port[$20,] := #20;
sti
odczyt danych z bufora (port COM_BAS+$F8)
sprawdzenie statusu,
....
aktywacja OUT2, DTR, RTS,
end;
begin
GetIntVec (COM_INT,IntSave);
SetIntVec (COM_INT,Addr (Recv_Message));
Init_COM;
.....
pętla główna programu
....
zablokowanie układu przerwań dla INT3, INT4,
SetIntVec (COM_INT,IntSave));
end.
Łącze równoległe.
Wprowadzenie:
Port równoległy z założenia jest dwukierunkowy. Istnieje możliwość sterowania 12-ma liniami. Jest on jednym z najprostszych komponentów komputera. Składa się z czterech podstawowych bloków:
• dekodera adresów,
• bufora magistralowego danych,
• rejestru we/wy danych na złącze 25-pin,
• układu sterującego zapisem i odczytem portu,
W przeciwieństwie do portu szeregowego nie ma prostej możliwości synchronizacji transmisji ponieważ nie przewidziano żadnych linii synchronizacyjnych transmisję danych. Do synchronizacji można wykorzystać pin1 STROBE, ale nie wszyscy producenci kart Multi I/O wykonują je podobnie i istnieją rozbieżności w parametrach elektrycznych. Dlatego rozwiązaniem bezpiecznym jest przesyłanie danych oraz towarzyszących im sygnałów sterujących na liniach 2..9. Dane przesyłane muszą być połówkowo. Odczyt portu 37Ah daje możliwość pobierania danych z linii 1, 14, 16, 17. Protokół transmisji musi zapewniać synchronizację danych niezależnie od stosowanego komputera (różne częstotliwości taktowania magistral) i określenie które połówki danych są aktualnie przesyłane.
Protokół jest następujący:
NADAJNIK
• wyślij starszą połówkę danych i sygnał synchronizacji do odbiornika,
ODBIORNIK
• czekaj w pustej pętli dopóki sygnał synchronizacji linii jest ustawiony na 1,
• odpowiedz sygnałem synchronizacji odebranie danych,
NADAJNIK
• czekaj w pustej pętli na potwierdzenie przyjścia danej poprzez odczyt bitu kontrolnego w rej.STATUS
• Wyślij młodszą połówkę danych po zgaszeniu bitu kontrolnego,
ODBIORNIK
• czekaj w pętli dopóki bit kontrolny = 0, odczytaj młodszą połówkę danych,
• odpowiedz na odebranie danej poprzez ustawienie bitu kontrolnego na 0 i wysłaniu pustego bajtu danych na linię,
NADAJNIK
• czekaj na odpowiedź odbiornika poprzez odczyt bitu kontrolnego odbiornika,
• powtórz operację.
Połączenie kablowe pomiędzy portami:
Pin:
1 ------------------- 1 - GND
2 ------------------- 15
3 ------------------- 13
4 ------------------- 12 Data Out
5 ------------------- 10
6 ------------------- 11
10 ------------------- 5
11 ------------------- 6
12 ------------------- 4 Data In
13 ------------------- 3
15 ------------------- 2
Adresy portów równoległych:
LPT1: 378h..37Ah przerwanie IRQ7 obsługiwane przez wektor INT 0Fh
LPT2: 278h..27Ah przerwanie IRQ5 obsługiwane przez wektor INT 0Dh
LPT3: 3BCh..3BEh dla karty HERCULES,
Obsługa portów równoległych zaimplementowana jest w BIOSie poprzez INT 17h, możliwe jest także bezpośrednie sterowanie interfejsem równoległym poprzez oprogramowanie odpowiednich rejestrów karty Multi I/O.
Funkcje rejestrów interfejsu równoległego:
Port Znaczenie
378h zapis: bufor nadawczy /8 bitowy/,
odczyt: odczyt ostatnio wysłanego znaku,
379h odczyt: printer status,
bit:
0..2 0,
3: 0 - ERROR ,
4: 1 - SLCT,
5: 1 - PE,
6: 0 - ACK,
7: 0 - BUSY,
37Ah zapis/odczyt
0: 1 - strob po wysłaniu danej,
1: 1 - auto LF CR,LF
2: 0 - Init reset printer,
3 1 - Select printer,
4 0 - IRQ enable,
5..7 0,
Treść ćwiczenia:
Napisać program transmisji znaków poprzez interfejs równoległy, wykorzystując rejestry karty Multi I/O, (bez wykorzystania przerwań)
Przykładowe procedury transmisji znaku łączem równoległym w j. Pascal:
procedure Send_Char;
begin
cx <- kwant czasu oczekiwania (zależy od danego komputera)
dx <- 378h adres rej. danych
al <- znak do przesłania
....
ASM
mov AH,AL
inc dx
in al,dx ;odczyt rej STATUS
shl al,1
jc go_home
dec dx
mov al,ah
shr al,1
shr al,1
shr al,1
shr al,1
and al,0Fh
out dx,al ;wyślij starszą połówkę
inc dx
ET1: in al,dx
shl al,1
jc ET2 ;czy odbiornik gotów ?
loop ET1
jmp go_home
ET2: dec dx
mov al,ah
or al,10h ;ustaw bit kontrolny dla odbiornika
out dx,al ;wyślij znak
inc dx
mov cx,tim_const
ET3: in al,dx ;czekaj na ACK
shl al,1
jnc go_home
loop ET3
go_home:dec dx
mov al,10h
out dx,al
xor ah,ah
stc
END
end;
procedure Recv_Char;
begin
cx <- kwant czasu oczekiwania (zależy od danego komputera)
dx <- 378h adres rej. danych
al <- znak odebrany
....
ASM
inc dx
ET1: in al,dx ;odczyt rej. STATUS
shl al,1
mov ah,al ;czy nadajnik gotów ?
jc ET2
loop ET1
clc ;time out
jmp go_home ;błąd koniec
ET2: and ah,0F0h ;tylko starsza część bajtu
dec dx
mov al,0
out dx,al ;wyślij ACK do nadajnika
inc dx
mov cx,time_const
ET3: in al,dx
shl al,1 ;czekaj na potwierdzenie
jnc ET4
loop ET3
dec dx
mov al,10h
out dx,al ;brak łączności koniec
clc
jmp go_home
ET4: in al,dx ;pobierz następną połówkę
shr al,1
shr al,1
shr al,1
and al,0Fh
or ah,al
dec dx
mov al,10h
out dx,al ;wyślij ACK do nadajnika
mov al,ah
stc
go_home: ;koniec
END;
end;
{ program główny }
begin
......
end.
mgr inż. Oleg Antemijczuk.