Z jednoho starého rozebraného notebooku mi zbyla klávesnice. Bez užitku se mi krčila doma ve skříni a tak když mi kamarád používající PDA řekl o možnosti připojit k němu externí klávesnici, rozhodla jsem se, že mu ji věnuji a udělám mu k ní potřebné rozhraní. Na internetu se vyskytuje několik programů na PDA pro obsluhu externí klávesnice spolu s návodem na stavbu rozhraní na bázi mcu 89C2051 mezi PC/AT klávesnici a sériový port PDA. Prozkoumáním zdrojového kódu pro mcu jsem zjistila, jaký je formát komunikace mezi PDA a klávesnicí. Šlo mi hlavně o mapování scan kódů kláves. Klávesnice z notebooku je maticová se 16 sloupci a 8 řádky. Při vymýšlení schéma obvodu pro obsluhu klávesnice jsem se nechala inspirovat původním zapojením v notebooku, ze kterého klávesnice pochází. Rozhodla jsem se použít mikrokontrolér AVR ATtiny2313 rozšířený o dvojici dekodérů 1 z 8 74HC138. Dekodéry slouží k výběru jednoho sloupce kláves, řádky vedou přímo do mikrokontroléru. Použitím dekodérů se ušetří 12 nožiček na mcu. Sw v mikrokontroléru cyklicky prohledává matici klávesnice a zjišťuje nově stisklé nebo puštěné klávesy. V závislosti na zjištěných změnách odesílá patřičné scan kódy kláves do PDA a také zajišťuje autorepeat déle stisknutých kláves. Komunikace s PDA je obousměrná a PDA má mimo jiné možnost zjistit přítomnost klávesnice a nastavovat parametry autorepeatu.
Schéma rozhraní je na Obr. 1. Kromě zmíněného mcu a dekodérů obsahuje zapojení ještě 16 diod vzájemně oddělujících jednotlivé sloupce a část pro konverzi úrovní rozhraní RS-232. Mcu je taktován z interního RC oscilátoru 4MHz. Napájení se může pohybovat v rozmezí 3 až 5V. Díky použití úsporného režimu mcu mezi jednotlivými cykly testování klávesnice, se odběr při napájení 3V pohybuje mezi 350uA (v klidu) a 500uA (při úporném psaní). LED pro indikaci stavu zámků klávesnice jsem z důvodu minimalizace spotřeby vynechala. Případní zájemci si je můžou doplnit, 3 nožičky na mcu na ně zbyly.
Na Obr. 2 je plošný spoj rozhraní. Deska je z důvodu rozměrů (minimální výšky) osazena výhradně SMD součástkami. Plošný spoj je pouze jednostranný, se 6 drátovými propojkami. Konektory pro připojení plochých "kablíků" z klávesnice jsou původní z notebooku. Napájení zajišťuje PDA a je připojeno 4 vodiči (RxD, TxD, GND, Vcc). Způsob připojení a mechanické úpravy klávesnice jsem nechala na kamarádovi.
Podklady ve formátu pro Eagle 4.1 jsou zde: | Schéma | |
Plošný spoj |
Na následujících fotografiích je zachycena konečná podoba rozhraní.
Detailní pohled na desku rozhraní |
Pohled na rozhraní připojené ke klávesnici |
Program pro mcu jsem jako obvykle napsala v assembleru a je v souboru
klavpda.avr
v sekci
Ke stažení.
Na začátku programu je provedena inicializace potřebných periferií (porty,
čítač 0, USART). Následuje uspání procesoru. Aktivování sleep módu je v nekonečné
smyčce. Pokud se tedy procesor probudí z důvodu obsluhy některé asynchronní
události, je po jejím obsloužení opět uspán. Funkci celého rozhraní zajišťují
tři obsluhy přerušení:
T0Ovf
volá proceduru KeyPr
, která zajišťuje
vlastní obsluhu klávesnice.
UART_R
zjistí, o jaký příkaz se jedná a provede
požadovanou operaci.
SSend
odesílané scankódy a obsluha
přerušení UART_E
je postupně odesílá po sérové lince.
Kromě obsluh přerušení obsahuje program dvě již zmíněné procedury:
SSend
vkládá znaky do kruhové fonty
SBuf
, přičemž ošetřuje možné stavy, jako je přetočení nebo
přetečení fronty.
KeyPr
zajišťuje vlastní obsluhu klávesnice.
Postupně prohledává jednotlivé sloupce klávesnice a zjišťuje, zda se změnil stav
od minulého volání procedury (předchozí stav je v poli KBStav
).
Pokud je zjištěna nová stisknutá klávesa, je provedeno její překódování podle
tabulky ScanTbl
a odeslání výsledného scankódu do PDA prostřednictvím
procedury SSend
. Pokud je zjištěno puštění klávesy, je provedeno
stejné překódování a odeslání jako při stisku, s tím rozdílem, že je nastaven
nejvyšší bit scankódu jako příznak puštění klávesy. Procedura dále uchovává
v proměnné LastKey
scankód naposledy stisknuté klávesy. Pokud
je tato klávesa držena stisknutá déle než je nastavená doba zpoždění autorepeatu
KBDelay
a zároveň nedojde ke stisku jiné klávesy, je tato opakována
s nastavenou rychlostí autorepeatu KBRate
. Parametry autorepeatu
je možno měnit pomocí příkazů z PDA ve stejném rozsahu, jako je tomu u PC
klávesnice. V převodní tabulce scankódů ScanTbl
je kromě scankódů
uložen i příznak, zda má daná klávesa autorepeat či nikoliv, řídicí klávesy
(Shift, Alt, Ctrl...) totiž autorepeat nemají.
Případné dotazy k hw nebo sw části rozhraní ráda zodpovím E-mailem.