Reklama

Základy ovládání mikrokontroléru ATmega(16/32) 7. díl – Jednoduchá elektronická hrací kostka

Úvod

V tomto článku se seznámíme s vytvořením jednoduché elektronické hrací kostky. Zobrazení čísla probíhá pomocí sedmisegmentového LED displeje. V zapojení je použit displej SC08-11EWA, který obsahuje společnou katodu, to znamená že, jednotlivé segmenty je nutné budit stavem log. 1. Jak bylo řečeno ve čtvrtém díle základů ovládání mikrokontroléru ATmega 4.díl – ovládání GPIO portů je v našem případě jedno, jestli budíme LED segmenty log. 1, nebo log. 0, protože proudové zatížení může dosahovat v obou stavech 40 mA. Pokud budete používat jiný typ mikrokontroléru, raději si napřed zjistěte, jestli můžete ve stavu log. 1 odebírat dostatečný proud pro rozsvícení segmentu.

Popis funkce

Princip této elektronické hrací kostky je velmi jednoduchý. Po stisknutí tlačítka se čeká 100 ms na odeznění zákmitů a poté je vysokou rychlostí zvyšováno číslo o jedničku a zobrazeno na sedmisegmentovém displeji. Pokud je číslo větší jak šest, uloží se do proměnné číslo jedna. Toto se děje do té doby dokud je stisknuté tlačítko. Po uvolnění tlačítka je spuštěn efekt pomalého zobrazení změny stavu, který trvá až do úplného zastavení. Nevýhoda tohoto principu je, že nestačí pouze stisknout tlačítko, ale je nutné ho krátce podržet, aby byla zaručena náhodná volba čísla.
Schéma zapojení ukazuje obrázek Obr. 1.

schema_kostky
Obr. 1: Elektronické schéma zapojení

 

Okomentovaný zdrojový kód
 

001: #include <avr/io.h>// knihovna AVR pro Input/output
002: #define F_CPU 16000000UL// frekvence hodinového signálu (nutné pro delay.h)
003: #include <util/delay.h>// hlavičkový soubor pro zpoždění
004:
005: void scan_button(void);// prototypy funkcí
006: void switch_number(uint8_t show_number);
007:
008: int button_state;// stav tlačítka
009: int prev_button_state;// předchozí stav tlačítka
010: int number;// číslo, které se má zobrazit
011: int i;// proměnná pro cykly
012:
013: int main(void)
014: {
015: DDRA = 0xFF;// nastavení PORTU A jako výstup
016: DDRC = 0x00;// nastavení PORTU C jako vstup
017: PORTC = 0xFF;// nastavení PULL–UP rezistorů
018: PORTA = 0xFF;// rozsvícení všech segmentů pro test, jestli jsou LED v pořádku
019:
020: _delay_ms(1000);// čekání 1000ms
021:
022: switch_number(1);// zobrazení čísla 1
023:
024: button_state = 0;// tlačítko není stisknuté
025:
026: while(1)
027: {
028: scan_button();// funkce pro testování stisknutého tlačítka
029: _delay_ms(10);//čekání 10ms;
030: }
031: return 0;
032: }
033:
034: void scan_button(void)
035: {
036: // uložení předchozího stavu
037: prev_button_state = button_state;
038: button_state = PINC;// uložení stavu portu C
039: // maskování spodního bitu, kde se nachází tlačítko
040: button_state &= 0b00000001;
041:
042: if (button_state == 0)// současný stav log. 0
043: {
044: if (prev_button_state == 1)//stisknutí tlačítka z log. 1 -> log. 0 = rozsvítit LED
045: {
046: _delay_ms(100);// ošetření zákmitů
047:
048: while (button_state == 0)// čekání dokud je stisknuté tlačítko
049: {
050: number++;// inkrementuj číslo
051:
052: if (number > 6)// pokud je číslo větší jak 6, začne se znovu od jedničky
053: {
054: number = 1;
055: }
056:
057: switch_number(number);// zobrazení čísla
058: _delay_ms(5);// zpoždění 5ms
059:
060: // uložení předchozího stavu
061: prev_button_state = button_state;
062: button_state = PINC;// uložení stavu portu C
063: // maskování spodního bitu, kde se nachází tlačítko
064: button_state &= 0b00000001;
065: }
066:
067: // pozvolná změna čísel
068: for (i = 0; i < 10; i++)
069: {
070: number++;// inkrementuj číslo
071:
072: if (number > 6)// pokud je číslo větší jak 6, začne se znovu od jedničky
073: {
074: number = 1;
075: }
076:
077: switch_number(number);
078:
079: switch (i)// výběr zpoždění podle pozice v cyklu
080: {
081: case 0: _delay_ms(50); break;
082: case 1: _delay_ms(75); break;
083: case 2: _delay_ms(100); break;
084: case 3: _delay_ms(125); break;
085: case 4: _delay_ms(150); break;
086: case 5: _delay_ms(175); break;
087: case 6: _delay_ms(200); break;
088: case 7: _delay_ms(225); break;
089: case 8: _delay_ms(250); break;
090: case 9: _delay_ms(275); break;
091: default: _delay_ms(50); break;
092: }
093: }
094: }
095: }
096: }
097:
098: // funkce pro zobrazení čísla na sedmisegmentovce
099: void switch_number(uint8_t show_number)
100: {
101: switch (show_number)
102: {
103: // rozsvícení čísla 1
104: case 1: PORTA = 0b00000110; break;
105: // rozsvícení čísla 2
106: case 2: PORTA = 0b01011011; break;
107: // rozsvícení čísla 3
108: case 3: PORTA = 0b01001111; break;
109: // rozsvícení čísla 4
110: case 4: PORTA = 0b01100110; break;
111: // rozsvícení čísla 5
112: case 5: PORTA = 0b01101101; break;
113: // rozsvícení čísla 6
114: case 6: PORTA = 0b01111101; break;
115: // rozsvícení čísla 1 pro jiné případy
116: default: PORTA = 0b00000110; break;
117: }
118: }

Vzorové zdrojové kódy slouží pouze k jednoduché demonstraci funkce, proto často obsahují globální proměnné, neobsahují většinou ukazatele, dále také neobsahují kontroly proměnných, definování nevyužitých pinů mikrokontroléru a podobné správné programátorské návyky. Proto je nutné tyto kódy brát s patřičnou rezervou.
 

 

 

Video s ukázkou funkce

[wpvp_flowplayer src=http://tajned.cz/wp-content/uploads/2013/10/AVR_DICE/Elektronicka_hraci_kostka.mp4 width=640 height=480 splash=http://tajned.cz/wp-content/uploads/2013/10/AVR_DICE/video.jpg]
 
Aktualizace: 16.4.2015
 

Jiné příspěvky v kategorii:

 

Základy ovládání mikrokontroléru ATmega(16/32) 1.díl – První kroky

Základy ovládání mikrokontroléru ATmega(16/32) 2. díl – Kompilace a krokování programu

Základy ovládání mikrokontroléru ATmega(16/32) 3.díl – Nahrání vytvořeného zdrojového kódu do mikrokontroléru

Základy ovládání mikrokontroléru ATmega(16/32) 4.díl – Ovládání vstupně/výstupních portů

Základy ovládání mikrokontroléru ATmega(16/32) 5.díl – Ošetření zákmitů na vstupním pinu mikrokontroléru

Základy ovládání mikrokontroléru ATmega(16/32) 6.díl – Externí přerušení

Základy ovládání mikrokontroléru ATmega(16/32) 8.díl – A/D převodník (1.část)

Základy ovládání mikrokontroléru ATmega(16/32) 9.díl – A/D převodník (2.část)

Základy ovládání mikrokontroléru ATmega(16/32) 10.díl – A/D převodník (3.část)

Základy ovládání mikrokontroléru ATmega(16/32) 11.díl – Čítač / Časovač (1.část – Základní popis)

Základy ovládání mikrokontroléru ATmega(16/32) 12.díl – Čítač / Časovač (2.část – Popis registrů)

Základy ovládání mikrokontroléru ATmega(16/32) 13.díl – Čítač / Časovač (3.část – Praktická ukázka)

Základy ovládání mikrokontroléru ATmega(16/32) 14.díl – Dvouřádkový LCD displej

Základy ovládání mikrokontroléru ATmega(16/32) 15.díl – Popis implementace komunikace I2C a EEPROM paměti 24LC512

Základy ovládání mikrokontroléru ATmega(16/32) 16.díl – Watchdog

Základy ovládání mikrokontroléru ATmega(16/32) 17.díl – Obsluha maticové klávesnice

Základy ovládání mikrokontroléru ATmega(16/32) 18.díl – Jednotka USART (1. část – Popis)

Základy ovládání mikrokontroléru ATmega(16/32) 19.díl – Jednotka USART (2. část – Praktická ukázka)

Základy ovládání mikrokontroléru ATmega(16/32) 20. díl – Generování audio signálu pomocí PWM

Základy ovládání mikrokontroléru ATmega(16/32) 21. díl – Analogový komparátor

Základy ovládání mikrokontroléru ATmega(16/32) 22. díl – Krokování programu v jazyce symbolických adres (JSA)
 
Tajned facebook
 

Za případné chyby v textu, ve zdrojovém kódě, nebo ve schématickém zapojení se omlouváme.
AUTOŘI NEBEROU ŽÁDNOU ODPOVĚDNOST ZA PŘÍPADNÉ ÚJMY NA ZDRAVÍ ČI MAJETKU.