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

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ód | Stisknutá klávesa (klávesy) |
01h | ![]() |
02h | ![]() |
03h | ![]() ![]() |
04h | ![]() |
05h | ![]() ![]() |
06h | ![]() ![]() |
07h | ![]() ![]() ![]() |
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.