sobota 22. července 1995

Postavme si PC XT/AT Keyboard Interface

autor: Adrián Banász

Na úvod
Celé zapojenie vzniklo ako vzbura voči nekresťanskej cene novej klávesnice pre DIDAKTIK M (asi 700.- SK) a dôkaz, že sa klavesnice PC k DIDAKTIK-om pripojiť dajú (tuším väčšina z nás už asi vieru strácala). Tak ako veľa vecí na svete, nie je dokonalé, je to len jedna z veľa možností, ako tento problém riešiť. Niektoré odmedzenia popíšeme v texte, ostatné iste objavíte sami, celkovo si však myslím, že ich výhody prevyšujú.
Na úvod si treba uvedomiť, že kto nič nerobí, nemôže nič pokaziť. A keďže sa jedná o zásah do hardwaru vášho miláčika, každý nech sa nad tým zamyslí, prehodnotí svoje schopnosti.
Tuším som niekoho odradil, ale my ostatní pokračujme ďalej. Stručne si spomeňme zopár podstatných vecí (kto chce môže ich preskočiť).

Klávesnica Didaktik
K základnej doske počítača je pripojená viacžilovým lepeným káblom. Tento nepriamo predlžuje určité signály systémovej zbernice, takže by nemal byť príliž dlhý.
Stlačením klávesy sa privádza logická nula na zákaznícky obvod, jeden zo vstupov KEY1 až KEY5, podľa aktuálnej adresy danej signálmi A8-A15 a stlačenej klávesy. Operačný systém (OS) počítača vyhodnotí kód klávesy. Tento princíp si treba uvedomiť, budeme ho ďalej potrebovať. Klávesnica je kontaktná, časom sa komponenty tlačítok unavia, treba ich vymeniť.

Klávesnica PC XT/AT
K základnej doske je pripojená iba dvoma vodičmi (okrem napájania).
Stlačením klávesy sa aktivuje vysielač sériovej linky. Kód interne dekódovanej klávesy sa po jednotlivých bitoch posiela na údajový vodič (DATA). Platnosť každého bitu je potvrdzovaná zostupnou hranou hodinových impulzov (CLK). V počítači pracuje prijímač, skladajúci jednotlivé bity v rytme CLK do jedného bajtu. Tým sa získa kód klávesy, ktorý si preberie OS.
Je to typ tzv. bezkontaktnej klávesnice. Signály ss získavajú obvodmi mapujúcimi magnetické pole na základe Halovho javu.
Nie menej dôležitejšia ako princíp je skutočnosť, že jej životnosť je podstatne dlhšia.
To by bolo o klávesniciach. Teraz sa zhlboka nadýchnime a môžeme začať popisovať interface (ďalej len IF).

Celkový popis IF
Začnem tým, čo musí vedieť. Má rozpoznať kód stlačenej klávesy, prichádzajúci po jednotlivých bitoch signálom DATA, dekódovať ho a pretransformovať na kód zrozumiteľný pre OS nášho miláčika.
Aha, aké je to jednoduché! Celá úloha sa dá popísať jednou vetou. Ale ako je to s realizáciou? No veď uvidíme...
Jedným očkom sledujme schému zapojenia, druhým text, ale hlavne sa snažme všetkými hlavami premýšlať o jeho obsahu.
Rozdelme si zapojenie IF na niekoľko fiktívnych funkčných blokov, spĺňajúcich dielčie požadované úlohy (v zátvorkách sú označenia súčiastok).
-sériovo-paralelný prevodník (U4,10A) - "pozbiera" jednotlivé bity z DATA a vytvorí 8 bitový údaj, podklad pre adresu kódu klávesy
-adresný dekodér (U1,2,3,5) - vytvára adresu, na ktorej sa nachádza kód klávesy, zrozumiteľný systému DIDAKTIK-a
-dekodér kláves (U6) - obsahuje tabuľku kódov kláves
-synchronizácia prenosu (U8,9,10C,10D) - synchronizuje prenos sériovej linky s adresným dekodérom a systémom počítača
-stránkovanie pamäte (U7,10) - prepína medzi normálnym a "shiftnutým" významom kláves
Možno to vyzerá trochu zložito, ale to len na prvý pohľad . Keď si popíšeme jednotlivé bloky osve, tak nám to bude ihneď všetko jasné.

Sériovo-paralelný prevodník
Ako som už niekde spomenul, po DATA prichádzajú jednotlivé bity, s CLK sa potvdzuje ich platnosť.
Celý prenos nastane automaticky pomocou obvodu 74..164.Výstup (QA až QH) je nastavený na prenesený byte. Každej klávese prislúcha iný, špecifický.
(pozri dokumentáciu ku klávesnici).
Na obrázku je prenos bytu 88h.

Adresný dekodér
Použije byte z predchádzajúceho stupňa a doplní ho ešte o 3 ďaľšie bity. Na ich hodnotu má vplyv OS počítača, respektíve program testujúci klávesnicu. Hodnota sa pohybuje od 0 do 7 a zodpovedá testom adries jednotlivých skupín kláves A8 až A15 (pozri manuál k počítaču). Podrobnejšie v tabuľke.
Vidieť, že pri dekódovaní sa pohybujeme po 8 adresách. Je to od adresy Basic (=kód klávesy prijatý po sériovej linke vynásobený ôsmymi) +0 pre A8=0, až po Basic+7 pre A15=0. A teraz nastupuje na scénu dekodér kláves.

Dekodér kláves a stránkovanie pamate
Dekodér kláves je vlastne obyčajná 2KB EPROM, ktorá na svojom výstupe (O0-O7) "ukazuje" byte, adresovaný adresným dekodérom.

Ako to celé prebieha?
Stlačím klávesu, jej kód sa mi sériovou linkou presunie do sériovo-paralelného dekodéra.
Ten mi z neho spraví hornú časť adresy pre EPROM. Dolná časť sa mi vytvorí podľa toho, akú časť klávesnice testuje operačný systém a na výstupe EPROM dostaneme údaj. Ůdaj, ktorý je osembitový, Spectru však stačí 5 bitov, aby rozpoznal svoje klávesy (KEY1-KEY5 na zákazníckom obvode). Áno, dobre ste si všimli slovo rozpoznal! O to práve ide! Na danej adrese musí byť byte, simulujúci stav, aký by nastal pri stlačení pôvodnej klávesy na pôvodnej klávesnici. A toto je podstata celej záhady.
Teraz sa pokúsme konkretizovať. Vysvetlime si princíp tvorby obsahu pamätových miest pre jednotlivé klávesy v dekodéry kláves.
Najprv asi treba spomenúť, že na kódovanie kláves v XT klávesniciach je využitých prvých 7 bitov. Ôsmy je využitý ako signál uvoľnenia klávesy. Takže, ak stlačíme klávesu, generuje sa nám 8 bitový kód, s určitou frekvenciou opakovania, pričom 8. bit je nulový. V okamihu pustenia klávesy sa ešte raz vygeneruje ten istý kód, avšak 8. bit bude nastavený na 1, ako príznak uvoľnenia klávesy.
Začnime tým, že sme prijali kod klávesy : ESC 01h = 0000 0001
0 1
Prvými 7 bitni určíme adresu Basic
Čo sa týka bitov dopĺňaných s OS. Sú závislé od skupiny kláves, ktorá sa práve v danom okamihu testuje. Ak sa bude testovať skupina daná s A8=0 bude adresa Basic+0, A9=0 Basic+1 atď až po A15=0 Basic+7 (ale to som už niekde počul, alebo napísal?).
Adresa Basic+0 pre ESC je teda 8 .
(Kto nevie prečo, nech si sčíta nasledujúcu rovnicu: 0x20+0x21+0x22+1x23+0x24+0x25+0x26+0x27+1x28+0x29=8 Súhlasí ? Ak áno, tak ste lenivý alebo príliž dôverčivý, čo sa nemusí vždy vyplatiť ! Ale pokračujme.)
Klávese ESC chceme priradiť význam GRAPH.
Systém DIDAKTIK-a pozná GRAPH ako súčasné stlačenie kláves Caps Shift a 9. Stlačenie Caps Shift-u sa testuje v skupine A8 KEY1. Ak je tento bit nulový OS tuší jeho stlačenie.
Testuje ďalej a v skupine A12 narazí na KEY2=0. To znamená, že je stlačená aj klávesa 9. Ak už nenarazí ani na jeden nulový bit (testujú sa všetky skupiny A8-A15 v jednom "ohmate" klávesnice) celý test vyhodnotí ako stlačenie Caps Shift+9 t.j. GRAPH.
Náš nový príkaz GRAPH bude na adrese: od 8 do 15

Dôležité byty
Dôležitými bytmi nazvyme byty, charakterizujúce stlačenie kláves, v našom prípade sú to tie na adresách 8 a 12. Pozrime sa na ne zblízka:
Byte 255 znamená, že nebola sltačená klávesa v skupine. Číslo 238 znamená, že bola stlačená v poradí 5 klávesa skupiny. 254 prvá, 252 prvá aj druhá, 253 druhá klávesa skupiny atď.
Samozrejme môžeme kombinovať klávesy jednotlivých skupín. Stačí len zadať 0 na správne miesto (keby sme mali v EPROM samé nuly, bol by to signál, že sme naraz stlačili celú lávesnicu, čo sa normálnemu smrteľníkovi, ak nepočítam "games-man-ov", tí sú schopní všetkého, podarí len ak si postaví CONSUL KEYBOARD IF ... ).
V kľudovom stave, t.j. bez dotyku klávesnice, sa adresný dekodér pohybuje po adresách 0-7 (1024-1031 v shiftovacej stránke), kde by mali byť samé 255. Ostatné pamäťové miesta sa programujú postupne pre jednotlivé klávesy výpočtom adries Basic a umiestnením dôležitých bytov.
OS DIDAKTIK-a pre svoju prácu využíva aj pomocné klávesy.V našom prípade sú to Symbol Shift (S.S.) a Caps Shift (C.S.). Ako všetci vieme súčasným stlačením jednej z pomocných kláves s jednou zo základných sa dosiahne nový význam základnej klávesy. Tak napríklad stlačením klávesy "A" dostaneme príkaz NEW, C.S.+"A" veľké "A", S.S.+"A" príkaz STOP a podobne (je to trocha zložitejšie, ale pre názornosť to stačí). Takto sa správa pôvodná klávesnica. Na type Consul je však použitý systém na ochranu pred stlačením viacerých kláves. Čo s tým? Ako si poradíme ? No predsa budeme používať len základné význami kláves...
Na tých, čo omdleli chvíľku počkáme, ostatným, so silnejšími nervami môžem prezradiť už teraz, že to bol len pokus o žart. Ale dosť bolo vtipkovania, lebo situácia je v tomto ohľade dosť vážna.
No dúfam, že sme už všetci, tak pokračujme. Popisovaný IF má inplementované len kódy kláves získané stlačením základných kláves, riadiace kódy prístupné s C.S.+(0,1,2,3,4,5,6,7,8,9,SPACE,S.S.) a kódy prístupné stlačením S.S.+základná klávesa. Nedá sa preto priamo písať veľké písmeno, súčasným stlačením C.S.+písmeno, ale len v Caps Look-u. Toto je jedno z obmedzení, ktoré sa v rámci čo najjednoduhšej koncepcie musí tolerovať (ale kto má chuť..).

Ako programovať kódy kláves.
Základné klávesy sú O.K. Pri programovaní EPROM umiestňujeme dôležité byty na adresy Basic+.. podľa skupiny, v ktorej sa klávesa nachádza a ich hodnota je daná poradím klávesy v skupine. Ostatné byty sú 255.
Riadice kódy C.S.+(0,...,9,SPACE,S.S.) sú jednoklávesové. Pre programovanie kódov čísel použijeme postup ako pre základné, plus nastavíme signál C.S. (nulová hodnota 1. bitu na Begin+0 príslušnej klávesy, pozri príklad s GRAPH), pre BREAK a EXTEND obdobne.
Kódy S.S.+základná klávesa sú v shiftovacej stránke. Dostaneme sa k ním postupným stlačením S.S. a príslušnej základnej klávesy.

Najprv sa dostaňme do shiftovacej stránky!
K tomu si potrebujeme nadefinovať klávesu, ktorú budeme ako S.S. používať. Zvoľme si S.S. kód 2Ah. Podľa už známych pravidiel si určíme adresu v EPROM Basic+0=336. Na túto umiestnime stránkovací bit. Je to 6. bit bytu na tejto adrese (ostatných sedem Basic adries má hodnotu 255). Ak je tento nulový, dôjde k prestránkovaniu do shiftovacej stránky, kde sa k bytom prislúchajúcim základným klávesám, doplní signál stlačenia klávesy S.S. (bude nulový 2. bit na adrese Basic+7 každej klávesy). Nakoniec ešte pridáme stránkovací bit na Basic+7 každej klávesy, ktorý nás dostane späť do normálnej stránky.

Ešte raz pre zopakovanie
Stránka so základným kódom kláves začína adresou 0 (byty na 0-7 sú 255) a končí 1023. Shiftovacia stránka začína 1024 (1024-1031 sú 255) a končí 2047. Obsahy oboch sú v podstate totožné, s tým rozdielom, že v shiftovacej stránke je ku kódom kláves pridaný ešte signál S.S. a aktívny stránkovací bit. Okrem toho je v shiftovacej stránke mrtvý kód klávesy zvolenej pre stránkovanie (na Basic+0 až Basic+7 má 255).

Synchronizácia prenosu
Už sme si popísali ako sa prijme kód klávesy, vytvorí jeho adresa a posunie OS DIDAKTIK-a. Nezostáva už len spomenúť, že celý prenos je synchronizovaný signálom INT počítača. Jeho aktívnou úrovňou sa prepíše kód prijatej klávesy do hornej časti adresného dekodéra. Môžu nastať nasledujúce prípady.
Ak ešte prebieha príjem bitov, kód nie je úplný, nič sa neprepisuje (výstup č.8 U8 je v log. 1), systému sa predá kód "posledného úplného INT-u".
Ak nie je stlačená klávesa, kód je 0, adresný dekodér sa pohybuje na 0-7 (resp. 1024-1031), kde sú byty 255, ktoré OS signalizujú tento stav.
Ak je stlačená klávesa,,jej kód sa predá systému. V okamihu uvoľnenia klávesy sa resetne obvod U4 (vspomeňte si na 8 bit prenášaného kódu) a na jeho výstupe budú 0, t.j. žiadna klávesa.
To by bola v skratke synchronizácia a aj popis IF.
Hop, ešte malý moment. Ak chcete používať aj reset z klávesnice, volíme ho obdobne ako klávesu pre S.S. (najlepšie do shiftovacej stránky, zabránime tak náhodným inicializáciám).
Určíme si Basic pre zvolenú klávesu a na Basic+0 až Basic+7 dáme 7fh. Kondenzátorom "doladíme" jeho dĺžku.

Ako to všetko realizovať v praxi
Všetky signály pre IF sú prístupné cez lepený káblik pre pripojenie pôvodnej klávesnice.
Z neho odpojíme starú klávesnicu a konce priletujeme na konektor CANNON 25 pin. Protikus konektora bude na IF (resp. môže byť aj na starej klávesnici, ak sa rozhodneme opätovne pre ňu, takže úprava je vratná). Káblik fixujeme o stenu púzdra základnej dosky, aby sa nám nevhodnou manipuláciou niektorá žila neodtrhla.
Jediným menším problémom je INT. Ten doporučujem pred pripojením na konektor oddeliť od pôvodneho, pričom treba zachovať jeho aktívnu úroveň (ja som ho oddelil jedným hradlom 74ALS32, ktoré mi "zvyšovalo" po úprave počítača pre prácu pod CP/M).
Ešte by som spomenul kondenzátor v obvode stránkovania. Ten ovplyvňuje správne stránkovanie pri niektorých "shiftovaných" kódoch (napr. #,$).
Schéma nie je zložitá, preto sa dá realizovať na univerzálnej doske plošných spojov.
Keďže CONSUL klávesnice toho dosť spotrebujú, doporučujem celý IF aj klávesnicu napájať z externého zdroja + 5V, s vhodne umiestneným vypínačom. Ten môže pomôcť, ak nastane stav, že vplyvom rušenia v sieti prenikne nejaký inpulz až do IF a "rozladí" čítač 74..90. Vtedy jeho vypnutím a opätovným zapnutím dosiahneme reset čítača (ten sa inicializuje vždy pri zapnutí napájania, jeho správna funkcia je charakteristická logickými 0 na výstupoch QA až QD pri nestlačenej klávese a podmieňuje prácu celého IF).
Obsah EPROM si musí každý naprogramovať podľa použitej klávesnice.

Programová kompatibilita
Nemal som možnosť testovať funkčnosť na všetkých programoch pre DIDAKTIK, pravdu povediac nebola to ani polovica, alebo, že by ani tretina, ani ...
Jedno je však isté, nefunguje stlačenie viacerých kláves (potrebné v niektorých hrách, ale aj systémových programoch, dá sa však nadefinovať ako jednoklávesové) a nefunguje načítanie z portu 254 na testovanie klávesnice (používané napr. v MRS ako úvodný, "rýchly scan").
Ůprava programov je jednoduchá (ak ju dokážeme spraviť). Spočíva vo vynechaní tohto testu (je vždy negatívny, takže nedochádza k ďaľšiemu dekódovaniu) a skoku priamo na dekódovanie klávesy.
Neviem, čo by som dodal na záver. Želať Vám veľa šťastia pri stavbe nemá význam, lebo ho potrebovať nebudete. Hádam len trocha trpezlivosti a kuráže a pri nejakom zapojení niekedy opäť "dopísania".

Schéma zapojení v ORCAD-e: klavesnice.sch
Nascanované schéma zapojení: klavesnice.gif

Žádné komentáře:

Okomentovat