Realizace
Obsah nákupního košíku je vidět na obrázku 1.24. V textové podobě je tento seznam uveden v tabulce 1.9. Začneme zlehka - připájením kabelů od konektorů PSS k maticové klávesnici KB1. Neprve začneme sloupci klávesnice, tj. černou žílu konektoru PSS (označen jako S), kterou přípájíme nejvíc vlevo, na první pájecí plošku klávesnice (viz 1.25). Pak pokračujeme hnědou, červenou a končíme oranžovou žílou. Na pátou pájecí plošku připájíme černou žílu kabelu od druhého konektoru PSS (označen jako R). A zase postupujeme v pořadí žil: hnědá, červená a oranžová.
Značka | Ks | Název | Objednací kód | Cena/ks |
KB1 | 1 | Maticová klávesnice 4x4 | GES06503819 | 99,- Kč |
U2 | 1 | 74HCT573 (8bit D-latch, budič sběrnice) | GES05000438 | 6,90 Kč |
U3 | 1 | 74HCT00N (4x hradlo NAND) | GES05000372 | 5,90 Kč |
U4 | 1 | 74HCT245 (8bit obousm.budič sběrnice) | GES05000426 | 8,60 Kč |
JP3, JP4 | 2 | Konektor male 90° do PCB, 4PIN | GES06600565 | 0,75 Kč |
-- | 2 | Zásuvka k PSS s vodičem 30cm, 4PIN | GES06615182 | 9,90 Kč |
RN2 | 1 | 8 rezistorů 4k7 se společným vývodem | GES05302503 | 2,00 Kč |
Vzorový výsledek je na obrázku 1.25. Nicméně ještě nám schází jeden krok k tomu, aby výsledek vaší snahy vypadal jako na obrázku 1.25. Pomocí tenkého šroubováku musíme vytáhnout piny konektoru PSS označeného jako R a zrcadlově prohodit jejich pořadí, tzn. jestliže byla černá žíla vlevo, tak teď ji musíme dát vpravo atd (obrázek 1.25). Piny konektoru vycvakneme tak, že tenkým šroubovákem zatlačíme shora na jazýček pinu přístupném v obdelníkovém otvoru svrchu konektoru a pin jemným tahem povytáhneme. Pin pak zpátky namontujeme prostým zasunutím až do zacvaknutí jazýčku.
Po rozehřívacím kole s klávesnicí zkusíme něco težšího. Přípájíme součástky: integrované obvody U2, U3 a U4, dále konektory JP3 a JP4 a nakonec odporovou síť RN2. Předtím si však protáhneme značení na straně součástek kudy povede datová sběrnice. Rozmístění součástek je vidět na obrázku 1.26. Pájení součástek začneme integrovaným obvodem U2. Umístíme jej obráceně, tedy výřezem směrem ke konci plošného spoje, tak aby jeho pin 20 směřoval k vodiči země a pin 1 k datové sběrnici. Pin 10 U2 bude tři dírky od datové sběrnice a tři dírky posledního propoje konektoru JP2 s datovou sběrnicí. Integrovaný obvod U2 připájíme. Dále umístíme konektor JP3 pod obvod U2, tak aby piny konektoru byly pod piny 16 - 19 integrovaného obvodu U2 a aby mezi konektorem JP3 a U2 zůstala jedna řada dírek volná.
Integrovaný obvod U4 (U3 zatím přeskočíme) umístíme kolmo k podélné ose plošného spoje, výřezem k napájecímu vodiči a tak, aby pin 2 navazoval na vodič signálu D datové sběrnice a pin 9 na vodič signálu D7. Pin 10 integrovaného obvodu U4 bude vzdálen čtyři dírky od pinu 1 integrovaného obvodu U2 (viz obrázek 1.26). Integrovaný obvod U4 zapájíme. Jednu dírku vpravo od U4 umístíme odporovou síť RN2, tak aby její společný vývod byl jednu dírku pod pinem 11 U4. Tj. tak aby vývody rezistorů RN2 byli přímo proti pinům 11 - 18 integrovaného obvodu U4. Odporovou sít zapájíme. Pod odporovou síť RN2 zapájíme konektor JP4 rovnoběžně s konektorem JP3 a svisle jednu dírku od odporové sítě RN2.
Zbývá poslední součástka - integrovaný obvod U3. Ten umístíme podélně s osou plošného spoje tak, že jeho pin 1 bude čtyři dírky vodorovně a sedm dírek svisle od pinu 20 integrovaného obvodu U4 (viz obrázek 1.26 pravý horní roh, strana součástek). Integrovaný obvod zapájíme.
Pokračovat budeme pájením spojů datové sběrnice a napájení (viz obrázek 1.27). Začneme pájením drátků, které budou připojovat obvod U2 k vodičům datové sběrnice. Mezi těmito drátky a integrovaným obvodem U2 necháme jednu dírku mezeru. Tu překleneme holými drátky na straně spojů. Pak ze strany spojů protáhneme vodiče datové sběrnice až k druhým koncům připojovacích drátků od U2. Dále protáhneme vodiče datové sběrnice až na piny integrovaného obvodu U4, čímž jej defakto připojíme na datovou sběrnici. S ohledem na délku vodičů datové sběrnice je pro jistotu na několika místech přípájíme k plošnému spoji. Tím je bezpečně zafixujeme v jejich poloze.
Dalšími spoji jsou spoje mezi konektorem JP3 a integrovaným obvodem U2. Ty provedeme na straně spojů.
Konektor JP4 a U4 propojíme pomocí drátků na straně součástek. Následně tyto drátky spojíme pomocí holých drátků na straně spojů s odporovou sítí RN2. Tu pak propojíme dále s integrovaným obvodem U4 (viz obrázek 1.27 vpravo uprostřed, strana spojů).
Dále přípájíme napájení integrovaného obvodu U2. Nejprve modrým drátkem spojíme piny 1 a 10 a pak spojíme pin 10 se zemí. Konce drátků propojíme s piny větším množstvím cínu. Oranžovým drátkem spojíme pin 20 U2 se společným vývodem odporové sítě RN2. Společný vývod RN2 poté propojíme s pinem 20 integrovaného obvodu U4 a ten následně s vodičem napájeícho napětí (viz obrázek 1.27).
U obvodu U4 dokončíme připojení napájení - piny 1 a 10 propojíme modrým drátkem a pin 10 dále propojíme se zemí.
Zbývá napájení obvodu U3. Pin 14 propojíme oranžovým drátkem s napájecím napětím, pin 7 modrým drátkem s zemí.
Posledním krokem je propojení řídících signálů s integrovaným obvodem U3. Začneme protažením značení na straně součástek kudy povede řídící sběrnice.
Pak krátkými drátky propojíme piny 1 a 2 obvodu U3 s řídícím signálem /Strobe (viz obrázek 1.28). Dále propojíme výstupní pin 3 s pinem 4 a pin 5 se signálem /Select. Nakonec pin 6 propojíme s pinem 19 integrovaného obvodu U4. Tím máme jednu stranu U3 hotovou.
Druhou stranu začneme pinem 13, který propojíme se signálem /Strobe. Pak propojíme pin 12 se signálem /Select. Výstupní pin 11 spojíme s pinem 10, který zároveň propojíme s pinem 9. Pin 8 propojíme s pinem 11 integrovaného obvodu U2 (dlouhý bílomodrý drát na obraázku 1.28).
Na straně spojů protáhneme holými drátky vodič signálu /Strobe až k drátku od pinu 1 integrovaného obvodu U3. Na několika místech je pro jistotu přípjíme k plošnému spoji kvůli fixaci polohy. Drátky od pinů 1, 2 a 13 U3 propojíme větším množství cínu.
Zbývá jen protáhnout vodič signálu /Select sousedicí bezprostředně s datovou sběrnicí. Protože nebyl dosud potřeba, budeme jej muset táhnout až od konektoru P1. Natáhneme si jej holým drátkem až k integrovanému obvodu U4. Pak odsud uděláme propojku ve tvaru širokého U, která bude končit u drátku od pinu 12 U3. Kouskem holého drátku pak protáhneme vodič signálu /Select až k drátku od pinu 5 U3 (viz obrázek 1.28 vpravo uprostřed, strana spojů).
Pájení máme za sebou, teď si vylepšíme hw přípravek tím, že k němu připevníme LCD displej a klávesnici. Mezi kovové úchytky rámečku LCD displeje vmáčkneme černé molitany, na kterých jsme obdrželi integrované obvody (viz obrázek 1.29). Modul displeje pak upevníme drátky k plošnému spoji hw přípravku. Drátky umístíme v levém horním a pravém spodním rohu modulu displeje. Pájecí plošky L+ a L- by měly doléhat na pouzdro integrovaného obvodu U4 (viz obrázek 1.30). Pravá část modulu displeje pak na pouzdro U3. Je nutné zde trochu zatlačit, aby si molitan mezi úchyty sednul a displej nebyl napravo výš.
Klávesnici přichytíme jejím pravým horním rohem přes modul displeje k plošnému spoji hw přípravku. Její levý dolní roh přidrátkujeme také k plošnému spoji. Výsledek je vidět na obrázku 1.30. Hezké, že?
Oživení
Jako vždycky začneme vizuální prohlídkou spojů. Podle schématu na obrázku 1.23 zkontrolujeme správnost spojů. Pak ověříme, že jsou všechny drátky spojeny s piny integrovaných obvodů, že nikde nejsou nechtěné spoje apod.
Po důkladné kontrole, zkusíme hw přípravek připojit k paralelnímu portu, zapneme napájení a spustíme pokusné PC. Ověříme, že LED diody i LCD displej funguje jako předtím. Pokud ano, je to dobré znamení. Pokud ne, začneme zjišťovat příčinu potíží.
Další oživení provedeme v rámci testování ovladače maticové klávesnice.
Ovladač
Vzorový kód ovladače pro zařízení keyb4x4, včetně projektu v Eclipse je ke stažení zdehttp://www.ucsimply.cz/products/modsam9260/#Zdrojové kódy. Tento zdrojový kód vznikl doplněním kostry ovladače dskel, kterou jsme si připravili v části o vývoji ovladačů. Zdrojový kód ovladače zařízení led4x můžeme v počítači s Linuxem buď naimportovat do Eclipse a zkompilovat jej v prostředí Eclipse nebo můžeme kompilaci provádět přímo v příkazové řádce příkazem make.
Postup importu projektu ovladače do Eclipse:
- V Eclipse v hlavním menu zvolíme File->Import....
- V otevřeném dialogovém okně vybereme ve složce General položku Existing Projects into Workspace a stiskneme tlačítko Next.
- V dalším okně zvolíme Select archive file a vložíme cestu k archivu zdrojového kódu ovladače a stiskneme tlačítko Finish.
- Projekt ovladače se naimportuje do aktuálního pracovního prostoru Eclipse.
- Ověříme, že v makefile ovladače je v proměnné KDIR uvedená správná cesta ke stromu zdrojových kódů jádra. Přípomínám, že ovladač musí být kompilován vůči jádru, do kterého ho pak budeme zavádět.
Zdrojové kódy ovladače máme naimportovány. V následujícím textu si zdrojové kód ovladače stručně rozebereme, abychom si objasnili funčknost ovladače.
Skenování klávesnice zajišťuje uživatelská funkce scantimer_userfunction(), která je volána v definové periodě časovačem scanTimer. V této funkci nejprve oskenujeme klávesnici vystavením log. 0 na vybraný řádek a sejmutím stavu všech sloupců. Pokud je na některém sloupci log. 0, skenování ukončíme a z kódu řádku a sloupce získáme scan kód stisknuté klávesy. Ten pak vyhodnotíme v druhé části funkce.
V druhé části uživatelské funkce časovače eliminujeme zákmity a to tak, že porovnáme aktuální scan kód se scan kódem předchozí stisknuté klávesy (pokud byla stisknuta). Pokud jsou shodné a počet sejmutí stejné klávesy překročil určenou hodnotu, uložíme scan kód do buferu stisknutých kláves a vynulujeme počítadlo stisknutí stejné klávesy a dále také jako paměť předchozího scan kódu. Pokud ne, tak si nový scan kód zapamatujeme a spustíme časovač znova.
Scan kód klávesy je osmibitový a je složen z kódu řádku a sloupce. Vyšší půlbyte je kód řídku, nižší pak kód sloupce. Kód řádku či slupce je čtyřbitové číslo, kde log. na daném bitu udává řádek/sloupec stisknuté klávesy. Např. scan kód 0x48 (01001000) určuje 3. řádek a 4. sloupec (bráno z levého horního rohu), tj. klávesu C.
Odolnost vůči zákmitům je dána minimálním počtem sejmutí stejné klávesy a periodou skenování klávesnice. Obecně je lepší mít vyšší počet sejmutí stejné klávesy a kratší periodu skenování. Při dlouhé periodě se může klávesnice jevit jako necitlivá či pomalá. Podobně při vysokém počtu minimálního sejmutí stejné klávesnice. Naopak při krátké periodě dochází ke generování velkého počtu scan kódů stejné klávesy.
Spuštění časovače a tedy i skenování klávesnice je součástí inicializační funkce ovladače. Deaktivace časovače, tj. skenování klávesnice se provádí v ukončovací funkci.
Scan kód stisknuté klávesy je ukládán do kruhového buferu, odkud jej může aplikace z uživatelského prostoru vyčítat přes systémové volání read(). Kruhový bufer je vpodstatě nekonečný bufer. Nekonečný proto, že jakmile dojdeme při čtení nebo zápisu na konec buferu, tak skočíme na začátek a pokračujeme dál. Vyčítání začíná od nejstarší stisknuté klávesy, resp. jejího scan kódu, a pokračuje k novější. Vlivem rozdílné rychlosti generování scan kódů a jejich vyčítání uživatelskou aplikací může dojít k přepisu starších scan kódů kláves.
Systémové volání write() není ovladačem podporováno - nemá smysl.
Přístup ke kruhovému buferu je chráněn spinlockem bufferLock. Důvod je ten, že k němu lze přistupovat zaráz ze dvou nezávislých kontextů. Jednak z kontextu uživatelské aplikace volající systémové volání read(), které z buferu vyčítá scan kódy kláves. A jednak také z kontextu SW přerušení, které je vyvoláno vypršením časovače scanTimer a v němž se provádí uživatelská funkce časovače scantimer_userfunction(), tj. samotné skenování klávesnice. Proto je třeba zajistit výlučný přístup k buferu, což zajištují funkce spinlocku spin_lock_bh() a spin_unlock_bh(). Použitá varianta těchto funkcí zakazuje pouze SW přerušení, HW přerušení jsou i nadále povolena. Tím, že zakážeme SW přerušení, tak na dobu zamčení spinlocku znemožníme provedení obsluhy uživatelské funkce časovače.
Ovladač podporuje také ioctl příkaz ClearBuf, který umožňuje uživatelské aplikaci vymazat kompletní obsah buferu scan kódů.
Test ovladače
Po kompilaci a úspěšném zavedení ověříme, že v adresáři /dev se objevil soubor zařízení keyb4x4.
Pak zkusíme mačkat klávesy. Na výpisu z funkce scantimer_userfunction() uvidíme zda stisk klávesy způsobuje generování nějakého scan kódu (Pozor, musíme změnit úroveň logování, kterou chceme na systémové konzoli zobrazovat). Případné chyby na hw úrovni lze snadněji odhalit tak, že neustále vystavujeme pouze jeden řádek a pomocí multimetru zjišťujeme, zda se log. 0 při stisknuté klávese na tomto řádku přenese na i stranu A integrovaného obvodu U4.
Scan kód můžeme snadno z buferu ovladače vyčítat pomocí příkazu cat:
$ cat /dev/keyb4x4
který vrátí ASCII podobu scan kódů.