A valós idejű óra és a CMOS
Az eredeti PC-kben nem volt a gép kikapcsolt állapotában is működő valós idejű óra (RTC - Real Time Clock), így ahhoz, hogy a pontos időt és dátumot mutassa, a felhasználónak a gép minden egyes bekapcsolásakor meg kellett adnia azt. (E miatt kérdezi meg a DOS máig is a pontos időt és dátumot, ha nincs CONFIG.SYS és AUTOEXEC.BAT fájlunk.) A gép ezután a programozható időzító áramkör (8253) segítségével már "fenn tudta tartani" a pontos időt - kikapcsolásáig.
Bár már az XT-khez is fejlesztettek ki ezt a problémát áthidaló bővítőkártyákat, a valós idejű óra csak az AT kategóriájú gépekben jelent meg standard kiegészítő áramkörként. Az idő tárolásához egy kis kapacitású, CMOS technológiával készült - és ennek megfelelően kis teljesítményfelvételű - akkumlátorral vagy elemmel táplál RAM memóriát alkalmaznak, amely így a gép kikapcsolt állapotában is működőképes marad. Ugyanez az áramforrás táplálja a memóriaegységgel egybeépíttet órajelgenerátort is, amely az idő számlálásáról gondoskodik. Az óraáramkör az aktuális dátum és idő karbantartásán kívül egy tetszőleges "ébresztési" időpont bekövetkeztekor, az időadatok frissítésekor, valamint periodikusan is képes megszakítás generálására a 8. szinten (IRQ8). Az egység alapértelmezett órajele 32768 Hz, ami azonban a frekvencia-leosztás állításával változtatható.
A CMOS memóriaegységek mérete 64 ill. 128
bájt lehet. Mivel azonban az óraáramkör ebből csak az első 14 bájtot használja,
a fennmaradó cellákat a számítógép konfigurációs adatainak tárolására alkalmazzák,
ezáltal kiváltva a PC-k és XT-k esetén alkalmazott, kissé nehézkes
DIP-kapcsolós megoldást. A CMOS memória-egység írása és olvasása a megcímezni
kívánt memóriacella sorszámának a 70h portra írása után a 71h porton keresztül
lehetséges.
|
Típus | Jelentés | ||
|
Csak írható | CMOS memória címregisztere | ||
7 | : | a NMI tiltása | ||
6-0 | : | elérni kívánt CMOS memóriacella sorszáma | ||
|
Írható, olvasható | a CMOS memória kiválasztott rekesze |
A RAM memória méretének 128 bájtos felső határát a 70h port kiosztása határozza meg, hiszen legfelső bitje az NMI tiltására használható fel. Bizonyos PS/2 modellek 2048 bájtos CMOS memóriával is rendelkezhetnek, azonban ezek a memóriacellák nem ezen a csatornán keresztül érhetők el Amennyiben a CMOS memória csak 64 bájt úgy a felső 64 cella megcímzése esetén is az első 64 cellát érthetjük el.
A CMOS memória tartalma három csoportra bontható: a RTC által használt cellák, a szabványos konfigurációs területek és a (BIOS)-gyártó-specifikus konfigurációs adatok. A valós idejű óra adatait minden rendszer ugyanúgy használja fel és értelmezi. A szabványos konfigurációs adatok értelmezése gyakorlatilag szinte minden BIOS típus esetében megegyezik, csak az eredetileg nem definiált bitek értelmezésében ill. a merevlemez-típuskódók értelmezésében adódhatnak eltérések. A BIOS-specifikus konfigurációs adatok értelmezése mindig magától a renszer-BIOS-tól függ, feldolgozására csak a beépített BIOS típusának ismeretében van lehetőség.
Az RTC a CMOS memória 00h-0Dh sorszámú celláit használja fel.
|
|
Felhasználás | |||
|
|
valós idő - másodperc | |||
|
|
időzítés - másodperc | |||
|
|
valós idő - percek | |||
|
|
időzítés - perc | |||
|
|
valós idő - óra | |||
|
|
időzítés - óra | |||
|
|
dátum - a hét napja (1-vasárnap,2-hétfő, ...) | |||
|
|
dátum - nap | |||
|
|
dátum - hónap | |||
|
|
dátum - év-1900 | |||
|
|
Státus-regiszter A | |||
7 | : | számlálók frissítése folyamatban (csak olvasható) | |||
6-4 | : | órajel-frekvencia-leosztás ( 010 - 32768 Hz) | |||
3-0 | : | periódikus megszakítása ráta | |||
|
nincs | ||||
|
122 ms (minimum) | ||||
|
976.562 ms | ||||
|
500 ms | ||||
|
|
Státus-regiszter B | |||
7 | : | ciklikus frissítés engedélyezése | |||
6 | : | periódikus megszakítás engedélyezése | |||
5 | : | időzítés-megszakítás engedélyezése | |||
4 | : | frissítési megszakítás engedélyezése | |||
3 | : | négyszögjel-kimenet engedélyezése | |||
2 | : | mód ( 0 - BCD, 1 - bináris) | |||
1 | : | 24/12 órás üzemmód ( 0 - 12, 1 - 24) | |||
0 | : | nyári időszámításra átállás engedélyezése | |||
|
|
Státus-regiszter C | |||
7 | : | megszakítás-jelző flag (1 ha 6-4 bitek közül bármelyik és a neki megfelelő engedélyezési bit 1) | |||
6 | : | periódikus megszakítás történt | |||
5 | : | időzítés-megszakítás történt | |||
4 | : | frissítési megszakítás történt | |||
3-0 | : | fenntartva | |||
2 | : | mód ( 0 - BCD, 1 - bináris) | |||
1 | : | 24/12 órás üzemmód ( 0 - 12, 1 - 24) | |||
0 | : | nyári időszámításra átállás engedélyezése | |||
|
|
Státus-regiszter D | |||
7 | : | 1 - elem/akku rendben, 0 - lemerült vagy hiányzik | |||
6-0 | : | fenntartva (0) |
A B státusz-regiszter megfelelő bitjei határozzák meg, hogy mely események bekövetkezése esetén generáljon az áramkör megszakítást. Figyelem! Mivel általában az IRQ8 megszakítás indiítás után maszkolásra kerül, ezért a második megszakítás-vezérlő megfelelő bitjének törlésével (A0h port 0. bit) engedélyezni kell a megszakítások befutását is. Több engedélyezett megszakítás-típus esetén a megszakítás-kezelő rutin a C státusz-regiszter vizsgálatával döntheti el a generálás okát. Az időzítés-megszakítás - ha engedélyezve van - mindhárom regiszterpár egyezése esetén generálódik.
Ugyancsak a B státusz-regiszter segítségével határozható meg, hogy az áramkör BCD vagy bináris ábrázolási módban tárolja -e a valós időt és dátumot. 12 órás módban a valós idő és az időzítés órájának legfelső (7.) bitje határozza meg, hogy az időpont délelőtti (0) vagy délutáni (1).Amennyiben a nyári időszámításra történő átállás (Daylight Savings) engedélyezve van, úgy automatikusan minden évben április utolsó szombatján 02 órakor nyári, október utolsó szombatján 02 órakor pedig téli időszámításra tér át.
Az idő ill. dátum állítása esetén az átírás idejére érdemes a B státusz-regsizter 7. bitjének maszkolásával a frissítést tiltani, hiszen nem tudjuk az adatokat egyetlen utasítással beírni és így esetleg könnyen "átfordulhatnak" a percek esetleg órák a frissítés alatt.
Amennyiben a CMOS memóriánk gyakran "felejt", úgy a D státusz-regiszter
vizsgálata segítségével dönthetjük el, hogy a hibát az akkumlátor alacsony
feszültség-szintje vagy esetleg valami más hiba okozza -e. (A gép bekapcsolt
állapotában természetesen lemerült akkumlátor esetén sem felejt a CMOS,
hiszen ez idő alatt az alaplapon keresztül kerül táplálásra.)