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: 

  1. 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.
  2. 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õ. 
  3. 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.

  4. 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û.
 
 
 


Különbözõ billentyûzet csatlakozók: 
 
 
Male 

Dugó (Plug)
Female 

Aljzat (Socket)
5-pin DIN (AT/XT): 
1 - Clock 
2 - Data 
3 - Nincs bekötve vagy Reset *
      (Not Implemented) 
4 - GND 
5 - +5V **
 
Male 

Dugó (Plug)
Female 

Aljzat (Socket)
6-pin Mini-DIN (PS/2):
1 - Data [fekete
2 - Nincs bekötve 
3 - GND [piros
4 - +5V [narancs] **
     (max. 250mA)
5 - Clock [sárga]
6 - Nincs bekötve
[kapcsos zárójelben a leggyakrabban elõforduló kábelszínek vannak, de vigyázat gyártják más színekkel is]
* Reset csak a régebbi típusú billentyûzetekben van bekötve, ma már nem használják
** max. 250..300 mA
 
6-pin SDL:
A - Not Implemented 
B - Data 
C - GND 
D - Clock 
E - +5v 
F - Not Implemented

 
 
 
 
PS/2 Csatlakozó (Male)

 
 

Széljegyzet.
Létezik egy harmadik féle csatlakozó típus is a billentyûzethez. A legtöbb billentyûzetet egybeépítik a kábellel (a kábel egyik fele fixen a billentyûzethez rögzítik). Vannak olyan típusok, ahol a kábel nem szerves része a billentyûzetnek, attól különválasztható. Ekkor a kábel egyik felén DIN csatlakozó van (a PC felé), a másikon SDL (Sheilded Data Link) csatlakozó (a billentyûzet felé). Az SDL csatlakozót az "AMP." cég találta ki. További info az AMP weblapján található http://www.connect.amp.com/. Én még AT vagy  PS/2  billentyûzeten nem láttam ezt a csatlakozót, de régebbi XT billentyûzeten elõfordulhat.(Figyelem! A rajz alapján
ne keverjük össze az USB csatlakozóval. Az USB csatlakozó fizikailag teljesen máshogy néz ki.). 


 

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
PS2 System Receiving Data


 
  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
PS2 System Sending Data


 
  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.
 

2001.10.26.  by VFX