Programowanie w języku Pascal » FAQ

Jak obsłużyć sprzęt podłączony do kompa

Czasami możemy potrzebować dorwać się do sprzętu podłączonego do komputera przez któryś z portów. Na przykład u mnie do portu COM1 dołączam czasem układ specjalnej 8-przyciskowej klawiatury, a na porcie LPT wisi cały czas moduł wyświetlacza 4x display 7-segmentowy (w dodatku z klawiaturką DTMF...). Przedstawiam poniżej sposób na obsługę tego w programie.

Do sprzętu zawsze dobieramy się przez funkcję Port i numer wirtualnego portu:
Port [<i>numer_portu</i>] := <i>przypisywana_wartość</i>;
<i>Obiekt_docelowy</i> := Port [<i>numer_portu</i>];

Numer portu jest liczbą 16-bitową, natomiast zwracana wartość jest 8-bitowa. W komputerze co prawda jest zdefiniowanych 65536 portów, ale wykorzystywanych jest najwyżej 500. Numery portów COM są takie:

$3F8 - port COM1
$2F8 - port COM2
$3E8 - port COM3
$2E8 - port COM4

Przez te adresy możemy prowadzić transmisję po eReSie. Aby jednak dobrać się do linii dodatkowych, stosujemy tzw. offset, czyli mówiąc prościej do podanego numeru dodajemy określoną liczbę. Dla uproszczenia, dalej kod będę objaśniać dla COM1, aby użyć innego, zastąp ciąg $3F8 innym podanym wyżej.

Aby ustawić jakiś stan na liniach DTR i RTS, bierzemy offset równy 4. Dobieramy się do portu $3F8+4, czyli $3FC. Działamy dalej na bitach. Bit o wadze 1 dotyczy stanu linii DTR (1=stan wysoki), a o wadze 2 linii RTS:

Port [$3F8+4] := 3;  { Ustawimy w stan wysoki linie DTR i RTS }


Aby zmienić stan linii TxD, wybieramy adres $3F8+3 i zmieniamy stan bitu o wadze 64.

Port [$3F8+3] := 64 { Stan wysoki na TxD }


Jeszcze pozostały nam wejścia DCD, RI, CTS i DSR. Dostęp do nich uzyskamy przez adres $3F8+6, przy czym bit o wadze 128 oznacza stan linii DCD, bit ważący 64 - stan linii RI, bit o wadze 32 oznacza wejście DSR, a 32 - CTS:

L_DCD := (Port [$3F8+6] <b>and</b> 128) = 128;
L_RI := (Port [$3F8+6] <b>and</b> 64) = 64;


Obsługa portu LPT wygląda następująco: porty są takie:

$378 - LPT1
$278 - LPT2

Przez port $378 (lub $278) uzyskujemy dostęp do linii D0-D7 (wyprowadzenia 2-9). Bit o wadze 128 oznacza stan linii D0, bit ważący 64 - stan linii D1 i tak dalej.

Port $378+1 dotyczy wejść. Stan bitów o wadze 128 do 8 odzwierciedla kolejno stan linii Busy (pin 11), ACK (pin 10), PE (pin 12), SLCT (pin 13) i Error (pin 15):

L_Busy := (Port [$378+1] <b>and</b> 128) = 128;
L_Error := (Port [$378+1] <b>and</b> 8) = 8;


Pozostał jeszcze port $378+2. Tu mamy wyjścia. Używamy bitów o wadze 8, 4, 2, 1, kolejno oznaczających wyjścia SELECT (pin 17), INIT (pin 16), AUTO (pin 14) i STROBE (pin 1). Uwaga: stan wyjścia INIT (bit 4) jest zanegowany, czyli aby ustawić tam stan wysoki, trzeba wpisać na tą pozycję zero!!! Wygląda to tak:

Port [$378+2] := 4; {ustawiamy wszędzie stan niski }
Port [$378+2] := 0; {ustawiamy stan wysoki na INIT }
Port [$378+2] := 8+2+1; {ustawiamy wszędzie stan wysoki}


I to by było tyle.

9 komentarzy

Peters294 2007-03-21 14:44

kto mi to wytlumaczy bo tego niezabardzo kumam GG:3593172

chemik143 2008-01-03 10:44

podoba mi się te dodatkowe 8 pinów... czyli w praktyce można by wysyłać 16 bit danych równolegle..

doctype 2005-11-29 20:37

Fajny artykul. Teraz wiem jak zintegrowac elektronike z kompem.

Ludomir 2005-10-02 19:09

może UserPort?

fatalbomb 2005-09-22 20:14

Sam szukam czegoś co pozwoliłoby mi się dobrać do portów pod XP. Normalnie sypie mi się błąd \"Privileged Operation\" (AAAARGH!!)

prgtw 2005-09-22 01:03

Wszystko fajne ale co z nowszymi Windowsami niż 98 :) gdzie taka bezpośrednia \"ingerencja\" w porty jest niemożliwa?

Dałbyś jakiś przykładzik pod komponentami do obsługi portów np. w WinXP.

fatalbomb 2005-09-19 21:21

Układ wykonałem tak: wziąłem cztery pojedyncze wyświetlacze 7-segmentowe ze wspólną anodą, połączyłem katodami wszystkie wyświetlacze, pod D0 podłączyłem segmenty a, pod D1 segmenty b ... pod D6 segmenty g, pod D7 kropki dziesiętne. Anodę pierwszego wyświetlacza pod SELECT, drugiego pod INIT, trzeciego pod STROBE, czwartego pod AUTO. Kolejność podłączenia nie ma znaczenia, poniewać sterowanie ustalimy programowo. Zbudowanie wszystkiego zajęło mi łącznie 4 godziny: godzinę przygotowanie laminatu (przycięcie i narysowanie ścieżek), pół godziny trawienie w chlorku, godzinę wywiercenie otworów (było ich prawie 100), godzinę polutowanie wszystkiego i pół godziny podłączenie i ustawienie na półce, żeby się nie wywracało :-). Potem już tylko dłubanie w Turbo Pascalu.

mr.hex 2005-09-19 14:20

nie powiem dobre, zebym jeszcze umial tylgo wykonac uklad pod wyswietlacz to bym to na pewno wykorzystal :P

fatalbomb 2005-09-18 21:22

Uznałem, że czas najwyższy wrzucić tu trochę nowego materiału :-)