Intel 8253

Z Wikipedii, wolnej encyklopedii
Intel C8253

Intel 8253programowalny układ czasowy, składający się z trzech niezależnych 16-bitowych liczników.

Maksymalna częstotliwość pracy każdego z nich wynosi 2.6 MHz. Liczniki te są licznikami rewersyjnymi i potrafią zliczać w kodzie BCD lub binarnie. Głównym zadaniem układu 8253 jest wytwarzanie opóźnień czasowych pod kontrolą oprogramowania. Dzięki niemu programista nie musi korzystać z pętli programowych, aby zrealizować opóźnienie czasowe. Wystarczy, że odpowiednio skonfiguruje układ 8253 i zainicjuje jeden z jego liczników. Po odmierzeniu żądanego czasu układ wyśle do CPU sygnał żądania przerwania informujący o zakończeniu liczenia.

Oprócz opóźnień czasowych innymi przydatnymi funkcjami układu 8253 są:

Powyższe funkcje doskonale nadają się do realizacji głównych zadań układu 8253, którymi są: odmierzanie czasu w komputerze, odświeżanie pamięci i generowanie dźwięku z głośnika systemowego (PC speakera).

Budowa układu 8253[edytuj | edytuj kod]

Całą budowę układu 8253 można podzielić na bloki, które zostały zaprezentowane poniżej. Aby układ funkcjonował poprawnie konieczne jest jego połączenie z otoczeniem. Do tego celu służą magistrale. Z układem 8253 podłączone zostały:

  • Magistrala danych – za pomocą której przesyłane są dane informacji
  • Magistrala sterowania – za pomocą której przesyłane są sygnały służące do sterowania pracą układu
  • Magistrala adresowa – za pomocą której przesyłane są adresy pod które mają trafić dane. Mikroprocesor widzi układ 8253 jako urządzenie zewnętrzne pod czterema adresami. Jeden z adresów służy do wysyłania słowa programującego, pozostałe służą do zapisu i odczytu z licznika.

Bufor magistrali danych[edytuj | edytuj kod]

Bufor magistrali danych jest elementem układu 8253, do którego dołączona została magistrala danych. Bufor działa w dwóch kierunkach wejścia i wyjścia. Dane z magistrali danych w chwili gdy ją opuszczają zostają przepisywane w zależności od ustawienia wejść adresowych do jednego z liczników albo do rejestru słowa sterującego.

Układ odczytu/zapisu[edytuj | edytuj kod]

Zadaniem układu odczytu/zapisu jest przyjmowanie sygnałów z magistrali sterującej, a następnie wygenerowanie sygnałów sterujących dla wszystkich operacji w układzie. Do układu odczytu/zapisu doprowadzonych jest pięć wejść z sygnałami sterującymi – RD, WR, A1, A0 oraz CS.

  • RD – (ang. read) – niski poziom sygnału na tym wejściu pozwala na odczyt ośmiobitowej danej z wybranego licznika.
  • WR – (ang. write) – niski poziom sygnału na tym wejściu pozwala na wpisanie

ośmiobitowej danej do układu 8253.

  • A1, A0 – wejścia adresowe – wejścia te służą do wyboru jednego z trzech liczników lub rejestru słowa sterującego. Przyłączone są do magistrali adresowej.
  • CS – (ang. chip select) – wejście to służy do odłączenia od magistrali danych (w stanie H) lub do podłączenia do tej magistrali (w stanie L) układu 8253. Należy pamiętać, iż sygnał ten nie wpływa na pracę żadnego z liczników.

Rejestr słowa sterującego[edytuj | edytuj kod]

Wybranie rejestru sterującego następuje w chwili, gdy na wejściu A1 i A0 pojawi się wysoki poziom sygnału. Informacja, która została wysłana przez CPU, zostaje wówczas zapisana w tym rejestrze. Za jej pomocą ustala się sposób w jaki będzie pracował licznik czyli tryb, sposób liczenia oraz sposób wpisu i odczytu zawartości każdego z licznika. Należy pamiętać, iż nie ma możliwości odczytania tego rejestru.

Liczniki #0, #1, #2[edytuj | edytuj kod]

Liczniki pod względem działania są identyczne. Każdy z nich jest 16-bitowym licznikiem rewersyjnym z możliwością wpisu wartości początkowej. Maksymalna częstotliwość ich pracy to 2.6 MHz. Liczniki te są w stanie zliczać w kodzie dwójkowym lub dwójkowo-dziesiętnym (BCD).

Każdy licznik posiada 3 wyprowadzenia: CLK – wejście zegarowe, GATE – wejście bramkujące oraz OUT – wyjście. Praca wyjść tych liczników jest ściśle zależna od trybu pracy jaki został wybrany dla danego licznika (ustawionego poprzez słowo sterujące). Istnieje możliwość odczytania wartości licznika podczas pracy bez konieczności wstrzymywania jego działania.

Zasada działania[edytuj | edytuj kod]

Programowanie układu 8253 odbywa się za pomocą słowa sterującego. Słowo sterujące jest to ciąg odpowiednio ustawionych bitów, spośród których każdy odpowiada za ustawienie danej cechy układu. W słowie sterującym układu INTEL 8253 zawarte są informacje dotyczące trybu w jakim ma pracować licznik, sposobu liczenia, czynności jaką ma wykonać (zapis/odczyt) oraz numer licznika, którego operacja dotyczy.

Przed inicjalizacją trybu pracy, zawartość i wyjście każdego licznika są niezdefiniowane. Aby wpisać słowo programujące na wejściach A0 i A1 musi pojawić się wysoki poziom sygnału. Dopiero gdy tak się stanie, słowo programujące zostaje zapisane. W kolejnym kroku do układu wprowadzona zostaje dana zawierająca wartość początkową licznika. W związku z tym, że każdy z liczników jest programowany indywidualnie, musimy przesłać do rejestru słowa sterującego trzy różne instrukcje sterujące.

Operacja zapisu[edytuj | edytuj kod]

Operacja zapisu możliwa jest w chwili, gdy wartości WR i CS będą równe 0. Wówczas otwarta zostaje magistrala danych i możliwe jest wprowadzanie informacji.

Programowanie układu 8253 odbywa się w dwóch etapach: etap pierwszy, podczas którego ustalamy tryby pracy dla poszczególnych liczników oraz etap drugi, w czasie którego ustawiamy dla każdego z nich wartości początkowe.

Kolejność programowania układu 8253 jest dobrowolna. Oznacza to, że wpisywanie słów sterujących do liczników może odbywać się w dowolnej kolejności. Jednak już wpisywanie do licznika żądanej wartości musi odbywać się dokładnie według kolejności zaprogramowanej w słowie sterującym. Wpisywanie wartości początkowych do poszczególnych liczników może już przebiegać w dowolnej kolejności.

Operacja odczytu[edytuj | edytuj kod]

Odczyt zawartości liczników w układzie 8253 może odbywać się na dwa sposoby.

Sposób pierwszy polega na wybraniu odpowiedniego licznika za pomocą sygnałów A0 i A1 i odczytu sygnałem WR. Sposób ten wymaga jednak zatrzymania (zablokowania) licznika, aby móc uzyskać stabilny wynik. Drugi sposób jest dla nas trochę wygodniejszy, ponieważ nie wymaga blokowania licznika. Układ 8253 jest wyposażony w specjalną wewnętrzną strukturę logiczną, która jest dostępna po wpisaniu odpowiedniego słowa sterującego. W chwili gdy wyślemy do układu (przy A0=1 i A1=1) słowo sterujące o specjalnym kodzie (zaprezentowanym poniżej) zawartość licznika zostaje przesłana do rejestru „przejściowego” tak, że znajduje się w nim stabilna wartość. Tak naprawdę więc w tym sposobem odczytujemy wartość z rejestru „przejściowego”.

Słowo sterujące
D7 D6 D5 D4 D3 D2 D1 D0
0/1 0/1 0 0 X X X X

D7, D6 – wybór licznika
D5, D4 – kod operacyjny przesłania zawartości wybranego licznika do rejestru „przejściowego”.
D3 – D0 – bity niemające znaczenia.

Tryby pracy[edytuj | edytuj kod]

W układzie 8253 istnieje możliwość zaprogramowania licznika w sześciu różnych trybach pracy. Cechą wspólną wszystkich trybów jest zliczanie „w dół” od wybranej wartości początkowej. Licznik rozpoczyna pracę w danym trybie natychmiast po załadowaniu rejestru sterującego. Poniżej znajduje się dokładny opis każdego dostępnego trybu.

Tryb 0 – Przerwanie po odliczeniu żądanej liczby impulsów.
W stanie początkowym wyjście OUT znajduje się w stanie 0. Po załadowaniu do wybranego licznika wartości początkowej licznik zaczyna zliczać (wyjście OUT nadal znajduje się w stanie niskim). W chwili gdy licznik się wyzeruje następuje przejście wyjścia OUT do stanu wysokiego. Stan ten będzie się utrzymywał aż do nadejścia następnego słowa sterującego. Odliczanie impulsów taktujących odbywa się tylko wtedy, gdy utrzymany jest wysoki poziom logiczny na wejściu GATE.

Tryb 1 – Programowalny uniwibrator.
W stanie początkowym wyjście układu jest w stanie wysokim. Po wystąpieniu narastającego zbocza na wejściu GATE, wyjście OUT zmienia swój stan na niski. Stan ten będzie trwał do końca zliczania impulsów taktujących. W chwili wyzerowania licznika wyjście OUT ponownie przechodzi w stan wysoki. Pojawienie się narastającego zbocza na wejściu GATE podczas trwania impulsu wyjściowego powoduje, że licznik ponownie zaczyna zliczać od wartości początkowej (i w rezultacie następuje przedłużenie impulsu). Wpisanie nowej wartości do licznika, gdy OUT jest w stanie niskim nie zmienia długości trwania bieżącego impulsu wyjściowego, aż do wystąpienia następnego narastającego zbocza na wejściu GATE.

Tryb 2 – Programowalny dzielnik częstotliwości.
Działanie trybu 2 jest podobne do trybu 1 aż do chwili gdy licznik osiągnie wartość jeden (przed końcem odliczania). Wyjście OUT, które znajdowało się dotychczas w stanie wysokim, zostaje wówczas sprowadzone do niskiego poziomu na czas jednego okresu przebiegu taktującego. Następuje ponowne załadowanie licznika wartością i wykonanie całego cyklu. W chwili gdy do licznika (w trakcie jego pracy) wpiszemy nową wartość, to licznik dokończy zliczanie z poprzednią wartością, a następnie rozpocznie zliczać od nowej wartości. Wystąpienie na wejściu GATE stanu niskiego powoduje przejście wyjścia OUT do stanu wysokiego.

Tryb 3 – Generator fali prostokątnej.
Tryb 3 podobny jest do trybu 2, aż do chwili gdy licznik odliczy połowę impulsów zegarowych. Wówczas wyjście OUT (które znajdowało się w stanie wysokim) zmienia swój stan na niski (jeśli wartość początkowa jest parzysta) i utrzymuje go przez następną połowę czasu liczenia. Takie działanie licznika uzyskuje się poprzez zmniejszanie stanu licznika o dwa po wystąpieniu opadającego zbocza zegara na wejściu CLK. W chwili wyzerowania licznika wyjście OUT zmienia stan na przeciwny, a do licznika ładowana jest ponownie wartość początkowa. Proces rozpoczyna się od nowa. W przypadku gdy wpisywana wartość początkowa jest nieparzysta oraz OUT=1, to pierwszy impuls zegara zmniejszy wartość licznika o dwa. W chwili gdy licznik się wyzeruje wyjście OUT zmienia swój stan na niski, a do licznika zostaje wpisana wartość początkowa. Pierwszy impuls zegara, który się pojawi powoduje zmniejszenie zawartości licznika o trzy, a następne impulsy zmniejszają jego zawartość o dwa, aż do wyzerowania. Następnie cały cykl się powtarza.

Tryb 4 – Generator impulsu wyzwalanego programowo.
W stanie początkowym wyjście OUT jest w stanie wysokim. W chwili wpisania do licznika wartości początkowej oraz przy sygnale GATE=1 zaczyna on zliczać impulsy zegarowe. Gdy licznik zostanie wyzerowany wyjście OUT zmienia swój stan logiczny na zero na okres jednego sygnału zegarowego. Zliczanie może zostać wstrzymane, gdy na wejściu GATE pojawi się niski poziom sygnału. Ponowne przejście GATE do stanu wysokiego powoduje, że licznik zaczyna liczyć od wartości początkowej.

Tryb 5 – Generator impulsu wyzwalany sprzętowo.
W stanie początkowym wyjście OUT jest w stanie wysokim. Odliczanie rozpoczyna się po wystąpieniu narastającego zbocza na wejściu GATE. W chwili wyzerowania się licznika na wejściu OUT pojawi się stan niski na okres jednego taktu sygnału zegarowego. W przypadku gdy podczas zliczania impulsów na wejściu GATE pojawi się narastające zbocze, licznik rozpocznie swoją prace od wartości początkowej. W związku z tym stan niski na wyjściu OUT pojawi się dopiero po odliczeniu pełnej ustalonej liczby impulsów po ostatnim narastającym zboczu sygnału GATE.

Praktyczne zastosowania układu[edytuj | edytuj kod]

Układ 8253 był jednym z najbardziej popularnych układów czasowych produkowanych seryjnie. Znaleźć go można było praktycznie w każdym komputerze. Jego głównymi zadaniami było m.in. odświeżanie pamięci czy generowanie dźwięku z głośnika systemowego. Poniżej znajduje się krótkie omówienie przykładowych zastosowań.

Watchdog[edytuj | edytuj kod]

Watchdog (ang. pies łańcuchowy) jest to układ wykrywający zawieszone procesy w komputerze. Jego zadaniem jest zresetowanie pracy procesora w przypadku, gdy nie otrzyma on w określonym czasie sygnału generowanego przez program. Do odmierzania tego czasu doskonale nadaje się układ 8253 pracujący w trybie 5.

Okres, po którym następuje zresetowanie procesora, jest wartością początkową, jaką wpisuje się do układu 8253. Układ niezależnie od głównego procesora odmierza czas dekrementując wartość licznika aż do uzyskania zera. Wyzerowanie licznika oznacza że kontrolowany proces zapętlił się i potrzebne jest jego ponowne uruchomienie. Aby zapobiec ciągłemu resetowaniu procesora, wartość licznika układu 8253 powinna być więc co jakiś czas ponownie ustawiana. Funkcja aktualizująca zawartość licznika powinna być wykonywana w krótszym odstępie czasu w porównaniu do czasu wpisywanego do licznika. Watchdog jest wykorzystywany w systemach w których bardzo ważna jest nieprzerwana praca lub przerwanie pracy może nieść pewne niebezpieczeństwa. Bardzo często są to systemy, które kontrolowane są bez obsługi człowieka.

Obsługa głośnika systemowego[edytuj | edytuj kod]

Układ Intel 8253 może być również wykorzystany do generowania dźwięku z głośnika systemowego. Aby wygenerować dźwięk o danej częstotliwości potrzebne jest zaprogramowanie dzielnika układu 8253 według wzoru: f[Hz] = 1193181 / dzielnik przy czym: dzielnik – jest to 16-bitowy rejestr, w którym umieszczane są dane. Aby ustawić wartość dzielnika należy je wysłać poprzez port 42h w kolejności najpierw mniej znaczący bajt, a później bardziej znaczący bajt. Układ 8253 powinien być zaprogramowany do pracy w 3 (poprzez port 43h). Będzie on wówczas generował sygnał prostokątny o zadanej częstotliwości, powodując iż z głośnika systemowego wydobędzie się sygnał dźwiękowy. Układ może też służyć do generatora przebiegów czasowych.

Zobacz też[edytuj | edytuj kod]