BI-SAP.21 Struktura a architektura počítačů
Jdi na navigaci předmětu

Práce s tlačítky

1. Popis zapojení

Na kitu LCD Keypad Shield je k dispozici 5 tlačítek (4 směry + Select) pro běžné použití. Šesté tlačítko (RST) slouží pouze pro resetování kitu (reset kitu trvá cca 2 sekundy).

Všech pět tlačítek je připojeno do procesoru přes jeden analogový vstup AD0 - viz schéma zde (zdroj), což sice zjednodušuje zapojení a načítání hodnoty, ale znemožňuje detekovat více stisknutých tlačítek současně (prioritu bude mít to, které přemostí více odporů, tj. vytvoří nižší hodnotu na vstupu AD0 - viz tabulka níže).

Při dosazení napájecího napětí, hodnot odporů a rozlišení AD převodníku (10 bitů) lze vypočítat hodnoty, které odpovídají každému tlačítku:

SměrHodnota
Nic (uvolněno)0b 11 11 ?? ?? ??
Select0b 10 01 ?? ?? ??
Vlevo0b 01 10 ?? ?? ??
Dolu0b 00 11 ?? ?? ??
Nahoru0b 00 01 ?? ?? ??
Vpravo0b 00 00 ?? ?? ??
Varování:

Vzhledem k tomu, že se jedná o analogové součástky a vstup, tak nelze spoléhat na to, že všechny vývojové kity budou reagovat identicky. Ve vašich kódech na to tedy nespoléhejte a testujte pouze nejvyšší 4 bity hodnoty získané z převodníku (proto jsou v tabulce ostatní bity rovnou označené jako ?).

2. Inicializace

Následující kód inicializuje AD převodník tak, aby z něj bylo možné načítat hodnoty jednotlivých tlačítek:

init_button:
    push r16
    ; povoleni AD prevodniku a nastaveni preddelicky
    ;  (nastaveni bitu ADEN a trojice ADPS0 v pameti na adrese ADCSRA bez ovlivneni ostatnich bitu) 1
    lds r16, ADCSRA
    ori r16, (1<<ADEN) | (0b010<<ADPS0); 2
    sts ADCSRA, r16

    ; nastaveni referencniho napeti (0b01<<REFS0)
    ; nastaveni zarovnani vystupu vlevo (1<<ADLAR); 3
    ldi r16, (0b01<<REFS0) | (1<<ADLAR); 4
    sts ADMUX, r16

    pop r16
    ret
  1. ADCSRA, ADEN a ADPS0 jsou pouze předdefinované návěští/konstanty v překladači (v našem případě 0x7A, 7 a 0). Výhodou použití konstant je jednodušší migrace na jiný typ procesoru, který může mít jiné konkrétní hodnoty, ale stejný princip nastavení AD převodníku.
  2. Výrazy (1<<ADEN) a (0b010<<ADPS0) vypočítá překladač a do kódu dosadí výslednou konstantu (v našem případě log. 1 posunutá o 7 míst vlevo a 0b010 bez posunu, tj. 0b10000010).
  3. Výstup AD převodníku je 10bitový, ale registry i paměť v procesoru jsou jen 8bitové. Z tohoto důvodu je potřeba využít dva registry/paměťová místa. Touto volbou se nastaví, aby se 10bitová hodnota v těchto registrech zarovnala vlevo, což je pro naše účely lepší, protože se tak nejvyšší čtyři bity ocitnou v jednom registru a načítání/porovnání tak bude jednodušší.
  4. I tento výraz vypočítá překladač a dosadí výslednou konstantu.

3. Načítání hodnot

Načtení hodnot se sestává z následujících kroků:

  1. Spuštění konverze AD převodníku:
    • Konverzi analogové hodnoty AD převodníkem zahájíte nastavením bitu ADSC na adrese ADCSRA na log. 1.
    • Nastavení můžete provést obdobně jako je provedeno povolení AD převodníku v inicializaci (jen použijte jiný název bitu v instrukci ori).
  2. Vyčkání na dokončení převodu:
    • Konverze není hotová okamžitě - AD převodník ji nestihne provést během jednoho taktu procesoru.
    • Dokončení převodník hlásí pomocí log. 0 na bitu ADSC na adrese ADCSRA.
    • Vytvořte tedy jednoduchou smyčku, ve které načtete hodnotu z adresy ADCSRA do jednoho z běžných registrů r0-r31 pomocí instrukce lds, poté otestujte bit ADSC (buď pomocí bitové instrukce, nebo vymaskováním bitu na pozici ADSC a porovnáním) a pokud není na log. 0, tak načítáte znovu.
  3. Načtení výsledku:
    • Výsledek převodu je uložen na adresách ADCH (horní část) a ADCL (dolní část).
    • Vzhledem k tomu, že nás zajímají pouze nejvyšší 4 bity, tak stačí načíst hodnotu z adresy ADCH do jednoho z běžných registrů r0-r31. (Pokud by bylo z nějakého důvodu potřeba číst ADCH i ADCL, tak je nutno nejprve načíst ADCL a až poté ADCH. V opačném pořadí se načtou nesmyslné hodnoty.)
    • Po načtení se zbavte spodních 4 bitu (buď posunem, nebo maskováním) a zbylé 4 bity porovnejte s hodnotami z tabulky uvedené výše.

4. Simulace tlačítek

Simulátor nabízí dva simulační módy, které lze měnit přepínačem Debugging mode. Pokud Debugging mode zapnete, tak se tlačítka chovají jako přepínače, tj. první klik levým tlačítkem myši tlačítko zapne a tlačítko zůstane zapnuté až do dalšího kliknutí (nebo do kliknutí na jiné tlačítko). Pokud Debugging mode vypnete, tak je tlačítko aktivní jenom po dobu, kdy na něm držíte levé tlačítko myši stisknuté.

Pokud budete simulovat kód, který má reagovat na dlouhý stisk tlačítka pouze jednou, tak využijte vhodně umístěné breakpointy a spouštějte program pomocí volby Continue (F5). Pokud byste program krokovali a aktivovali tlačítka jen na pár instrukcí, tak hrozí, že na fyzickém vývojovém kitu bude program reagovat na jeden stisk vícekrát.