Verze pro tisk

Jednoduchá klávesnička s AVR

Každý, kdo se trochu více zabývá použitím mikrokontrolérů pro řízení všemožných udělátek, se jistě dříve nebo později setká s potřebou interaktivně zadávat mikrokontroléru určité informace. Nejběžnější a z hlediska realizace asi i nejjednodušší způsob je použít malou klávesnici. Ve spoustě aplikací si vystačíme s několika málo klávesami. Například klávesnička složená z pouze tří tlačítek Plus Minus OK nám spolu s šikovně vyřešenou softwarovou obsluhou umožní pohodlně nastavovat spoustu číselných parametrů. Příkladem je nastavování parametrů frekvenčního měniče Simovert od fy. Siemens. Měnič má podle typu několik desítek parametrů, k jejichž nastavení slouží pouze tři tlačítka. Klávesnice má implementovánu několikastupňovou funkci opakování kláves (autorepeat). Čím déle klávesu držíte stisknutou, tím rychleji se klávesa opakuje. To umožňuje rychle a zároveň i přesně nastavovat parametry bez ohledu na to, zda je chcete nastavit na hodnotu 18,15 nebo 40099. Tento způsob ovládání mě inspiroval, když jsem vymýšlela, jak v jedné aplikaci jednoduše nastavovat asi 30 různých parametrů. Protože mi na mikrokontroléru zbývaly jen tři volné nožičky, rozhodla jsem se pro třítlačítkovou klávesničku s funkcí autorepeat. Pro zobrazování nastavovaných parametrů jsem použila čtyřmístný sedmisegmentový LED displej, o tom napíšu možná někdy příště.

Jak je vidět na následujícím schématu, hardwarové řešení klávesničky je velice jednoduché.

Schéma klávesničky
Obr.:Schéma klávesničky

Ve schématu jsou uvedeny pouze součástky týkající se klávesničky a součástky nutné pro funkci mikrokontroléru. Ostatní součástky závisí na aplikaci, ve které je klávesnička použita. Odpor R1 a kondenzátor C1 zajištují zresetování mikrokontroléru při zapnutí napájení. Mikrokontroléry AVR jsou sice vybaveny obvodem "Power On Reset", který by měl provést reset při zapnutí napájení, ne vždy ale funguje dobře. Atmel si toho je nejspíš vědom a tak novější mikrokontroléry vybavil ještě tzv. "Brown-out" detektorem, který již funguje spolehlivě. Externí resetovací obvod ale nic nezkazí, takže ho používám stále. Ke generování hodinového signálu je využit interní oscilátor s externím krystalem 10MHz a dvojicí kondenzátorů 27pF. Použití těchto kondenzátorů je téměř nezbytné, zvláště při vyšších kmitočtech krystalu bez nich některé mikrokontroléry nefungují. Kondenzátor C7 blokuje napájení a je dobré ho na plošném spoji umístit co nejblíže k napájecím vývodům mikrokontroléru. Odpory R2, R3 a R4 slouží jako pull-up odpory a zajišťují na vstupech mikrokontroléru log. 1 při nestisknutém tlačítku. Mikrokontrolér sice obsahuje interní pull-up odpory volitelné pro každý vstup, ale jejich hodnota není přesně definovaná a tak jsem raději použila externí. Kondenzátory C4, C5 a C6 filtrují částečně zákmity tlačítek a zároveň brání "náhodným" stiskům tlačítka vlivem blízkého EM rušení.

Druhou částí je programové vybavení pro obsluhu klávesničky. Obsluha je podobná obsluze klávesnice na PC (pod DOSem), jedna část programu (běžící nezávisle na pozadí) hlídá klávesnici a kódy stisknutých kláves zařazuje do kruhové fronty. Druhá část, spouštěná pouze při potřebě přečíst klávesu, kódy kláves z kruhové fronty vybírá. Nezávisle běžící část též zajišťuje funkci autorepeat. Zvolila jsem dvoustupňový autorepeat, je-li klávesa stisknuta déle než 500ms, začne se opakovat 10x za sekundu, je-li stisknuta déle než 2 sekundy, začne se opakovat 20x za sekundu.

Program pro obsluhu klávesničky jsem napsala (jak je mým zvykem) v assembleru. Výpis programu je v souboru klaves.avr Celkem jsou to čtyři procedury:

T0Ini Slouží k počáteční inicializaci časovače 0. Časovač generuje každých 25 ms přerušení a slouží k časování čtení kláves a k časování funkce autorepeat
T0Ovf Obsluha přerušení od přetečení časovače 0 (každých 25ms). Z této obsluhy je volána procedura KeyPr.
KeyPr Tato procedura zjišťuje, zda je stisknuta některá z kláves a pokud ano, zařadí ji do kruhové fronty. Pokud je klávesa stisknuta déle než 500ms nebo déle než 2s, vkládá každých 200ms resp. 100ms klávesu znovu do fronty (funkce autorepeat)
RdKey Procedura sloužící ke čtení kláves z kruhové fronty. Pokud je ve frontě klávesa, je její kód vrácen v registru R16 a je shozen ZF, pokud je fronta prázdná, vrací ZF nastavený.

Použité proměnné jsou blíže popsány přímo v programu, taktéž samotné procedury jsou poměrně podrobně komentované. Obsluha klávesnice se po počáteční inicializaci periferií procesoru aktivuje spuštěním procedury T0Ini. Dále již běží obsluha na pozadí. Chceme-li v programu přečíst stisknutou klávesu, zavoláme proceduru RdKey a ta nám vrátí buď kód stisknuté klávesy (viz. následující tabulka) nebo nastavený příznak ZF, indikující, že žádná klávesa stisknuta nebyla.

Kódy kláves
KódStisknutá klávesa (klávesy)
01hOK
02hMinus
03hOK+ Minus
04hPlus
05hOK+ Plus
06hPlus+ Minus
07hOK+ Plus+ Minus

Klávesničku lze samozřejmě v závislosti na aplikaci, ve které ji použijeme všelijak modifikovat, přidat další klávesy, měnit parametry autorepeatu, počet stupňů autorepeatu apod. Taktéž způsob, jak kódy kláves vrácené procedurou RdKey dále zpracováváme, závisí jen na naší fantazii.