Az AT billentyûzet (AT Keyboard)
Az alábbi információk jórészt az
Internetrõl származnak. Az oldal még nem kiforrott,
egy kicsit még zavaros. Kérlek, ha van építõ
jellegû észrevételed ne fojtsd magadba írd
meg.
Az XT és AT billentyûzetek nem kompatibilisek
egymással. Manapság az XT szinte kihalt. A PC-ket 1983-ban
kezdték elõször AT billentyûzettel eladni. Azóta
ezt a típust használjuk, ezért itt csak az AT és
PS/2 billentyûzetrõl szólunk. Az AT és
a PS/2 billentyûzet mûködés szempontjából
teljesen azonos, kivéve a csatlakózóikat.
Az AT billentyûzet 5-pólusú
DIN csatlakozót, míg a PS/2 billentyûzet 6-pólusú
mini-DIN csatlakozót használ.
Az alapok
A billentyûzet fizikai kialakítása és a beépített
processzor is sokféle lehet, de a fõ mûködési
elvek azonosak Egy átlagos számítógép
billentyûzet tartalmaz egy processzort és a hozzákapcsolt
nyomógomb-mátrixot. A nyomógomb-mátrixot sorokba
és oszlopokba szervezik (nevezhetjük X és Y vonalaknak,
de az angol ROW és COLUM elterjedtebb megnevezés). A billentyûzet
processzora aktív meghajtással alacsony szintre (low) húzza
egymás után az összes sort (row), de egyszerre mindig
csak egyet. Az így "kiválasztott" sorban levõ gombok
állapotát a mátrix oszlopairól (col)
olvassa be. A bemeneteket külsõ ellenállásokkal
vagy a processzorban lévõ belsõ felhúzó
ellenállásokkal magas állapotban tartják. Ha
egy gombot megnyomunk és a sor alacsony (kijelölt) állapotban
van, akkor a mátrix kimenete is alacsony lesz abban az oszlopban,
ahol a gombot megnyomtuk (minden más esetben magas, a felhúzó
ellenállás miatt). Így minden megnyomott gomb azonosítható...majdnem.
Ha egyszerre több gombot is megnyomunk elõfordulhat olyan állapot,
amikor hamis eredményt olvas be a processzor (olyan gombot is lenyomottnak
mond amit nem is nyomtunk meg). Ezt a hibát egy diódával
oldhatjuk meg. A diódát minden gombhoz el kell helyezni.
Így minden gomb valóban egyértelmûen azonosítható
lesz. Az ismétlések elkerülése végett
bõvebb magyarázat itt (keyboard.pdf
[34kb] angol). A kevesebb költség miatt egyre többször
kispórolják a diódákat (fõleg a fólia-nyomógombos
változatokban :) ). Ekkor a hibás billentyûkombinácó
lenyomását úgy próbálják elkerülni,
hogy az egy sorban (oszlopban) levõ gombokat fizikailag egymástól
távolabb és össze-vissza helyezik el. Így csökken
a hibás beolvasás valószínûsége,
de nem szûnik meg. Ha egyértelmû gombazonosításra
van szükség be kell építeni a diódát,
vagy nem szabad mátrixba szervezni a gombokat.
Nyomógombok, kontaktusok
A gyakorlatban bármit felhasználhatunk nyomógombként,
ami jelezni tudja, hogy megnyomták. A gyakorlati megvalósításokat
gazdasági szempontok határozzák meg. Néhány
példa a gombokra, kapcsolókra:
-
Mechanikus kapcsolók. Ezek az ún. "kattogós"
billentyûzetek. Itt mechanikusan érintkezik két vezetõ,
klasszikus kapcsolók. Kapcsoláskor jellegzetes hangot adnak,
így a gombnyomás fülre is érzékelhetõ,
illetve lenyomáskor jelentõs ellenállást tanúsítanak,
így a billentyû megnyomása jobban tudatosul a felhasználóban.
A jobb gombokba beépített kapcsolók élettartama
1..2 millió lenyomás. Ma már "csendes" változatuk
is létezik. Ezekben gyengébbek a rugók és finomabb
a mechanikájuk.
-
Vezetõ gumi és fémezett fóliák.
Ezeket a típusokat hosszú évek óta tökéletesítik.
Kezdetben elég sok baj volt velük. A kattogós billentyûzetekhez
képest túl csendesek, nem lehet tudni, hogy megnyomtuk-e
a gombot vagy sem, mert túl kevés ellenállást
tanúsít. Túl könnyen lehet a gombokat megnyomni.
A fólia idõ után átszakad, elkoszolódik
stb. Ma már vannak rendes gombokkal ellátott fólia
billentyûzetek is, ahol a billentyûk alatt van a gumi vagy
fólia érintkezõ.
-
Kapacitív kapcsolók. Ezek a jóminõségû
billentyûzetek népszerûek voltak a korai PC-s idõkben,
bár elég költséges az elõállításuk.
Az eredeti IBM PC, PC/XT és PC/AT számítógépek
használták ezt a típusú billentyûzetet.
A kapcsolómátrix igen kicsi kapacitásokból
áll. A gombot lenyomva a gomb alján lévõ lemez
közelít a gomb alatt, a panelon elhelyezett két kapacitív
lemezkéhez, kapacitáshoz. Az így létrejött
kapacitás változást érzékeli a beépített
vezérlõ. A kapcsoló elemek között nincs
mechanikai kontaktus.
Hall-érzékelõs gombok. Ezeknél
a gomboknál sincs közvetlen mechanikai kontaktus. A gomb lenyomásakor
a gomb mozgó részébe épített kis mágnes
elhalad a gomb házába épített hall-érzékelõ
elõtt. A mágneses tér változásra a gomb
alacsony szintet ad ki. Ezeknek a gomboknak van egy engedélyezõ
lába, amit a mátrix sorkijelölõ (row) vezetékére
kötnek.
Csatlakozók:
A billentyûzetet kétféle csatlakozóval szerelhetik.
Az egyik típus az 5 pólusú DIN, a másik
a 6 pólusú mini-DIN. Mindkét csatlakozó elektromos
szempontból azonos, egyedül a fizikai kialakításban
különböznek. Ez azt jelenti, hogy mindkét csatlakozó
egy közdarabbal átalakítható a másik típusú
csatlakozó fogadására. Az átalakító
megvásárolható a boltokban vagy elkészíthetõ
házilag is a megfelelõ lábak összekötésével.
A 6 pólusú mini-DIN csatlakozóval szerelt billentyûzeteket
gyakran PS/2 billentyûzetnek, míg az 5 pólusú
DIN csatlakozóval szerelteket AT vagy XT billentyûzetnek nevezik.
Az XT billentyûzet idejét múlta, már évek
óta nem gyártják. Az XT billentyûzet a legtöbb
mai gépen nem is mûködik, nem támogatja a BIOS
sem. A régebbi billentyûzetek alján vagy oldalán
volt egy kapcsoló amivel átválthatott a felhasználó
az AT és XT üzemmódok között. A modern
billentyûzetek kivétel nélkül csak PS/2 (6-miniDIN)
vagy USB csatlakozóval készülnek (ez a leíras
az USB eszközökrõl nem szól. Az USB eszközök
önálló családot alkotnak).
A DIN a Deutsches Institut fuer Norm (German Standardization
Organization) rövidítése, weblap: http://www.din.de/
(német
nyelvû).
Figyelem! A PS/2 billentyûzet csatlakozó formára
azonos a PS/2 egér csatlakozóval. Az új PC99
szabvány szerint a PS/2 billentyûzet csatlakozó lila
színû, míg az egéré zöld
színû.
Processzorok
Az elsõ PC billentyûzetekben a 8048 mikrovezérlõt
alkalmazták 8 kimenettel (row) és 11 vagy 12 bemenettel (col).
Így összesen 8*11, max. 88 billentyû kezelését
tette lehetõvé. A régi XT/PC billentyûzet 84
gombos volt. A mai 101/102 vagy még több gombos (multimédiás)
billentyûzetekhez ez kevés. A régebbi 101/102 gombos
billentyûzetekbe a 8049 vezérlõt építették
be, 10x11 matrixxal. A multimédiás billentyûzetekhez
még nagyobb mátrix szükséges. Néhány
példa a célprocesszorokra:
Holtek: HT82K28A
(328kb), HT82K628A, HT82K68A, HT82K68E
EMC: EM83050, EM83050H, EM83052H,
EM83053H,
Intel: 8048, 8049
Motorola: 6868, 68HC11, 6805
Zilog: Z8602
(379kb), Z8614, Z8615, Z86C15, Z86E23
A billentyûzetbe beépített processzor feladata figyelni
melyik gombot, gombokat nyomta meg vagy engedte el a felhasználó,
ellátja a gombok prellegésmentesítését.
A megnyomott, felengedett gomb adatait elküldi a gazdagépnek
(PC), ha szükséges egy 16 byte-os átmeneti tarolóban
eltárolja az adatokat, míg a PC fogadni képes azokat.
Némely billentyûzetbe kis hangszórót is építettek,
így a gombnyomásokat a billentyûzet is visszajelezheti
egy halk pittyenéssel. Az alaplapok tartalmaznak egy billentyûzet
vezérlõt (keyboard controller), ami dekódolja
a billentyûzettõl vett adatokat, majd átadja a PC-n
futó programnak, amit az tetszés szerint felhasználhat.
Minden komunikácó a billentyûzet és a PC
(host) között az IBM által létrehozott protokoll
szerint zajlik. A legpontosabb információt a "IBM's technical
reference manual" adja. A legtöbb gyártó szinte egy
az egyben átvette (pl. Compac's Technical Reference), sõt
van aki direkt lemásolta az IBM felhasználói kézikönyvét.
Nyomtatott vagy elektronikus formában már évek óta
nem jelent meg hivatalos verziója az IBM-tõl.
Interface és Protokol::
A billentyûzet ugyanazt a protokollt használja, mint a
PS/2 egér. Az itt leírtak az PS/2 egérre is alkalmazhatóak
(még nem teszteltem, de többen állítják:).
Eszköz alatt a késõbbiekben a billentyûzet és/vagy
a PS/2 egér értendõ.
Az eszköz és a PC (host) közötti komunkáció
két vezetéken zajlik, szinkron soros komunkáció.
Ez azt jelenti, hogy az adatbitek (data) egymás után az órajelhez
(clock) szinkronizálva érkeznek. Az órajel (clock)
és adat (data) vezeték kétirányú, nyitott-kollektoros
vonalak, tipikusan ~4.7k felhúzóellenállással.
A vezetékek alapállapota (a felhúzóellenállás
miatt, H) magas, de mindkét fél könnyen lehúzhatja
alacsony (L) szintre. Így mindkét fél használhatja
a két vezetéket, egymás kimeneteit nem tudják
tönkretenni.
Példák a nyitott-kollektoros (Open-collector)
Data
és Clock vonalakra
|
|
2 bemenet és 2 kimenet felhasználásával.
Data és Clock vonalak állapotát
beolvashatjuk a mikrokontroller A és B lábain.
Alapban mindkét vonal magas a felhúzóellenállások
miatt. A C és D vonalakra adott logikai 1 szinttel
alacsonyra húzhatjuk a Data/Clock vonalat. |
2 kétirányú
port felhasználásával
Data és Clock vonalak állapotát
beolvashatjuk és megváltoztathatjuk a mikrokontroller PA6
és PA7 lábain. |
Az adatátvitel, az átvitel irányát nézve
két féle lehet:
-
Eszköz küld adatokat a Gazdagép felé (PC, mikrokontroller
stb.)
-
Gazdagép küld parancsokat és adatokat az eszköz
felé
A hostnak mindig elsõbbsége van az átvitel során.
A host (bizonyos feltételek mellett) megszakíthatja a billentyûzet
adását az órajel legalább 100us ideig tartó
alacsonyra húzásával, vagy folyamatos alacsony szinttel
megállíthatja . A billentyûzet viszont nem szakíthatja
meg a host adást. Nem ajánlott, de elviekben bármikor
küldhetünk parancsot a billentyûzetnek, de jobb betartani
az IBM ajánlását. Az átvitel irányától
függetlenül az órajelet mindig az eszköz szolgáltatja.
Az órajel max. frekvenciája 33kHz. A legtöbb eszköz
10-20kHz körül mûködik. Saját eszköz építésekor
ajánlott az órajel frekvenciáját kb. 15kHz
körül tartani. A késõbbi példákban
az órajel periódus ideje kb. 80us (40us H és 40us
L). Az adatátvitel mindig frame-ekben (vagy inkább adatblokkokban)
történik. A felépítése:
A frame, eszköz -> host átvitelnél
11, host->eszköz átvitelnél 12 bit hosszú (ekkor
egy 12., nyugta bit is szerepel az adás végén). Ez
a 11 (12) bit az adatvezetéken lép ki, az órajel megfelelõ
állapotánál. A táblázat a bitek jelentését
mutatja. Az átvitel a Start bittel kezdõdik, ami mindig 0
értékû. Utána jön a 8 adatbit (D0-D7),
majd a paritás bit (páratlan paritás). A komunkációt
a Stop bit fejezi be. A paritás 1 vagy 0 lesz, úgy
hogy a 8 adatbit és a paritás bitben lévõ egyesek
száma páratlan legyen. Paritásbit ='1', ha az adatbitekben
az '1' bitek száma páros, és '0', ha páratlan
számú '1'-es van az adatbitekben. Ez a hiba ellenõrzéshez
kell. Így ellenõrizhetõ az átvitel hibátlansága.
Ha a host küld adatot az eszköznek,
'acknowledge bit' jelzi a hostnak az adat vételét.
Ha az eszköz küld a hostnak, akkor ez a bit nincs. |
BIT |
FUNCTION |
12 |
1 acknowledge bit (Host-to-device communication only) |
11 |
Stop bit (always 1) |
10 |
Parity Bit (odd parity) |
9 |
Data Bit 7 (most-significant) |
8 |
Data Bit 6 |
7 |
Data Bit 5 |
6 |
Data Bit 4 |
5 |
Data Bit 3 |
4 |
Data Bit 2 |
3 |
Data Bit 1 |
2 |
Data Bit 0 (least-significant) |
1 |
Start Bit (always 0) |
|
Adat küldés az eszköztõl a host felé
(billenytûzet/egér -> PC)
Az eszköztõl a host felé irányuló
adatátvitelnél a frame 11 bit hosszú. Az elsõ
bit a start bit (mindog 0), majd a 8 adatbit (legkisebb helyiértékkel
indul, LSB ), majd a páratlan paritás bit és egy stop
bit (mindig 1). A host az órajel lefutó élénél
olvassa be az adatvonalrol a bitet. Az órajelet, mindig az eszköz
generálja.
-
Adatküldés elõtt az eszköz elõször
megvizsgálja, hogy a Clock vonal magas-e Ha a Clock
vonal alacsony állapotban van, akkor a host tiltja a komunikációt.
Adatátvitel nem lehetséges így az adat az eszköz
belsõ pufferébe kerül. Ha a Clock magas az átvitel
elkezdõdhet.
-
Ezután az eszköz megvizsgálja a Data vonal állapotát.
Ha alacsony, akkor a host akar adatot küldeni. Ekkor az eszköz
félbeszakítja a küldést és fogadja az
adatot/parancsot a hosttól.
-
Ha a Clock és Data vonal is magas (high, idle) állapotú,
akkor lehetséges az átvitel megkezdése. Az átvitel
ideje alatt az eszköz ellenörzi a clock állapotát
kb.100us-onként (a Clock magas állapotánál).
Ha a host alacsonyra húzta, az eszköz félbeszakítja
az adást. A host az elsõ 10 bit kiküldése közben
bármikor megszakíthatja az adást. A 11. bit kiküldéskor
azonban kötelezõen fogadnia kell az adatot a z eszköztõl.
A fenti ábra 1 byte átvitelét mutatja (az eszköz
küldi a hostnak). Az eszköz az adat vonalat nem feltétlen
az órajel felfutó élénél vátoztatja,
mint ahogy a fenti ábra mutaja. A lényeg, hogy az órjel
lefutó élnél az adatvonal stabil és érvényes
legyen. A fenti ábra erõsen elméleti jellegû.
A következõ ábra az egyik billentyûzetbe építhetõ
mikrokontroller adatlapjából való:
A külsõ eszköz
adatküldésének idõzítése
|
TIMING
PARAMETER |
Min/Max |
T1 |
Time from DATA transition
to falling edge of CLK |
5/25 us |
T2 |
Time from rising edge
of CLK to DATA transition |
5/T4 - 5 us |
T3 |
Duration of CLK inactive |
30/50 us |
T4 |
Duration of CLK active |
30/50 us |
T5 |
Time to auxiliary device
inhibit after clock 11 to ensure the auxiliary device does not start another
transmission |
>0/50 us |
A órajel felfutó élétõl az adatvonal
megváltoztatásáig legalább 5us teljen el, és
az adat legyen stabil az órajel lefutó éle elõtt
legalaább 5us-mal (de 25us ne haladja meg). A 11bit stabil átviteléhez
a fenti idõzítéseket tartsuk be. A stop bit elküldése
után, az ujjabb adat elküldése elõtt várakozni
kell legalább 50us ideig. Igy lesz a hostnak leég ideje az
átvitelt tiltani, mig feldolgozza a beérkezett adatot (általában
a host automatikusan megteszi ezt minden vett adat utan). Valamint legalébb
50us ideig várakozni kell a tiltaás feloldása után
is.
Nagyon jól használható a következõ
eljárás 1 byte átvitelére a host felé.
A tömörség kedvéért angol nyelven Adam's
micro-Resources Home jóvoltából:
1) Wait for Clock = high.
2) Delay 50 microseconds.
3) Clock still = high?
No--goto step 1
4) Data = high?
No--Abort (and read byte
from host)
5) Delay 20 microseconds (=40 microseconds to the time Clock
is pulled low in sending the start bit.)
6) Output Start bit (0) \ After
sending each of these bits, test
7) Output 8 data bits > Clock
to make sure host hasn't pulled it
8) Output Parity bit
/ low (which would abort this transmission.)
9) Output Stop bit (1)
10) Delay 30 microseconds (=50 microseconds from the time Clock
is released in sending the stop bit)
The process for sending a single bit should then be as follows:
1) Set/Reset Data
2) Delay 20 microseconds
3) Bring Clock low
4) Delay 40 microseconds
5) Release Clock
6) Delay 20 microseconds
Adat és parancs fogadása a hosttól
( PC -> billenytûzet/egér)
Ez egy kicsit eltér az elõzõleg leírtaktól.
Ha a host adatot akar küldeni, elõsször a Clock
vonal alacsonyra állításával (min. 60us, tipikusan
100us ideig, ez több mint egy bit ideje így biztos felismeri
az eszköz) félbeszakítja az esetleg folyamatban lévõ
komunikációt. Ezután a Data vonal alacsonyra
húzásával kell jeleznie az adatküldés
szándékát, de ezzel egyidejûleg a Clock vonalat
elengedi. A Data vonal alacsonyra állítása után,
az eszköz felismeri, hogy a host adatot akar küldeni és
elkezdi az órajelet kiadni (ez a felismerés nem tarthat tovább,
mint 10ms). Az órajel elsõ lefutó éle után
a host elkezdi az adat kiküldését. A host az adás
ideje alatt az adat vonalat csak a Clock alacsony állapotánál
változtathatja meg,
az eszköz pedig a felfutó élénél eltárolja
el a beolvasott 8 adatbitet és a paritás bitet.
Odd parity = NOT(XOR(bits[0..7]))
Miután a host a paritásbitet elküldte, a Data vonalat
magasba (Idle) állitja (ez a stop bit funkcióját látja
el).A 12 órajel váltásnál az eszkõz
nyugtázza a vételt az adatvonal alacsonyra allításával.
Ha a 10. bit (start+8adat+paritás) után az adatvonal nem
magas (Idle) állapotú az eszköz tovább folytatja
az órajelek kiadását mig az adatvonal magas nem lesz,
(majd generál egy hibakódot).
A host félbeszakíthatja a komunikációt
bármikor, az elsõ 10 bit kiküldése közben
a Clock legalább 100us ideig tartó alacsonyra húzásával.
A külsõ eszköz
adat vételének idõzítése
|
TIMING
PARAMETER |
Min/Max |
T7 |
Duration of CLK inactive |
30/50 us |
T8 |
Duration of CLK active |
30/50 us |
T9 |
Time from inactive to
active CLK transition, used to time when the auxiliary device samples DATA |
30/50 us |
T4 |
Duration of CLK inactive |
30/50 us |
T5 |
Time to auxiliary device
inhibit after clock 11 to ensure the auxiliary device does not start another
transmission |
>0/50 us |
És a fent említett eljárás tömören:
1) Bring the Clock line low for at least
100 microseconds.
2) Bring the Data line low.
3) Release the Clock line.
4) Wait for the device to bring the Clock line low.
5) Set/reset the Data line to send the first data
bit
6) Wait for the device to bring Clock high.
7) Wait for the device to bring Clock low.
8) Repeat steps 5-7 for the other seven data bits and the
parity bit
9) Release the Data line.
10) Wait for the device to bring Data low.
11) Wait for the device to bring Clock low.
12) Wait for the device to release Data and Clock
Kicsit bõvebben:
-
In your main program, check for Data=low at least every 10 milliseconds.
-
If Data has been brought low by the host, read one byte from the
host
1) Wait for Clock=high
2) Is Data still low?
No--An error occurred; Abort.
3) Read 8 data bits \ After
reading each of these bits, test
4) Read parity bit
> Clock to make sure host hasn't pulled it
5) Read stop bit
/ low (which would abort this transmission.)
6) Data still equals 0?
Yes--Keep clocking until Data=1
then generate an error
7) Output Acknowledge bit
8) Check Parity bit.
Generate an error if parity bit
is incorrect
9) Delay 45 microseconds (to give host time to inhibit next transmission.)
-
Read each bit (8 data bits, parity bit, and stop bit) as follows:
1) Delay 20 microseconds
2) Bring Clock low
3) Delay 40 microseconds
4) Release Clock
5) Delay 20 microsecond
6) Read Data line
-
Send the acknowledge bit as follows:
1) Delay 15 microseconds
2) Bring Data low
3) Delay 5 microseconds
4) Bring Clock low
5) Delay 40 microseconds
6) Release Clock
7) Delay 5 microseconds
8) Release Data
From: adler@netcom.com (Bruce Adler)
Subject: Re: XT vs. AT keyboard
The XT and AT keyboards are NOT compatible. The
only way a XT keyboard
will work on an AT computer is if you've got a motherboard
and BIOS
which are specifically designed to support both keyboard
types.
The keyboards differ in at least the following ways:
1. The XT kb. generates
2 start bits, 8 data bits, make/break
bit, and a stop bit. The
AT kb. is 1 start bit, 8 data, 1 parity,
and a stop bit.
2. The XT uses a make/break
bit to indicate key up/down. The
AT sends one byte for
keydown and two bytes for keyup.
2. The XT keyboard scan
codes have different values than
then AT keyboard make/break
codes (for corresponding key
locations).
4. The XT keyboard doesn't
accept any of the command strings
accepted by the AT keyboard.
5. The XT keyboard is reset
by fiddling the clock and data
lines; the AT keyboard
accepts a reset command string.
In the same manner plugging an AT keyboard into an XT
computer won't
work either, unless you have one of those clone keyboards
which allow
you to select XT compatible mode.
|