Rozhranní pro klávesnici PS/2

Ondřej Kaller, Martin Jančík, UREL, FEEC, VUT Brno

Obsah:

  1. Úvod
  2. Realizace
  3. Závěr
  4. Literatura

Úvod

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.

Realizace

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.
Zapojení klávesnice
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í.
Rámec komunikace

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

Průběh po stisku jedné klávesy
Průběh po stisku jedné klávesy, detail

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.

Vývojový diagram

Následující obrázek ukazuje schéma zapojení přípravku pro připojení do vývojové desky ATmega16.

Schema zapojení přípravku

Závěr

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.

Literatura

[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]