http://www.easy-soft.tsnet.pl/
PortCentronics w trybie EPP / ECP
Wielokrotnie na łamach Elektroniki Praktycznej oraz innych pism dla elektroników -
amatorów poruszany był temat wykorzystania portu LPT (Centronics) dla potrzeb
sterowania i komunikacji z własnymi urządzeniami. Zazwyczaj w prostszych projektach
tego typu wykorzystany jest podstawowy tryb pracy portu (SPP - Standard Parallel Port)
albo tryb dwukierunkowy (Bidirectional, Byte) - w zależności od tego czy chcemy tylko
wysyłać bajty po magistrali danych czy też chcemy je także odczytywać. Dla
przypomnienia :
•
Tryb standardowy (SPP, Centronics)
- wielokrotnie opisywany - pozwala na
ustawienie poziomów na liniach danych oraz na niektórych liniach kontrolnych,
natomiast tylko część linii kontrolnych potrafi przyjąć poziom wymuszony przez
urządzenie zewnętrzne. Próba wpisania z zewnątrz bajtu na magistralę danych kończy
się niepowodzeniem i może nawet doprowadzić do fizycznego uszkodzenia portu (jeśli
na linii występuje konflikt poziomów mogą płynąć prądy zwarciowe rzędu
kilkudziesięciu miliamperów ). Przekazywanie informacji do komputera w tym trybie
jest ograniczone do połowy bajtu - tyle możemy odczytać w jednym cyklu korzystając
z wejściowych linii kontrolnych (czasem używa się więc dla trybu nazwy „nibble”).
Tryb standardowy jest całkowicie wystarczający dla prostych sterowań ledami lub
przekaźnikami.
•
Tryb dwukierunkowy (Byte)
jak z samej nazwy wynika pozwala na użycie linii
danych D0 - D7 jako wejściowych. Jest to uzyskane poprzez wyłączenie
wewnętrznego zasilania tych linii - przechodzą one w stan wysokiej impedancji.
Można wtedy podać z zewnątrz cały bajt danych i programowo go odczytać bez
żadnych konfliktów elektrycznych. Oczywiście powinniśmy uzupełnić port
zewnętrznym buforem sterowanym jednym z pinów . Sekwencja sterowania będzie
następująca :
o
przełączenie linii danych do odczytu ,
o
otworcie bufora,
o
odczyt bajtu,
o
zamknięcie bufora,
o
przełączenie linii danych do zapisu.
Poniżej jest przytoczony przykład pascalowej funkcji odczytującej port użytej w
programie Delphi przeznaczonym dla Windows 95/98/ME. Zewnętrzny bufor jest
sterowany linią portu AUTO. Kierunek przełączamy 5. bitem w rejestrze kontrolnym
portu.
function ReadByte:Byte;
var
W:Word;
B:byte;
begin
W:=LptBase+2;
B:=BaseCtrl or $22;
{linia Read = AUTO - bit 1 inwertowany }
asm
MOV DX,W
MOV AL,B
OUT DX,AL { poziom niski na linii Read , DIR = In}
- strona 1/5 -
http://www.easy-soft.tsnet.pl/
end;
W:=LptBase;
asm
MOV DX,W
IN AL,DX { dane z portu danych }
MOV B,AL
end;
Result:=B;
W:=LptBase+2;
B:=BaseCtrl;
asm
MOV DX,W
MOV AL,B
OUT DX,AL { poziom wysoki na linii Read, DIR = Out }
end;
end;
Konstrukcja bufora może być różna. Mogą to być dwie kostki (bufor wejściowy i zatrzask
wyjściowy - jak w jednym z projektów EP), jedna kostka przełączana (np. 74245), czy też
układ wbudowany w gotowe zewnętrzne urządzenie - np. wyświetlacz alfanumeryczny
LCD.
Problem zaczyna się w momencie, gdy chcemy takie wcześniej napisane programy
uruchamiać na nowszym sprzęcie wyposażonym w port ECP / EPP. Zazwyczaj nie chcą
one wtedy działać - konieczne jest ustawienie w biosie dokładnie takiego trybu pracy
portu jaki jest wymagany przez naszą aplikację. Jest to niewygodne a poza tym czasem
trudno jest zidentyfikować w menu biosu potrzebną opcję gdyż występuje tam dosyć
zróżnicowane nazewnictwo (normal, bi-dir, compatible itd.). Dodatkowo należy pamiętać
o przywróceniu na końcu poprzednich ustawień aby nie zakłócić wcześniej konfigurowanej
komunikacji np. z drukarką czy skanerem.
W takich sytuacjach dopomoże nam wykorzystanie rozszerzonych możliwości
konfiguracyjnych portu ECP (Extended Capabilities Port). Port ECP poza
dotychczasowymi rejestrami (dane - pod adresem bazowym portu LptBase - np. $378,
status - LptBase+1 oraz kontrola - LptBase+2) posiada trzy rejestry dodatkowe,
adresowane z przesunięciem $400 (ustawiony 2. bit w starszym bajcie adresu) :
Adres
Rejestr
LptBase
Dane w trybie SPP lub dwukierunkowym
Buforowany adres w trybie ECP
LptBase + 1
Rejestr statusu ( wszystkie tryby )
LptBase + 2
Rejestr kontrolny ( wszystkie tryby )
LptBase + 400h
Dane w trybie buforowanego SPP ( SPP FIFO )
Dane w trybie ECP (ECP FIFO )
Test bufora FIFO (w trybie testowym )
Rejestr konfiguracyjny A ( w trybie konfiguracji )
LptBase + 401h
Rejestr konfiguracyjny B ( w trybie konfiguracji )
LptBase + 402h
Rozszerzony rejestr kontrolny ( wszystkie tryby )
- strona 2/5 -
http://www.easy-soft.tsnet.pl/
Dla naszych powyżej opisanych potrzeb najbardziej istotny jest rozszerzony rejestr
kontrolny ( LptBase + $402 ) :
Bit
Funkcja
7:5 Ustawienie trybu pracy portu.
000
Tryb standardowy SPP
001
Tryb dwukierunkowy Byte
010
Tryb buforowany SPP FIFO
011
Tryb buforowany ECP FIFO
100
Tryb EPP
101
Pozycja zarezerwowana
110
Tryb testowania FIFO
111
Tryb konfiguracyjny
4 Zezwolenie na wykorzystanie przerwań
3 Zezwolenie na wykorzystanie DMA
2 Flaga zgłoszenia przerwania
1 Bufor FIFO pełny
0 Bufor FIFO pusty.
Jeśli port jest typu ECP ( tzn. posiada odpowiednie wyposażenie konstrukcyjne oraz jest
tak ustawiony w biosie ) - możemy programowo zmieniać jego tryb pracy poprzez
manipulację bitami 7-5 rozszerzonego rejestru kontrolnego. Przykładowo ustawiając je na
000 powodujemy, że port będzie się zachowywać jak zwyczajny jednokierunkowy
Centronics itd.
Podczas pisania nowego programu korzystającego z LPT możemy od razu w nim umieścić
odpowiednie sekwencje. Natomiast dla ułatwienia użytkowania starszych programów
powstała niewielka aplikacja ( Windows 9x ) umozliwiająca szybkie i proste przełączanie
trybu pracy portu.
Po starcie program lokalizuje porty równoległe zainstalowane w systemie:
Po wybraniu portu z listy możemy odczytać tryb jego pracy ( przycisk „Tryb pracy”).
W tym momencie program sprawdza, czy port posiada niezbędne możliwości
konfiguracyjne charakterystyczne dla ECP. Sekwencja postępowania zalecana przez
Microsoft jest następująca :
•
odczytujemy rozszerzony rejestr kontrolny i sprawdzamy, czy flaga zapełnionego
bufora FIFO jest zgaszona a flaga pustego bufora zapalona (bit 0. ustawiony a
bit 1. zgaszony ),
•
zapisujemy do rejestru wartość $34,
•
ponownie odczytujemy rejestr i sprawdzamy czy zawiera wartość $35 (bit 0. ma
własność „tylko do odczytu” - chociaż próbujemy go wyzerować jego wartość
powinna pozostac równa 1).
- strona 3/5 -
http://www.easy-soft.tsnet.pl/
Jeśli powyższe warunki zostaną spełnione - mamy do czynienia z portem ECP. Przykład
użytej w Delphi funkcji sprawdzającej jest podany poniżej :
function TMainForm.CheckECPMode(LPTNumber:Integer):Boolean;
var
EcrValue:Byte;
CtrlValue:Byte;
BaseAddr:Word;
ECRAddr:Word;
begin
if ((LPTNumber<1) or (LPTNumber>3)) then begin
MessageBeep(0);
Result:=False;
Exit;
end;
case LPTNumber of
1: BaseAddr:=Lpt1Addr;
2: BaseAddr:=Lpt2Addr;
3: BaseAddr:=Lpt3Addr;
end;
ECRAddr:=BaseAddr + $402;
asm
mov dx,ECRAddr
in al,dx
mov EcrValue,al
end;
if (((EcrValue and $01) <> $01) or ((EcrValue and $02) <> 0)) then begin
Result:= False;
Exit;
end;
asm
mov dx,ECRAddr
mov al,$34
out dx,al
end;
asm
mov dx,ECRAddr
in al,dx
mov CtrlValue,al
end;
if CtrlValue=$35 then begin
Result:=True;
asm
mov dx,ECRAddr
mov al,EcrValue
out dx,al
end;
end else Result:=False;
end;
- strona 4/5 -
http://www.easy-soft.tsnet.pl/
Gdy powyższa funkcja zwróci False program wyświetla okienko informujące, że wybrany
port nie da się programowo skonfigurować . Jeśłi ECP zostanie pomyślnie wykryte -
otwiera się panel zmiany trybu :
Aktualnie ustawiony tryb jest podświetlony. Klikając na odpowiednich polach wybieramy
tryb, który jest nam potrzebny. Panel ograniczyłem do trybów zazwyczaj używanych w
amatorskich konstrukcjach. Nic nie stoi na przeszkodzie aby go sobie rozbudować - na
stronie EP jest zamieszczony kod źródłowy projektu Delphi.
Na sprawdzanych przeze mnie maszynach po starcie port ECP jest inicjalizowany jako
SPP - nic więc dziwnego, że bez przestawienia nie chciały funkcjonować aplikacje
używające trybu dwukierunkowego.
Powyższy opis tylko w bardzo wyrywkowym i ograniczonym stopniu prezentuje
rozszerzone możliwości portu ECP. Zainteresowani znajdą sporo informacji w Internecie.
Zwłaszcza godne polecenia są strony:
http://www.beyondlogic.org/ecp/ecp.htm
http://www.lvr.com/parport.htm
gdzie oprócz informacji merytorycznych znajdziemy wiele linków do dalszych źródeł.
Jerzy Szczesiul
jerzy.szczesiul@ep.com.pl
- strona 5/5 -