Začiatky s ATmega8, tlačidlo on/off a LED
Druhá časť seriálu o pokusoch s ATmega8 je znovu venovaná tlačidlu. Tentoraz sa po zatlačení tlačidla LED dióda rozsvieti, ale zhasne až po jeho ďalšom zatlačení.
Kde nastáva problém?
Žiadne tlačidlo nie je dokonalé a preto pri jeho zopnutí alebo vypnutí vzniká množstvo zákmitov (môže, ale nemusí vzniknúť ani jeden). Zatlačím tlačidlo a očakávam, že mikroprocesor zaregistruje len jedno zopnutie tlačidla. Ale vďaka zákmitom tlačidla mikroprocesor zaregistruje niekoľko po sebe idúcich zopnutí. Pozrite si obrázok, je tam naznačený ideálny a skutočný stav.

Ako som už spomínal, týchto rušivých zopnutí tam môže byť veľa, alebo nemusí byť ani jedno.
Aké sú riešenia?
Buď hardvérové, alebo softvérové. Hardvérové riešenie spočíva v dosadení súčiastok ku tlačidlu, ktoré zabezpečia, aby bolo len jedno zopnutie. Softvérové riešenie spočíva v úprave programu mikroprocesora tak, aby nevyhodnocoval zákmity.
Hardvérové riešenie
je popísané všade možne, cez google ho nájdete v angličitne ako debouncing switch. Ja sa ním nebudem zaoberať, pretože článok je venovaný najmä programovaniu.
Softvérové riešenie
Zákmity sa dajú od skutočného zopnutia tlačidla rozlíšiť na základe ich dĺžky. Ak trvá bežné zopnutie 250ms a viac, zákmit bude mať len niekoľko milisekúnd, alebo desiatky milisekúnd. Aj v mojom obrázku vyššie som naznačil, že zákmit trvá len malú časť zopnutia. Preto budem v programe testovať, ako dlho je zopnuté tlačidlo. Ak bude zopnuté veľmi krátko, vyhodnotím to ako zákmit.

Program bez časovača
V tomto riešení mikroprocesor dostáva impulz od tlačidla, ktorý potom vyhodnocuje a rieši, či to je zákmit, alebo skutočné zopnutie. Ako som už spomínal, stačí odmerať čas a na základe neho vyhodnotím, či to bol zákmit, alebo nie. Meranie nemusí byť presné, stačí napríklad 100x za sebou skontrolovať, či bolo tlačidlo zatlačené. Ak prejde celých 100 pokusov, viem, že tlačidlo bolo zatlačené. Týchto 100 overení v skutočnosti trvá veľmi krátko.

Schému zapojenia použijem rovnakú ako v predchádzajúcej časti seriálu. Každé zatlačenie tlačidla S1 spôsobí zmenu stavu LED diódy. Ak LED dióda svieti, tak zhasne a opačne. Kliknite na schému, zobrazí sa v novom okne a vo väčšom rozlíšení.
Takto vyzerá hotový program:
#include <avr/io.h> #include <avr/iom8.h> int main(void) /* Hlavná funkcia */ { DDRC &= ~0x01; /* Nastavi pin C0 ako vstupny */ PORTC &= ~0x01; /* Vypne pull-up rezistory na pine C0 */ DDRC |= 0x02; /* Nastavi pin C1 ako vystupny */ PORTC &= ~0x02; /* Vynuluje pin C1 */ unsigned int pocitadlo = 0; /* Premenna pre pocitanie overeni */ while(1) /* Nekonečný cyklus */ { while(PINC & 0x01) /* Pokial je stlacene S1 */ { if(pocitadlo < 1000) /* pokial je menej ako 1000 overeni */ { pocitadlo++; /* pripocitaj 1 overenie */ } else /* ak je viac ako 1000 overeni */ { PORTC ^= 0x02; /* Zmen stav LED na opacny */ while(PINC & 0x01) { /* cakaj kym nevypnem tlacidlo */ }; } } pocitadlo = 0; /* vynulovanie pocitadla */ } }
Program cez cyklus while(PINC & 0×01) stále testuje, či je stlačené tlačidlo S1. Ak zistí, že áno, cez if(pocitadlo < 1000) kontroluje, či už nastalo 1000 overení. Ak nie je, pripočíta jedno overenie: pocitadlo++; a znova kontroluje tlačidlo. Toto sa deje pokiaľ nenapočíta 1000 overení. Vtedy cez riadok PORTC ^= 0×02; zmení stav LED diódy na opačný a už nerobí nič. Až keď je tlačidlo pustené, vynuluje si napočítané overenia a čaká na ďalšie zatlačenie tlačidla.
Prečo najprv 100 a potom 1000 overení?
Počet overení sa ukladá v premennej pocitadlo. Premenná je typu unsigned int, čo znamená, že môže obsahovať čísla od 0 po 65535. Mikroprocesor spraví 100 overení veľmi rýchlo a preto som ich počet zvýšil na 1000. V praxi je najlepšie si to otestovať a určiť počet overení podľa vlastného uváženia.
Záverom…
Druhá časť je znova venovaná tlačidlu, pričom tentokrát som ukázal niečo málo okolo teórie zákmitov. Nabudúce už nechám tlačidlá napokoji. Budem sa venovať LED dióde a blikačom.

