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.
 

Cím
Típus Jelentés
70h
Csak írható CMOS memória címregisztere
    7 : a NMI tiltása
    6-0 : elérni kívánt CMOS memóriacella sorszáma
71
Írható, olvasható a CMOS memória kiválasztott rekesze
 
Minden a 70h portra történő írás után - így az NMI tiltásakor/engedélyezésekor is - a 71h porton keresztül is el kell végezni egy adatmozgató műveletet, különben a RTC definiálatlan állapotban maradhat.

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.

Cím
Típus
Felhasználás
00h
Írható, olvasható
valós idő - másodperc
01h
Írható, olvasható
időzítés - másodperc
02h
Írható, olvasható
valós idő - percek
03h
Írható, olvasható
időzítés - perc
04h
Írható, olvasható
valós idő - óra
05h
Írható, olvasható
időzítés - óra
06h
Írható, olvasható
dátum - a hét napja (1-vasárnap,2-hétfő, ...)
07h
Írható, olvasható
dátum - nap
08h
Írható, olvasható
dátum - hónap
09h
Írható, olvasható
dátum - év-1900
0Ah
Írható, olvasható
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
       
0000
nincs
       
0011
122 ms (minimum)
       
0110
976.562 ms
       
1111
500 ms
0Bh
Írható, olvasható
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
0Ch
Csak olvasható
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
0Dh
Csak olvasható
Státus-regiszter D
    7 : 1 - elem/akku rendben, 0 - lemerült vagy hiányzik
    6-0 : fenntartva (0)
 
Az A státusz-regiszter a frissítési frekvencia valamint az esetleges periódikus megszakítás ütemének meghatározására alkalmas. Az adatok frissítésének ideje alatt a regiszter legfelső bitje 1. A pontos idő és dátum kiolvasása előtt ezért érdemes egy, a bit 0-ra állapotára várakozó ciklust beiktatni, mert az időadatok frissítése alatt a tároló-regiszterek értéke definiálatlan (általában 255).

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.)
 

- STING -
eMail:PC-XUser@FREEMAIL.C3.HU, Subject: "Rendszerprogramozás"
STING2@FREEMAIL.C3.HU