Rozdział 10 System odmierzania czasu


Rozdział 10.
System odmierzania czasu



Możliwość precyzyjnego odmierzania odcinków czasowych ma istotne znaczenie w pracy systemu. Oto przykładowe operacje wymagające dokładnego określenia czasu:
Czas wykonywania pewnych fragmentów programu musi być niezależny od obecnego w danym systemie procesora i szybkości jego taktowania. Wiele programów, w tym gry, wymaga wbudowanych opóźnień lub kontroli upływu czasu rzeczywistego. Czas wykonania klasycznej pętli programowej for w bardzo dużym stopniu zależy od sprzętu.
W oparciu o zegar czasu rzeczywistego system operacyjny prowadzi ewidencję plików dyskowych i katalogów, posługując się między innymi datą i czasem ich założenia lub modyfikacji. Jest to jedyny sposób ustalenia, który z plików zawiera aktualne dane.
Wiele funkcji systemowych, np. odświeżanie pamięci dynamicznej, wymaga okresowego wykonywania z dokładnie określoną częstotliwością.
Mechanizmy napędowe stacji dysków elastycznych wymagają podawania bardzo precyzyjnych impulsów.
Układ 8253/8254
Klasyczna architektura komputera PC/XT i PC/AT zawiera jeden programowalny generator typu 8253 lub 8254. Ten drugi różni się minimalnie od pierwszego posiadaniem dodatkowego rozkazu Read-Back. Nowoczesne modele AT, zwłaszcza 386 i 486, dysponują niekiedy dwoma takimi generatorami. Uproszczony schemat blokowy układu 8253 przedstawiony jest na rysunku 10.1.
Na układ ten składają się trzy w pełni niezależne generatory oznaczone numerami O, l i 2. Każdy z bloków generacyjnych zawiera niezależne wejścia GATE i CLK oraz wyjście OUT. Dla potrzeb programowania generatory połączone są wewnętrzną 8-bitową magistralą. Zestaw dodatkowych sygnałów sterujących umożliwia procesorowi dwukierunkowy dostęp do rejestrów sterujących każdego z nich.




Centralnym elementem każdego z generatorów jest programowany licznik CE (Counting Element), którego ustawiona wstępnie w fazie programowania zawartość może być - zależnie od trybu pracy - na różne sposoby zmniejszana. 16-bitowa liczba przeznaczona do zapisania w rejestrze CE danego generatora dostarczana jest (w porcjach po 8 bitów) magistralą wewnętrzną układu do dwóch stowarzyszonych z danym rejestrem CE rejestrów pośrednich CW#H i CW#L. Tam oczekuje na przepisanie do CE pierwszym impulsem na wejściu CLK, który nadejdzie po zaprogramowaniu danego generatora. W podobny sposób, tj. poprzez jednobajtowe rejestry pośrednie CR#H i CR#L, odbywa się transport zawartości rejestru CE w rozkazach sprawdzających jego stan.
Oryginalny generator 8253 umieszczony jest w obudowie 24-końcówkowej, obecnie jednak jego struktura zintegrowana jest zwykle w jednym z układów scalonych wysokiej skali integracji tworzących "obudowę" procesora. Wyprowadzenia układu w wersji DIL 24 przedstawione są na rysunku 10.2.











Opis znaczenia końcówek układu 8253 podano poniżej.
GATE0 - GATE2=Gate) - wejścia sygnałów aktywujących (bramkujących) generatory 0-2.
CLK0 - CLK2=(Clock) - wejścia sygnałów taktujących dla generatorów 0-2.
OUT0 - OUT2=Output) - wyjścia generatorów 0-2.
D0 - D7=8-bitowa, dwukierunkowa magistrala danych. Kierunek transmisji ustalany jest sygnałami ~WR i ~RD.
~CS=(Chip Select) - niski poziom logiczny na tym wejściu wprowadza układ 8253 w stan programowania. Poziom logiczny na wejściu ~CS nie ma wpływu na pracę generatorów.
~WR=(Write) - procesor wymusza niski poziom logiczny na tym wejściu, chcąc zapisywać dane do wewnętrznych rejestrów generatorów.
~RD=(Read) - procesor wymusza niski poziom logiczny na tym wejściu, chcąc odczytywać dane z wewnętrznych rejestrów generatorów.
A0 - A l=Wejścia adresujące w trybie programowania jeden z generatorów 0- 2 lub rejestr stanu układu. Możliwe są następujące kombinacje linii adresowych:


A0; A1; Adresowany rejestr

0; 0; licznik CE0
1; 0; licznik CEl
0; 1; licznik CE2
l; l; rejestr stanu


V#CC=Wejście napięcia zasilającego (+5V). GND= Masa zasilania.
Każdy z trzech generatorów układu 8253 może być niezależnie zaprogramowany do pracy w jednym z sześciu trybów. Tylko dwa z nich znajdują zastosowanie w PC, ale nie zapominajmy, że układ ten nie tylko tam jest stosowany. Cechą wspólną wszystkich trybów jest odliczanie "w dół" od ustawionej wartości początkowej 16-bitowego licznika CE. Generator rozpoczyna pracę w danym trybie natychmiast po załadowaniu rejestru sterującego. Moment ten będziemy nazywać stanem początkowym.

Tryb 0.


W stanie początkowym wyjście OUT znajduje się w stanie 0. Po załadowaniu do wybranego licznika CE wartości N (oznaczającej liczbę zliczanych impulsów taktujących) następuje odliczanie impulsów podawanych na wejście CLK do chwili wyzerowania licznika CE, co powoduje pojawienie się na wyjściu OUT stanu 1. Stan ten utrzymywać się będzie aż do nadejścia następnego słowa sterującego, programującego generator do pracy w trybie 0. Odliczanie impulsów taktujących ma miejsce tylko wtedy, gdy na wejście GATE podany jest wysoki poziom logiczny.
OUT0 - OUT2=Output) - wyjścia generatorów 0-2.
DO - D7=8-bitowa, dwukierunkowa magistrala danych. Kierunek transmisji ustalany jest sygnałami ~WR i ~RD.
~CS=(Chip Select) - niski poziom logiczny na tym wejściu wprowadza układ 8253 w stan programowania. Poziom logiczny na wejściu ~CS nie ma wpływu na pracę generatorów.
~WR=(Write) - procesor wymusza niski poziom logiczny na tym wejściu, chcąc zapisywać dane do wewnętrznych rejestrów generatorów.
~RD=(Read) - procesor wymusza niski poziom logiczny na tym wejściu, chcąc odczytywać dane z wewnętrznych rejestrów generatorów.
AO - A l=Wejścia adresujące w trybie programowania jeden z generatorów 0- 2 lub rejestr stanu układu. Możliwe są następujące kombinacje linii adresowych:

A0; A1; Adresowany rejestr
0; 0; licznik CE0
1; 0; licznik CEl
0; 1; licznik CE2
l; l; rejestr stanu

V#CC=Wejście napięcia zasilającego (+5V). GND= Masa zasilania.
Każdy z trzech generatorów układu 8253 może być niezależnie zaprogramowany do pracy w jednym z sześciu trybów. Tylko dwa z nich znajdują zastosowanie w PC, ale nie zapominajmy, że układ ten nie tylko tam jest stosowany. Cechą wspólną wszystkich trybów jest odliczanie "w dół" od ustawionej wartości początkowej 16-bitowego licznika CE. Generator rozpoczyna pracę w danym trybie natychmiast po załadowaniu rejestru sterującego. Moment ten będziemy nazywać stanem początkowym.

Tryb 0.


W stanie początkowym wyjście OUT znajduje się w stanie 0. Po załadowaniu do wybranego licznika CE wartości N
(oznaczającej liczbę zliczanych impulsów taktujących) następuje odliczanie impulsów podawanych na wejście CLK do
chwili wyzerowania licznika CE, co powoduje pojawienie się na wyjściu OUT stanu 1. Stan ten utrzymywać się będzie aż
do nadejścia następnego słowa sterującego, programującego generator do pracy w trybie 0. Odliczanie impulsów
taktujących ma miejsce tylko wtedy, gdy na wejście GATE podany jest wysoki poziom logiczny.

Tryb 1.
W stanie początkowym wyjście OUT jest w stanie 1. Pierwszy impuls podany na wejście CLK powoduje pojawienie się na wyjściu OUT stanu O, który utrzymuje się do końca zliczania impulsów taktujących. Pierwszy impuls pojawiający się na wejściu CLK po przejściu licznika CE przez stan 0000, powoduje ponownie wystawienie na wyjściu OUT logicznej jedynki. Układ wytwarza więc pojedynczy impuls niskiego poziomu logicznego o czasie trwania N x T#CLK, gdzie N jest pierwotną zawartością licznika CE, a T#CLK jest okresem przebiegu taktującego podawanego na wejście CLK.
Stan sygnału GATE musi być utrzymany na poziomie logicznej jedynki przez cały cykl zliczania. Jeżeli sygnał GATE zmieni swój poziom na zero, jego powrót do poziomu wysokiego spowoduje ponowne załadowanie licznika CE wartością N. Możliwe jest oczywiście zapisanie nowej wartości N w czasie pracy generatora (cyklu zliczania), ale będzie ona uwzględniona dopiero od następnego impulsu GATE.
Tryb 2.
Działanie trybu 2. jest analogiczne do opisanego wyżej trybu l. aż do momentu osiągnięcia przez licznik CE wartości 0001, tj. tuż przed końcem odliczania. Stan wyjścia OUT (znajdującego się dotychczas w stanie l) zostaje wówczas na czas jednego okresu przebiegu taktującego sprowadzony do niskiego poziomu logicznego. Licznik CE ładowany jest powtórnie wartością N i cykl powtarza się. Zliczanie ma miejsce tylko dla GATE = l i jest wstrzymywane na czas, gdy GATE=0. W trybie 2. generowany jest --jak widać - okresowo impuls szpilkowy o okresie N x T#CLK i szerokości T#CLK
Tryb 3.
Działanie układu 8253 w tym trybie jest identyczne z działaniem w trybie l. aż do momentu osiągnięcia przez licznik CE wartości N/2. Następuje wówczas zmiana stanu wyjścia OUT z l na 0. Stan OUT = O utrzymuje się do momentu wyzerowania licznika CE, po czym zmienia się na 1 Opisany proces przebiega tylko wtedy, gdy na wejście GATE podany jest stan 11; w przeciwnym razie na wyjściu OUT utrzymuje się stały wysoki poziom logiczny.
"Zewnętrznie" działanie układu 8253 w trybie 3. sprowadza się do generacji przebiegu prostokątnego o okresie N x TCLK. Układy wewnętrzne pracują jednak nieco inaczej, nie odliczają bowiem impulsów taktujących do osiągnięcia przez licznik wartości N/2. Zamiast tego odbywa się dwukrotnie zliczanie impulsów po dwa, co nakłada ograniczenie na dokładność określenia długości generowanych impulsów. Kwantem odmierzanego czasu jest okres przebiegu taktującego TCLK i nie można przy nieparzystych N żądać jego podziału na pół. Przy N parzystych generowany jest przebieg prostokątny o współczynniku wypełnienia (stosunku czasu trwania stanu wysokiego do czasu trwania stanu niskiego w ramach jednego okresu) równym 1 / 2. W przypadku nieparzystej wartości N układy sterowania ładują liczniki CE wartością N - 1. Powoduje to, że faza wysokiego
poziomu logicznego trwa (N + 1) x T#CLK / 2, natomiast faza poziomu niskiego (N - 1) x T#CLK / 2. Generowany jest więc przebieg prostokątny o współczynniku wypełnienia nieznacznie większym od 1 / 2. Z oczywistych względów W musi być co najmniej równe 2.
Tryb 4.
W stanie początkowym wyjście OUT jest w stanie wysokim. Pierwszy impuls podany na wejście CLK wpisuje do licznika CE zadaną wartość N. W stanie GATE = l następne impulsy taktujące powodują zmniejszanie licznika do osiągnięcia wartości 0000. Poziom na wyjściu OUT opada wówczas do zera na czas T#CLK W trybie 4. mówimy o programowym wyzwalaniu licznika, bowiem moment rozpoczęcia odliczania określony jest dokonaniem zapisu do rejestru sterującego.
Tryb 5.
W przeciwieństwie do pracy w trybie 4., licznik wyzwalany jest sprzętowo poprzez zmianę poziomu na wejściu GATE z O na 1 Powoduje to zapisanie do licznika CE wartości A; i rozpoczęcie odliczania. Sygnał na wyjściu OUT przyjmuje poziom zera logicznego po N+1 cyklach przebiegu taktującego, począwszy od impulsu wyzwalającego GATE. Przedwczesne (przed zakończeniem odliczania), ponowne podanie impulsu GATE powoduje odnowienie wartości N, a więc generowany impuls nigdy nie będzie krótszy od założonej wartości.
Wszystkie generatory układu scalonego 8253/8254 zainstalowanego w komputerze PC/XT lub AT taktowane są tą samą częstotliwością zegarową, równą 1,19318 MHz. Sygnał CLK wytwarzany jest w oddzielnym układzie generacyjnym w sposób niezależny od procesora. Przyporządkowanie generatorów układu obrazuje rysunek 10.3.






Programowanie generatora 8253/8254
Poszczególne generatory układu dostępne są programowo poprzez poniższe porty.
Adres; Rejestr

040h (048h); licznik generatora 0
041h(049h); licznik generatora 1
042h (04Ah); licznik generatora 2
043h (04Bh); rejestr sterujący

Rejestry liczników CE można zapisywać i odczytywać. Rejestr sterujący (wspólny dk całego układu scalonego) może być tylko zapisywany. Numery portów podane w nawiasach dotyczą drugiego układu 8254, instalowanego w niektórych komputerach AT-386 i 486; konfiguracja dodatkowego układu opisana jest w punkcie Drugi układ 825^ i jego zastosowanie.
Układ 8253 zostaje wprowadzony w tryb programowania po przesłaniu do rejestn sterującego (port 043h) rozkazu o następującej budowie:

bit 7; bit 6; bit 5; bit 4; bit 3; bit 2; bit 1; bit 0

bity 7-6=Wybór generatora:
00 - generator 0,
01 - generator l,
10 - generator 2,
11 - dla układu 8253 kombinacja zabroniona, dla 8254 rozkaz Read-Back.
bity 5-4=Rodzaj operacji:
00 - przepisanie zawartości licznika CE do rejestrów CR#H i CR#L,
01 - zapis lub odczyt tylko mniej znaczącego bajtu licznika CE (LSB),
10 - zapis lub odczyt tylko bardziej znaczącego bajtu licznika CE(MSB),
11 - zapis lub odczyt obydwu bajtów licznika CE.
bity 3 - l=Tryb pracy generatora:
000 - tryb 0,
001 - tryb l,
010 - tryb 2,
011 - tryb 3,
100 - tryb 4,
101 - tryb 5.
bit 0 Sposób odliczania:
0 - zliczanie w kodzie binarnym (16-bitowym); FFFFh - 0000h Iub 65535#d-0,
1- zliczanie w kodzie BCD; 9999d - 0.






W następnej kolejności należy przesłać dane opisujące stan początkowy licznika CE zaadresowanego bitami 7-6. Rozkazy zapisujące tylko jedną połowę licznika CE uzupełniane są przez układy sterujące w taki sposób, że pozostała część CE wypełniana jest zerami. Rozkaz adresowany do określonego generatora jest ważny do czasu wysłania następnego rozkazu. Oznacza to, że stan dostępnych przez porty 040h - 042h liczników 0-2 można zmieniać "na gorąco" podczas pracy generatora. Obowiązuje jednak sprecyzowane w bitach 5-4 znaczenie i ilość akceptowanej przez rejestry informacji. Nie można więc, nie wysyłając nowego rozkazu, modyfikować wyłącznie bardziej znaczącego bajtu licznika, jeżeli pierwszy rozkaz ustawiał jego mniej znaczący bajt. Identyczne ograniczenia obowiązuj przy odczycie stanu licznika.
W ramach obowiązywania jednego rozkazu można odczytywać tylko tę część licznika, która została tym rozkazem zapisana; w szczególności może to być zawartość całego licznika.
Aktualny stan licznika CE dowolnego z generatorów można uzyskać przez odczyt odpowiedniego portu instrukcją in. Instrukcja ta, skierowana do portu licznika danego generatora, nie sięga bezpośrednio do rejestru CE, lecz do rejestrów zatrzaskowych CR#L i CR#H, które oddzielają CE od wewnętrznej magistrali układu. Aby umieścić w tych rejestrach zawartość CE, należy najpierw wysłać do portu 043h słowo rozkazu z wy-zerowanymi bitami 5-4. Bity 7-6 takiego rozkazu identyfikują oczywiście odpowiedni generator, a bity 3 - 0 są w tej operacji ignorowane. Dopiero teraz można bezpiecznie zastosować rozkaz in (odpowiednio raz lub dwa razy) dla odczytania aktualnego stanu licznika CE.
Przykład:

inov al,00h ; adresowany generator O
out 43h,al ; przepisz zawartość CE do CRL i CRH
in al,40h ; odczytaj zawartość CRL do AL
mov al,ah ; przepisz AL do AH
in al,40h ; odczytaj zawartość CRH do AL
xchg al,ah ; zamień połówki rejestru AX -> AX = CE

Nieco skomplikowany sposób odczytu rejestrów CRL i CRn wynika z faktu, że operan-dem rozkazu in może być jedynie rejestr AL (lub AX), natomiast przez port 040h dostępny jest najpierw rejestr CR#L, a następnie CR#H. Zwróćmy również uwagę, że dla układu 8253 nie ma możliwości odczytania stanu początkowego licznika CE, ustawionego trybu pracy ani tego, czy generator programowany był jednym, czy dwoma bajtami. Niemożliwe jest również sprawdzenie, czy licznik odlicza w kodzie binarnym, czy BCD.
Możliwościami uzyskania tych danych dysponuje natomiast, dzięki wbudowanemu rozkazowi Read-Bcick, układ 8254. W odpowiedzi na ten rozkaz układ zwraca bajt będący źródłem informacji o sposobie zaprogramowania generatora. Rozkaz ten udostępnia również alternatywną metodę odczytania aktualnego stanu licznika CE.
Rozkaz Read-Back przekazywany jest przez port rejestru sterującego 043h.
1; 1 ; bit 5; bit 4; bit 3; bit 2 ; bit l; 0

bity 7-6 =11- sygnatura rozkazu.
bit 5=0 - rozkaz podania stanu licznika CE.
bit 4=0 - rozkaz podania statusu.
bit 3=1 - wybór licznika 2.
bit 2=1 -wybór licznika 1.
bit 1=1 - wybór licznika 0.
bit 0=Zawsze 0.

Widzimy, że jednym rozkazem Read-Back można odwołać się do kilku generatora jednocześnie.

Układ 8254 reaguje na rozkaz podania stanu licznika CE zwracając (w zależności od sposobu zaprogramowania) jeden lub dwa bajty w porcie odpowiadającym danemu g neratorowi.

Rozkaz określenia statusu (ustawiony bit 4 bajtu rozkazu Read-Back) wyprowadza do portu wybranego generatora następujący bajt statusowy:

bit 7; bit 6; bit 5; bit 4; bit 3; bit 2 ; bit l;bit 0;

bit 7=Stan wyjścia OUT:
0 - wyjście w stanie niskim,
1 - wyjście w stanie wysokim.
bit 6=
0 - licznik CE został załadowany i może być odczytany,
1 - CE jeszcze nie jest załadowany.
bity 5-4=Tryb programowania licznika CE:
00 - kombinacja zabroniona,
01 - zapis lub odczyt tylko mniej znaczącego bajtu CE,
10 - zapis lub odczyt tylko bardziej znaczącego bajtu CE,
11 - zapis lub odczyt obydwu bajtów CE.
bity 3-1=Tryb pracy generatora:
000 - tryb 0,
001 - tryb 1,
010 - tryb 2,
011 - tryb 3,
100 - tryb 4,
101 - tryb 5.
bit 0=Sposób odliczania:
0 - zliczanie w kodzie binarnym (16-bitowym); FFFFh - 0000h lub 65535#d-0,
1 - zliczanie w kodzie BCD; 9999#d - 0.

Zegar systemowy
Rysunek 10.4. przedstawia schematycznie zasadę funkcjonowania zegara systemowego.











Generator 0 zaprogramowany jest do pracy w trybie 2. i pobiera przebieg taktujący CLK o częstotliwości l,19318 MHz. Licznik CE tego generatora ustawiany jest na wartość FFFFh, co daje współczynnik podziału 65 536. W wyniku tego, krótkimi impulsami o częstotliwości 18,2065 Hz wyzwalane jest przerwanie sprzętowe na linii IRQ0. Prowadzi to do periodycznego wywoływania procedury INT 08h, obsługującej to przerwanie. Procedura ta inkrementuje każdorazowo stan 32-bitowego licznika zlokalizowanego w obszarze danych BIOS począwszy od adresu 0040:006Ch.
Adres; Szerokość; Znaczenie
0040h:006Ch; słowo; mniej znaczące słowo licznika
0040h:006Eh; słowo; bardziej znaczące słowo licznika
0040h:0070h; bajt; wskaźnik przepełnienia licznika
Następnie sprawdzane jest, czy nowa zawartość licznika nie przekracza 24 godzin (l 573 040 impulsów zegara systemowego), a jeżeli tak, to licznik jest zerowany. Licznik ten jest podstawowym źródłem informacji o upływającym czasie, wykorzystywanym przez system operacyjny. Zlicza on jednak czas od momentu startu systemu, a zatem nie pozwala jednoznacznie określić bieżącej daty i czasu. Dane te musimy wprowadzić podczas startu systemu operacyjnego poleceniami systemu date i time lub za pomocą innego programu, wpisującego odpowiednie wartości do wspomnianego obszaru pamięci. Modele AT wyposażone są standardowo w zegar czasu rzeczywistego (z podtrzymaniem bateryjnym), którego zawartość jest automatycznie przepisywana do pamięci komputera w chwili startu systemu.
W przypadku modelu XT podtrzymywany bateryjnie zegar czasu rzeczywistego znajduje się na ogół na wielofunkcyjnej karcie rozszerzenia Multi l/O, zaś aktualizacją czasu i daty zajmuje się dostarczany wraz z kartą dedykowany program (na przykład clock.com), uruchamiany zwykle w pliku poleceń autoexec.bat.
Układ odświeżania pamięci dynamicznej
Pamięć operacyjna komputera jest pamięcią dynamiczną (ang. DRAM- Dynamie Ran-dom Access Memory). Nośnikiem informacji są w niej ładunki elektryczne uwięzione w krysztale półprzewodnika. Na skutek będących nie do ominięcia właściwości fizycznych materiału ładunki te uchodzą do podłoża układu scalonego, tak więc komórka pamięci dynamicznej pozostawiona sama sobie ma tendencje do stopniowej utraty informacji. Aby temu zapobiec, infonnację zmagazynowaną w komórce należy co pewien czas odświeżać. Charakterystyczną cechą tego rodzaju pamięci jest to, że każda operacja odczytu komórki pamięci powoduje automatycznie jej odświeżenie.
Poszczególne komórki pamięci zorganizowane są w wiersze i kolumny. Organizacja taka sprawia, że odczyt dowolnej z komórek powoduje jednoczesne aktywowanie (odświeżenie) całego wiersza lub kolumny, zależnie od organizacji bloku DRAM. Schemat blokowy mechanizmu odświeżania pamięci przedstawiony jest na rysunku 10.5.





Projektanci komputera PC zarezerwowali dla potrzeb układu odświeżania pamięci dynamicznej generator numer 1. Licznik CE tego generatora otrzymuje wartość początkową ł 8 (I2h) - programowany jest tylko mniej znaczący bajt. Generator pracuje w trybie 3., a na wejście CLK podawany jest sygnał taktujący o częstotliwości 1,19318 MHz. Generowany jest więc przebieg prostokątny o współczynniku wypełnienia 1/2 (N=18 jest parzyste) i częstotliwości 1,19318 MHz/18 = 66,288 kHz. Sygnał ten kierowany jest do kanału 0 układu DMA, a jego narastające zbocze wywołuje regularnie co 15 ms żądanie obsługi. Kanał O DMA jest zaprogramowany do normalnej transmisji typu pa-mięć-urządzenie wejścia-wyjścia.
Układy sterowania pamięcią, tj. dekodery adresu i wzmacniacze odczytu, zostają pobudzone do pracy, co powoduje odświeżenie wszystkich komórek wiersza lub kolumny
pamięci. Adresowane przez układ DMA słowo zostaje oczywiście wystawione na magistralę danych, jednak żadne z
urządzeń wejścia-wyjścia nie czuje się zobligowane do jego odebrania, toteż znika ono z magistrali w trakcie jej
następnego cyklu. Kolejna transmisja kanałem O DMA sięga do następnej komórki i tak po pewnym czasie odświeżeniem
objęty zostaje cały obszar pamięci.
Współczynnik podziału równy 18 dostosowany był do układów pamięci znajdujących się na rynku w czasach
powstawania modelu PC. W ostatnich latach nastąpił ogromny postęp w technologii produkcji układów scalonych.
Nowoczesne układy pamięci nie wymagają już tak częstego odświeżania. Zbyt częste, zbędne dostępy do pamięci
powodują naturalnie spowolnienie pracy całego systemu. Dla każdego modelu komputera można indywidualnie
poeksperymentować, zmniejszając częstotliwość pracy układu odświeżania. Zbyt duże przerwy czasowe objawiają się
błędami pamięci, które sygnalizowane są przez układy kontroli parzystości. Generowane jest wówczas przerwanie NMI,
co powoduje wyświetlenie komunikatu i zatrzymanie systemu. Wprowadzane przez nas zmiany w częstotliwości pracy
układu odświeżania nie mają oczywiście charakteru trwałego; ponowne załadowanie systemu przywraca wartości
początkowe.
Przykładowy program w języku Turbo C pozwoli na kilka doświadczeń na tym polu:
#include
#include
/* program REFR reguluje częstotliwość odświeżania pamięci */
int main (int argc , char *argv[]} {
int refr ;
if(argc < 2) /* nie podano częstotliwości odświeżania! */ {
printf("\n Brak parametru!\n Wywołanie: refr \n "); return(l); }
refr = atoi(argv[1]);
if(refr < 2 || refr > 255) /* podano złą częstotliwość */ {
printf("\n Zły parametr! licznik = O...255\n"); return(2); }
outp(0x43,0x56); /* wyślij słowo sterujące 01010110 */ outp(0x41,refr); /* zaprogramuj kanał l generatora*/
/* wartością refr */ printf("Nowy licznik = %d\n",refr); return (0); }
Wartość parametru programu REFR jest współczynnikiem podziału W licznika CE. Im większe /V, tym większe będą
przerwy pomiędzy kolejnymi cyklami odświeżania pamięci.

W testowanym przez autora komputerze AT-386 taktowanym zegarem 40 MHz, program si.exe (System Info) z pakietu
Norton Utilities 6.0 podał w punkcie CPU Speed współczynnik 29 dla N = 2 i 41 dla N = 255, można więc istotnie
zaobserwować wzrost mocy obliczeniowej. Jeżeli N będzie zbyt duże, należy liczyć się z możliwością zawieszenia się
systemu w najmniej oczekiwanym momencie wraz ze wszystkimi tego koń-

sekwencjami (np. niezapisaniem plików dyskowych). Zachowanie się systemu z podniesionym współczynnikiem W należy gruntownie przetestować. Od jakości użytych modułów pamięci RAM zależy, jak wysokie /V zniesie nasz komputer zanim wystąpi błąd parzystości. Należy wreszcie pamiętać, że nie wszystkie nowoczesne płyty główne "poddają się" operacji zmiany częstotliwości odświeżania pamięci, dlatego też może się zdarzyć, że wykonanie programu REFR nie przyniesie żadnych efektów.
Obsługa głośnika
Schemat blokowy zespołu współpracującego z głośnikiem przedstawiony jest na rysunku 10.6.
Do obsługi wbudowanego w komputer PC głośnika przeznaczony został generator 2. Dla wytwarzania przebiegu okresowego do sterowania głośnika przydatny jest tylko tryb 3., jako jedyny pozwalający na generację przebiegu okresowego o współczynniku wypełnienia zbliżonym do 1/2. Również tryb 2. wytwarza przebieg okresowy, ale o współczynniku wypełnienia bliskim jedności (szerokość impulsu wynosi 0,838 ms). Bezpośrednie sterowanie głośnika takim przebiegiem wytwarzałoby ton praktycznie niesłyszalny, ze względu na bezwładność membrany i dużą zawartość harmonicznych
Prostokątny sygnał z wyjścia OUT2 napotyka na swej drodze klucz sterowany stanem bitu l rejestru 61 h (port B układu 8255). Stanem wejścia GATE2 steruje bit 0 tego rejestru. Wspomniany rejestr należy fizycznie do programowanego układu wejścia-wyjścia 8255. Układ ten występuje tylko w modelu PC/XT, gdzie ma za zadanie między innymi obsługę klawiatury, odczytywanie nastaw przełączników konfiguracyjnych i sterowanie rejestrem maskowania NMI. Modele AT posługują się przy obsłudze klawiatury i pamięci konfiguracji innymi rozwiązaniami, toteż układ 8255 został z nich usunięty. Z oczywistych względów znaczenie i adres portu B zostały w architekturze AT odwzorowane sztucznie.
Po przejściu przez klucz sygnał prostokątny jest wzmacniany i przepuszczany przez filtr dolnoprzepustowy, który ma ograniczyć wyższe harmoniczne przebiegu prostokątnego i przybliżyć przebieg do sinusoidy. Jakości wytwarzanych w ten sposób tonów nie należy przeceniać, gdyż wzmacniacz, o którym mowa, zawiera zwykle dwie bramki NAND
i tranzystor, a wspomniany filtr to najczęściej dołączony równolegle do głośnika kondensator o pojemności 100 nF. Głośnik w komputerze PC służy przede wszystkim do prostej sygnalizacji, zaś zwolennicy muzyki o wysokiej jakości muszą zaopatrzyć się w specjalną kartę dźwiękową, np. Soimd Blaster lub AdLib. Istnieją też proste rozwiązania bazujące na łączu równoległym komputera (Covox).
Jak wynika ze schematu blokowego przedstawionego na rysunku 10.6, aby pobudzić do drgań membranę głośnika, należy spełnić następujące warunki:
Generator 2 musi zostać zaprogramowany do pracy w trybie 3.
Podzielnik N należy ustawić zgodnie z żądaną częstotliwością, uwzględniając możliwości akustyczne głośnika.
Należy ustawić bit O portu B układu 8255 (port 061 h), podając stan l na wejście GATE2 i uruchamiając generator.
Ustawieniem bitu l portu 061 h należy włączyć klucz.

Przykład:
Niech żądana częstotliwość drgań równa się l 000 Hz. Współczynnik podziału wyniesie
1193180 Hz:1000 Hz = 1193=4x256 + 169
MSB = 4 (00000100#b) (bardziej znaczący bajt)
LSB = 169 (10101001#b) (mniej znaczący bajt)
mov al,10110110b ;generator 2, ustawienie obu bajtów
;licznika, tryb "3",licznik binarny
out 43h,al ;wyślij rozkaz do rejestru
; sterującego 8253/8254
mov al,169 ;LSB
out 42h,al ;ustaw mniej znaczącą część CE
mov al,4 ;MSB
out 42h,al ;ustaw bardziej znaczącą część CE
in al,61h ;wczytaj zawartość portu B 8255
or al,00000011b ;ustaw bity O i l, reszta bez zmian
out 61h,al ;odeślij zawartość z powrotem do portu B

Powyższa sekwencja powoduje włączenie głośnika. Przebieg akustyczny o częstotliwości l kHz będzie od tej chwili aż do jego wyłączenia, bez udziału procesora. Wyłączenie głośnika można osiągnąć podając na wejście GATE2 zero logiczne lub otwierając klucz łączący wzmacniacz i generator:

in al,61h
and al,11111101b ; GATE2 = O
out 61h,al

lub

in al,61h
and al,11111110b ; otwórz klucz
out 61h,al

Częstotliwość drgań generatora można dowolnie zmieniać w czasie pracy układu. Załadowanie licznika CE nową wartością nie wymaga każdorazowego włączania i wyłączania generatora lub klucza. Wystarczy wprowadzić do portu 042h nowy podzielnik N (w formie LSB i/lub MSB, zależnie od wcześniejszego zaprogramowania generatora), a najpóźniej w 0,838 ms potem zostanie on przeniesiony do rejestru CE i układ zmieni swą częstotliwość pracy. Cała ta operacja jest absolutnie niewyczuwalna dla ucha ludzkiego.
Opisana w tym rozdziale metoda umożliwia sterowanie głośnikiem w sposób całkowicie niezależny od procesora. Ten ostatni musi ingerować wyłącznie (nie licząc jednorazowego zaprogramowania rejestru sterującego 043h) w momentach zmiany częstotliwości tonu, włączenia i wyłączenia głośnika.
Należy też wspomnieć tutaj o alternatywnej metodzie wytwarzania dźwięku. Korzysta się w niej z faktu, że wyjście OUT2 niezaprogramowanego generatora 2 znajduje się niewątpliwie w jednym ze stanów logicznych 0 lub 1. Wywołując okresowe zamykanie i otwieranie klucza łączącego wyjście generatora ze wzmacniaczem uzyskamy taki sam efekt, jak w przypadku obecności przebiegu prostokątnego na wyjściu OUT2 i zamkniętego na stałe klucza. Metoda ta wymaga jednak dwukrotnej ingerencji procesora w każdym cyklu generowanych drgań i tym samym nie nadaje się do generacji dźwięku "w tle". Niewątpliwą wadą tego rozwiązania jest też oczywista zależność częstotliwości wytwarzanych tonów od typu procesora i szybkości jego taktowania.
Drugi układ 8254 i jego zastosowanie
Niektóre modele AT, szczególnie przeznaczone do pracy pod kontrolą wielozadaniowych systemów operacyjnych, wyposażone są w drugi układ 8254. Wykorzystywany jest tylko jeden generator tego układu, pełniący rolę swego rodzaju systemowego zaworu bezpieczeństwa.
Teoretycznie może się zdarzyć, że wadliwie działająca aplikacja lub wręcz sam system operacyjny zablokuje wszystkie przerwania sprzętowe - bądź to rozkazem CLI, bądź przez rejestr maskujący kontrolera przerwań 8259. Procesor znajduje się wtedy najczęściej w nieskończonej pętli programowej i nie reaguje na polecenia z klawiatury. Jedynym sposobem wyjścia z tej pętli jest naciśnięcie przycisku Reset komputera, co powoduje oczywiście daleko idące konsekwencje, przyjmujące najczęściej postać utraty przetwarzanych danych. Z pomocą przychodzi w tej sytuacji właśnie dodatkowy generator nazywany fail-safe timer. Na rysunku 10.7. przedstawiono schematycznie wszystkie możliwe źródła przerwania niemaskowalnego NMI.
Wspomniany generator wyzwala okresowo przerwanie NMI. Procedura obsługi tego przerwania musi być na tyle inteligentna, by zidentyfikować jego faktyczną przyczynę.
Zgodnie z rysunkiem mogą być cztery takie przyczyny: przerwanie NMI może pochodzić od kart rozszerzających, układów kontroli parzystości RAM, koprocesora arytmetycznego i właśnie od drugiego generatora 8254. Pierwsze trzy przyczyny powodują przejście do standardowej obsługi przerwania, tj. wypisania komunikatu na ekranie monitora i zatrzymania systemu. Ostatnia przywraca reakcję procesora na przerwania sprzętowe, a użytkownik odzyskuje kontrolę nad systemem.

Wyszukiwarka

Podobne podstrony:
Rozdział 10
Rozdział 04 System obsługi przerwań sprzętowych
03 Rozdzial 10 13
Zadania do rozdzialu 10
1997 10 System ochrony garażu
Rozdział2 (10)
rozdzial (10)
rozdzial (10)
S Johansson, Origins of language (rozdział 10)
Dom Nocy 09 Przeznaczona rozdział 10 11 TŁUMACZENIE OFICJALNE
rozdzial (10)

więcej podobnych podstron