GiveIO, cenny program, a powyższy tutorial jeszcze cenniejszy.
Jakby dobrze poszperać, to da się jeszcze zdobyć jakiegoś złoma (płyta główna) ze złączem ISA, co to pojedzie pod windozą 95 lub lepszą NT/XP. Mogąc grzebać spod windozy po sprzęcie, to co nas hamuje od zbudowaniem prostej karty do złącza ISA. Taka konstrukcja jest prosta, jak ... budowa cepa. Ale o paru rzeczach trzeba wiedzieć, więc może pora odczarować jak to się robi na prostym przykładzie.
Prosta karta do komputera PC ze złączem ISAProjektowanie kart rozszerzeń dla komputerów PC z użyciem złącza ISA niewiele różni się od typowego konstruowania systemów mikroprocesorowych, w których występują rejestry oraz pamięci znajdujące się w przestrzeni adresowej mikroprocesora (mikrokontrolera). Na złączu ISA występują wszystkie niezbędne sygnał pozwalające dołączyć budowane zespoły do przestrzeni adresowej komputera PC. Samo złącze ma następujący rozkład wyprowadzeń (rysunek 1).
isa2_card-i01.png
Wykorzystując szynę danych (sygnały D0 .. D7), szynę adresową (sygnały A0 .. A9), sygnały sterujące (-IOR, -IOW, AEN) można zbudować prostą kartę [tu istotna uwaga, dekoder ma zadziałać dla AEN=0; AEN=1 oznacza, że adres nie jest wystawiony przez procesor] . Przykładowa karta będzie zawierała jeden rejestr ośmiobitowy (U202, 74LS574, rysunek 5), którego stan będzie zobrazowany poprzez diody świecące LED (D201 do D208, rysunek 6). Do sterowania diodami zostanie wykorzystany układ ULN2803 (U203, rysunek 5). Rejestr (U202) jest odseparowany od szyny danych układem 74LS245 (U201, rysunek 5). Sterowania dla rejestru oraz łącznika trójstanowego są wypracowane przez dekoder adresowy zbudowany na bazie układu 74LS08 (U204, rysunek 5) oraz 74LS138 (U205, rysunek 5). Prototyp karty w wersji eksperymentalnej jest pokazany na rysunku 2).
isa2_card-i02.jpg
Do połączenia tak utworzonej karty z komputerem użyty jest “fragment z przedłużacza do kart” (rysunek 3).
isa2_card-i03.jpg
Schemat karty przedstawia rysunek 4, dekoder adresowy oraz tor danych przedstawia rysunek 5 oraz 6. W kartach ISA do dekodowania adresu w przestrzeni wejścia/wyjścia (nie pamięci) używane są linie adresowe od A0 do A9 (pomimo, że sam mikroprocesor jest w stanie wystawić pełny 16-bitowy adres).
isa2_card-i04.png
isa2_card-i05.png
isa2_card-i06.png
Jak można zauważyć, dekoder adresowy reaguje na instrukcje operujące w przestrzeni adresowej wejścia/wyjścia mikroprocesora (w dekoderze użyte są sygnały -IOR [input/output read] oraz -IOW [input/output write], co implikuje użycie w programie instrukcji języka assembler in oraz out, lub w językach wyższego poziomu instrukcji o identycznej funkcjonalności; w języku TURBO PASCAL jest wygląda to jak zapis do tablicy o nazwie port, której indeksem jest adres portu jako liczba 16-bitowa). W przypadku prezentowanej karty można pominąć sterowanie -IOR ponieważ rejestr (74LS574) jest wyłącznie do zapisu i nie ma technicznej możliwości wczytania jego stanu, ale w większości wypadków zachodzi potrzeba stworzenia takiego rozwiązania, które zapewnia zapis oraz odczyt rejestrów zawartych na projektowanej karcie. Jak widać na rysunku 5, sygnał wyboru (chip select) generowany jest w sytuacji gdy:
- wejścia A (wyprowadzenie 1) jest w stanie wysokim,
- wejście B (wyprowadzenie 2) jest w stanie wysokim,
- wejście C (wyprowadzenie 3) jest w stanie wysokim,
- wejście G1 (wyprowadzenie 6) jest w stanie wysokim,
- wejście G2A (wyprowadzenie 4) jest w stanie niskim,
- wejście G2B (wyprowadzenie 5) jest w stanie niskim.
Wejście G2B jest sterowane sygnałem AEN (ze złącza ISA), który jest aktywny stanem niskim (dekoder ma zadziałać jeżeli AEN=0 – adres na szynie danych jest ważny). Wejście G2A jest wysterowane wyjściem bramki 74LS08 (wyjście jest w stanie niskim jeżeli -IOR=0 [odczyt] lub -IOW=0 [zapis]). Wejście G1 będzie w stanie wysokim jeżeli A4=1 i A5=1. Wejście C będzie w stanie wysokim jeżeli A6=1 i A7=1. Wejście B jest w stanie wysokim jeżeli A8=1 i A9=1.Wejście A jest w stanie wysokim jeżeli A3=1. Linie adresowe A0 do A2 nie biorą udziału w dekodowaniu adresu. Często zdarza się, że na karcie znajduje się programowalny kontroler (przykładowo może być to popularny układ 8255), który w sobie zawiera kilka rejestrów (z punktu widzenia programu jest widziany jako kilka komórek na kolejnych adresach przestrzeni). Z tego powodu generator sygnału wyboru powinien aktywować rejestry dla grupy adresów. W prezentowanym rozwiązaniu dekoder adresowy aktywuje rejestr w przypadku:
- A9=1,
- A8=1,
- A7=1,
- A6=1,
- A5=1,
- A4=1,
- A3=1,
- A2=<nieistotne>,
- A1=<nieistotne>,
- A0=<nieistotne>.
W zapisie szesnastkowym są to adresy z przedziału 3F8 do 3FF. Ponieważ w komputerze na tym adresie występuje kontroler transmisji szeregowej (COM), w trakcie prób był od odłączony (zworka na standardowej karcie MULTI IO). Można było wybrać inny adres, ale w przypadku dekodowania adresu zawierającego dużo jedynek (właściwie same jedynki), realizacja dekodera adresowego staje się prosta. Nie jest to jedyne rozwiązanie dekodera adresowego i można zaproponować wiele innych rozwiązań. Dużą swobodę w wyborze adresu daje zastosowanie komparatora (przykładowo komparator liczb 8-bitowych), który porównuje stan szyny adresowej (adresy A2 do A9) ze stanem ustawianym przez 8-bitowy dipswitch. Wykrycie stanu zgodności aktywowałoby rejestry do pracy.
isa2_card-i07.jpg
Do obsługi rejestru znajdującego się na prototypowej karcie ISA został napisany krótki program w języku PASCAL (TURBO PASCAL w wersji DOS). Program w pętli zapisuje do rejestru kolejno zwiększane o jeden liczby 8-bitowe. Częstotliwość zapisów jest “taktowana” przez klawiaturę. By było widać efekty pracy programu, akcje należy znacząco zwolnić. Do tego celu jest użyta klawiatura. Naciśnięcie dowolnego klawisza (na klawisz 'x' program kończy pracę) powoduje wykonanie jednego cyklu pętli. Jeżeli przytrzymać wciśnięty klawisz, to z taktem autorepetycji klawiatury, do rejestru będą wpisywane kolejne liczby.
Kod: Zaznacz cały
program isa;
uses Crt ;
var
counter : BYTE ;
key : char ;
begin
clrscr ;
counter := 0 ;
repeat
port [ $3ff ] := counter ;
writeln ( counter ) ;
key := readkey ;
counter := counter + 1 ;
until key = 'x' ;
end.Samodzielną obsługę programową własnych kart należy rozpatrywać w dwóch aspektach:
- oprogramowanie uruchamiane w środowiskach systemów operacyjnych bez ochrony zasobów (przykładowo DOS),
- oprogramowanie uruchamiane w środowiskach systemów operacyjnych z ochroną zasobów (przykładowo Windows XP).
W przypadku systemów nie chroniących zasobów sprzętowych (jakimi są między innymi kontrolery i inne rejestry w przestrzeni wejścia/wyjścia) operowanie rejestrami na własnej karcie nie przedstawia żadnych problemów. Odczyt oraz zapis portów nie podlega żadnym ograniczeniom. Ewentualne pomyłki w adresowaniu rejestrów mogą doprowadzić do zawieszenia się komputera (przykładowo pomyłkowe przeprogramowanie kontrolera przerwań może spowodować, że komputer przestanie reagować na przerwania). Inaczej przedstawia się problematyka w systemach, w których dostęp do kontrolerów (w ogólności do jakichkolwiek rejestrów z przestrzeni wejścia/wyjścia) jest chroniony. Zwykły program użytkowy nie może bezpośrednio używać instrukcji do przesyłania danych z/do rejestrów. Użycie takich instrukcji zostanie potraktowane przez system operacyjny jako nielegalne i wykonanie programu zostanie wstrzymane z komunikatem błędu wykonania.
Załącznik wideo:
isa2.mov