Rozhranní pro klávesnici PS/2
Ondřej Kaller, Martin Jančík, UREL, FEEC, VUT Brno
Obsah:
- Úvod
- Realizace
- Závěr
- Literatura
Cílem tohoto projektu je vytvořit program, který bude zobrazovat znaky z klávesnice s rozhranním PS/2 na LCD displeji, na vývojové desce, která je
používaná pro práci v laboratořích na UREL VUT Brno. V této desce je používán mikrokotrolér ATmega16. V realizaci bylo vyzkoušeno dvou možností
komunikace pro klávresnici. Nakonec je komunikace
realizována pomocí přerušení vyvolané na příslušném pinu pro externí přerušení 0 (pin PD2) jako zdroj hodinových signálů z klávesnice. Dále je
použit další vstupní pin mikrokotroléru pro načítání přijatých dat (pin PD7).V této aplikaci taktéž byli použity další knihovny, které byli vytvořeny.
Jednu knihovna je používána pro zobrazování znaků na LCD displeji a jedna pro funkci delay.
Komunikace mezi PC a AT klávesnicí probíhá standardně pomocí dvou vodičů. Jedná se o sériovou synchronní komunikaci. Další vodiče slouží jednak
pro napájení, jednak jako společná zem. U starých AT klávesnic (DIN 5 konektor) může vodič označený jako N/C sloužit jako reset avšak u dnešních
se toto téměř nevyskytuje. Přesto je vhodné zbylé vodiče na straně mikrokontroléru přizemnit.
Klávesnice se standardně chová jako master, tj. zahajuje komunikaci a vytváří synchronizační hodinový signál o frekvenci 10-20 kHz. Komunikační rámec je
na obrázku. Po startbitu následuje 8 datových bitů, parita a stopbit. Sběrnice i hodinová synchronizace je v neaktivním režimu upnuta na napájecí
napětí pomocí pull-up rezistorů. Z uvedeného popisu se lze domnívat, že pro komunikaci je možné použít jednotku USART v režimu synchronní komunikace
a nastavení jako slave. Toto také bylo odzkoušeno avšak s nepřesvědčivým výsledkem. Příčinou je velice volná definice standartu klávesnic definované
ho v IBM. Jednak jsou to dlouhé hrany hodin, které nejsou jednotkou usart detekovatelné, jednak parita nemusí být určena vždy správně. Výsledkem
pokusů s jednotkou usart byl fakt, že se nepodařilo příjmout zprávu od klávesnice, jednotka uart nikdy nenastavila příznak o doručené zprávě ani
nevyvolala přerušení. Problém by se snad dal řešit komparátorem do hodinového signálu avšak bylo zvoleno jiné řešení.
Běžně výrobci řeší komunikaci s klávesnicí buď specializovaným řadičem nebo mikrokontrolérem zajišťujícím pouze tuto funkci.
Projekt je řešen tak, že se skenují jednotlivé bity na datové sběrnici při přerušení (INT0) od hodin z klávesnice. Po jednoduchém otestování,
že hrana na hodinách nebyla pouze zákmit je hodnota na datovém vstupu(PD2) zapsána do n-tého bitu proměnné data. Po naplnění proměnné osmi
bity hodnot je spuštěna funkce dekódování.
Pro pochopení komuniačního protokolu klávesnice je nutno blíže vysvětlit posloupnost kódů generovaných klávesnicí.
Na obrázku je vidět posloupnost generovaná klávesnicí na mžikový stisk klávesy.
Po přiblížení jednotlivých špiček na druhém obrázku vidíme že se posloupnost skládá ze scan kódu klávesy, dále 200ms pauzy a univerzálního escape
kódu bezprostředně následovanému zase scan kódem klávesy. Pokud je daná klávesa držena déle, opakuje se po 200 milisekundách první scankód
po dobu držení klávesy a po uvolnění se za 200ms od posledního scankódu vysílá escape kód a scan kód klávesy. Tato situace nastává i při
zmáčknutí shift. Při zmáčknutí a držení shift se vyšle scankód shiftu, dále scankód dalšího znaku, jeho escape a scan kód při uvolnění a dále
escape a scan kód shiftu při jeho uvolnění. Tato sekvence je detekována a v takovémto případě je vypsáno velké písmeno.
Funkce dekódování funguje pro běžné znaky jednoduše tak, že v případě, že je detekován scan kód a zároveň před tímto nebyl detekován escape
kód a nejedná se tudíž o jeho druhou část se tento kód najde v prvním sloupci dvojrozměrného pole. Prohledáváním pole se určí index a ve druhém
sloupci na tomto indexu je znak, který je se posléze vypíše na display.
Pro vypisování velkých písmen jsou navíc použity další dva příznaky. Jeden z nich určuje, že klávesa shift je stlačena a druhý, že se po escape
kódu čeká na scan kód shiftu aby mohl být režim psaní velkých písmen ukončen. Celý program je zjednodušeně, ale bez újmy na názornosti popsán
následujícím vývojovým diagramem.
Následující obrázek ukazuje schéma zapojení přípravku pro připojení do vývojové desky ATmega16.
Komunikace klávesnice je vcelku vyřešena, až na vlastnosti jako jsou speciální znaky. Pro speciální znaky jako například F1 aj jsou definovány
konstanty v úvodu zdrojového kódu. Pro zobrazení funkčních kláves jako enter, ecs jsou také zobrazovány zadané znaky. Je zde i vyřešena funkce
shift pro zobrazení velkých znaků. Dále je nutné vyřešit funkce Caps lock, a případné neošetřené speciální znaky, jimiž jsou například Prtn Sc,
Ins, Del, Home .... V rámci řešení toho projektu to nebylo zvládnuté. Částečně to zapříčinila i nemožnost dohledat originální specifikace standartu
PS/2 od firma IBM.
Stáhnutí projektu.
[1] ANDRIES BROUWER – Keyboard scancodes [online] dostupný z WWW:
http://www.win.tue.nl/~aeb/linux/kbd/scancodes.html#toc1[cit. 15.5 2009]
[2] BERT CUZEAU - Simple PS/2 interface [online] dostupný z WWW:
http://www.xess.com/projects/ps2_ctrl.pdf[cit. 15.5 2009]
[3] CRAIG PEACOCK - Interfacing the AT keyboard [online] dostupný z WWW:
http://www.beyondlogic.org/keyboard/keybrd.htm[cit. 15.5 2009]