Maticová klávesnice Projekt do předmětu Subsystémy PC Brno, 2002-2003 Tomáš Kreuzwieser, Ondřej Kožín
Obsah Úvod............................................ 1 1. Hardware........................................ 1 2. Program VHDL...................................... 1 3. Demonstrační program.................................. 2 4. Závěr.......................................... 2 5. Odkazy......................................... 2 6. Příloha.......................................... 3
Úvod Cílem našeho projektu bylo vytvoření ovladače pro maticovou klávesnici 4x4 v hradlovém poli Lattice. Samotný program měl být realizován pomocí jazyka VHDL a nebo pomocí Schematiku pro hradlové pole. Na PC jsme měli vytvořit jednoduchý program demonstrující funkčnost našeho zařízení. 1. Hardware Pro realizaci byla použita ISA karta hradlového pole SPC1. Schéma zapojení viz.[1] 1.1. Popis zapojení Resistory RES1 až RES4 o hodnotě 4k7 jsou zapojeny jako zvedací (PULL-UP). Tyto resistory jsou napájeny kladným napětím z pinů 9 a 10 konektoru JP1 z karty SPC1(karta s hradlovým polem). Důvodem zdvojení napájecích pinů je nedostatečná proudová zatížitelnost pinu, což se projevuje při současném stisku více kláves najednou, kdy hodnoty napětí snímané z vodičů R0 až R3 klesají pod požadovanou úroveň nutnou pro zachování stavu logické 1. Diody D1 až D4 slouží jako prevence zkratu při současném stisku alespoň dvou kláves ve stejném řádku, kdy se ve sloupcích právě stisknutých kláves nachází různé logické úrovně. 1.2. Testování stavu kláves Na katody diod je přiváděn vektor logických hodnot [0 1 1 1], který je vždy v následujících krocích cyklicky rotován doprava v nekonečné smyčce. V jednom okamžiku je tedy vybrán pouze jeden sloupec (log 0). Za normálních okolností (není stisknuta žádná klávesa) se na vodičích R1 až R3 z důvodu připojení na PULL-UP nachází stav logické 1. Stisknutím klávesy ve vybraném sloupci dojde k propojení vodiče Rx a vodiče Sx, což způsobí změnu stavu na příslušném vodiči Rx do logické 0. Všechny čtyři řádky (vodiče R0 až R3) jsou poté testovány na stav logické úrovně 0 (klávesa stisknuta). Nevýhodou maticového zapojení klávesnice je skutečnost, že nelze testovat některé kombinace při stisku více kláves najednou. Stisk 2 kláves lze správně rozeznat vždy, 3 a 4 klávesy již fungovat nemusí. (funguje např. stisk 3 i 4 kláves ve stejném řádku a sloupci atd.) Tento problém je způsoben hardwarovým zapojením klávesnice. Př: Jestliže stisknu klávesy K1, K5 a K6 a vodič S0 se právě nachází ve stavu log 1, přičemž vodič S1 je ve stavu log 0, dojde vlivem současného stisku K5 a K6 ke změně potenciálu ve vodiči S0 do stavu log 0. Jelikož je současně stisknuta i klávesa K1, bude při testování sloupce S1 v obou vodičích R0 i R1 detekována logická úroveň 0, přičemž ve vodiči R0 je úroveň log 0 detekována nesprávně, protože indikuje stisk klávesy K2, ke kterému zřejmě nedošlo. 2. Program VHDL Program se v podstatě dá rozdělit na dvě časti. Na část samotného testování stavů klávesnice (proces 1) a na část komunikující s ISA sběrnicí (proces 2), respektive s PC. 2.1. Proces 1 Program začíná nastavením pinů pro PULL-UP 1 a 2. V dalším kroku programu (v čase t) je vybrán první sloupec S0 na 1000 hodinových cyklů sběrnice. V čase t+500 (tedy v polovině tohoto intervalu, neboli o 500 hodinových taktů později) je přečten stav kláves ve vybraném sloupci a proběhne zjištění, zda nedošlo k náběžné nebo sestupné hraně u příslušné klávesy. To je prováděno srovnáním s předešlou hodnotou. Když došlo ke změně, tak si do pomocné proměnné IRQPRIZNAK poznačíme, že chceme žádat o IRQ na sběrnici ISA a současně tento stav zapíšeme do vektoru VYSLEDEK. V čase t+1000 vybereme další sloupec a celý proces zopakujeme. Takto postupně otestujeme všechny čtyři sloupce. V čase t+4000 zjistíme, jestli je IRQPRIZNAK=1 a pokud ano, tak generujeme přerušení do doby, než nedojde k vyčtení dat z nejvyšší adresy odpovídající nejvýznamnějším osmi bitům vektoru VYSLEDEK. Nejvýše však na 4000 sběrnicových taktů. Toto řešení volání přerušení maximálně jednou za 4000 cyklů je zde proto, aby přerušení nebyla generována příliš rychle a nedocházelo k případnému velkému výpočetnímu zatížení PC. 1
2.2. Proces 2 Tento proces má za úkol obsluhu jednotlivých stavů sběrnice ISA. Jedná se v podstatě o stavový automat. Na začátku proběhne testování signálů AEN (adress enable), IOR (IO Read), IOW (IO Write) a komparace adresy nastavené na sběrnici s přednastavenými (adresový dekodér). Čtení dat ze sběrnice: Možné pouze z adresy 300h a je používáno pro RESET karty. Pokud je na datové sběrnici hodnota 111d, tak se karta vyresetuje. Zápis dat na sběrnici: Na adresách 300h a 301h se nachází informace o stisku a na adresách 302h a 303h o uvolnění jednotlivých kláves. Nejméně významný bit (LSB 300h a 302h) odpovídá klávese 1 a nejvýznamnější bit klávese D (MSB 301h a 303h). Do LSB na adresu 304h zapisujeme log 1 v případě, že žádost o přerušení generuje naše karta. 3. Demonstrační program Je napsán v jazyce C a překládán v Borland C++ 3.1. Pro vykreslování je použita nepřenositelná knihovna conio.h. Zvolena byla kvůli rychlosti psaní programu. Kdyby se nejednalo o testovací program, tak by bylo nutné použít některou z alternativních knihoven, přenositelných i na jiné platformy než DOS/Windows. Na začátku programu proběhne reset ISA karty. Dále povolíme přerušení (v našem případě číslo 5), uložíme si ukazatel na starou obsluhu přerušení a nastavíme místo něj ukazatel na vlastní obsluhu (funkci ISRTest()). Tato funkce se bude volat po vygenerování příslušného přerušení. Na začátku se uloží obsah registrů do zásobníku a nastaví řadiči 8259A bit odpovídající přerušení číslo 5 do log 1. V dalším kroku zkontrolujeme hodnotu 111d (přerušení od naší karty) na adrese 300h a pokud je tato hodnota nastavena, tak přečteme všechny čtyři byte o stavu jednotlivých kláves a nastavíme globální proměnnou InterruptOccurred na true. V opačném případě (přerušení negenerovala naše karta) zavoláme starou obsluhu přerušení. Na závěr funkce obsluhy přerušení obnovíme obsahy registrů ze zásobníku. V hlavní část programu, která je prováděná po výše uvedeném nastavení, se pouze čeká na přerušení (na proměnnou InterruptOccurred v true) a nebo na ukončení. V případě přerušení překreslíme obrazovku, na níž pomocí jednoduché grafiky zobrazujeme stav kláves a nebo přímo vypisujeme stav kláves. 4. Závěr Požadované zadání se podařilo splnit. V případě požadavku na vícenásobný (3 a více) stisk kláves je třeba změnit vnitřní hardwarové zapojení klávesnice. V případných dalších verzích by se dal vylepšit program pro PC, který je pouze testovací. Například by nebylo špatné udělat ovladač nebo rezidentní program, který by četl stavy naší klávesnice a zmáčknuté klávesy by vracel do bufferu klasické klávesnice, nebo udělat ovladač pro obdobu klávesy poslední záchrany SysRq v Linuxu. Další změnou, tentokráte v hardware, by mohla byt jiná koncepce posílání přerušení z karty. Například při držení klávesy zrychlovat přerušení. Ale to by byl spíše krok zpět, protože u nás se to snadno dá udělat softwarově bez zbytečných přerušení. 5. Odkazy [1] Schéma ISA karty SPC1 [2] VHDL-Cookbook.pdf [3] VHDLs.doc [4] http://www.latticesemi.com 2
6. Příloha Obr. 1 Schéma zapojení maticové klávesnice 3