From 9f23f3652e32077a3b256f65522fe80393ae0c4b Mon Sep 17 00:00:00 2001 From: "Michal, OK1WMR" <ok1wmr@gmail.com> Date: Fri, 8 Apr 2011 06:33:14 +0200 Subject: [PATCH] =?UTF-8?q?P=C5=99id=C3=A1n=20=C4=8Dl=C3=A1nek=20AVR=20-?= =?UTF-8?q?=20LED=20panel=20-=20#4=20Program?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (Autoexportován z Joomly) --- articles/2011/avr-led-panel-4-program.md | 187 +++++++++++++++++++++++ 1 file changed, 187 insertions(+) create mode 100644 articles/2011/avr-led-panel-4-program.md diff --git a/articles/2011/avr-led-panel-4-program.md b/articles/2011/avr-led-panel-4-program.md new file mode 100644 index 0000000..47c25d9 --- /dev/null +++ b/articles/2011/avr-led-panel-4-program.md @@ -0,0 +1,187 @@ ++++ + +title = "AVR - LED panel - #4 Program" +perex_e = " + +KompatibilnĂ zapojenĂ: LED panel s ATmega8 + +Ke staĹľenĂ: LED_004.c == LED_004.pdf == LED_004.htm +. +. +" +tags = ["ÄŚlánek"] ++++ + + + +KompatibilnĂ zapojenĂ: LED panel s ATmega8 + +Ke staĹľenĂ: LED_004.c == LED_004.pdf == LED_004.htm +. +. + +* * * + +<title>Untitled</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta name="generator" content="SynEdit HTML exporter"> <style type="text/css">&amp;amp;amp;amp;lt;!-- body { color: #000000; background-color: #FFFFFF; } .cpp1-assembler { } .cpp1-brackets { } .cpp1-comment { color: #008000; font-style: italic; } .cpp1-float { color: #000080; } .cpp1-hexadecimal { color: #000080; } .cpp1-character { } .cpp1-identifier { } .cpp1-illegalchar { } .cpp1-number { color: #000080; } .cpp1-octal { color: #0000FF; } .cpp1-preprocessor { } .cpp1-reservedword { font-weight: bold; } .cpp1-space { color: #008080; } .cpp1-string { color: #800000; } .cpp1-symbol { } --&amp;amp;amp;amp;gt;</style> + +``` +/* +Minule jsme si ukázali, jak blikat ledkou pomocĂ bitovĂ©ho komplementu (~). +NynĂ bychom se mohli pokusit vytvoĹ™it svÄ›telnĂ©ho hada. K tomuto účelu se hodĂ +bitovĂ˝ posun. Jak bylo minule uvedeno, bitovĂ˝ posun se zapisuje >> nebo <<. +VĂ˝slednĂ˝ program by tedy mohl vypadat: +*/ + +#define F_CPU 1000000UL // 1 MHz (základnĂ frekvence) + +#include <avr/io.h> //Knihovna vstupĹŻ a vĂ˝stupĹŻ (PORT, DDR) +#include <util/delay.h> //Knihovna ÄŤekacĂch funkcĂ + +#define RYCHLOST 10 //PoÄŤet krokĹŻ za sekundu +#define DELKA 3 //DĂ©lka hada (poÄŤet ledek)) + +int main (void) +{ +DDRB = 0b11111111; //piny 0 - 5 budou vĂ˝stupnĂ +unsigned char n; //nadefinujeme si promÄ›nnou "n", která bude slouĹľit + //k poÄŤĂtánĂ opakovánĂ cyklu +PORTB = 0; //zhasneme všechny ledky. (1=svĂtĂ a 0=zhasnuto) + +for(;;) + { //hlavnĂ smyÄŤka + + for(n=0;n<(8+DELKA);n++) //SmyÄŤka s urÄŤitĂ˝m poÄŤtem opakovánĂ + //(8 ledek + dĂ©lka hada, aby nevznikal + //novĂ˝ had, dokud ten starĂ˝ nezmizĂ - + //mĹŻĹľete vyzkoušet, co se stane, kdyĹľ + //konstantu DELKA smaĹľete.) + { + if (n<DELKA) //pokud je poÄŤet opakovánĂ menšà neĹľ dĂ©lka hada + { //musĂme pĹ™idat dalšà článek hada (rozsvĂtit led) + //asi takto: 00000001, 00000011, 00000111, atd. + + PORTB <<=1; //posuneme hada doleva (bity se posunou doleva a + //vpravo se objevĂ 0. + //napĹ™: 00001111 po odrotovánĂ do leva: 00011110 + + PORTB ++; //pĹ™iÄŤteme 1 (rozsvĂtĂme dalšà článek): + //00011110 + 1 = 00011111 (hadovi pĹ™ibyl ÄŤlánek) + } + else //pokud nenĂ poÄŤet opakovánĂ menšà neĹľ dĂ©lka hada + { //-to znamená, Ĺľe hada uĹľ jsme nakreslili.. + + PORTB <<=1; //...tak pouze posuneme doleva + //(vpravo se automaticky doplnĂ nula) + // napĹ™: 00111110 (had je zakonÄŤen, a přÚtÄ› uĹľ bude + //jen "lĂ©zt": 01111100, 11111000, 11110000, atd. + } //jinak by nám had pořád pĹ™irĹŻstal, aĹľ by svĂtily + //všechny ledky + + _delay_ms (1000/RYCHLOST); //ÄŚekánĂ (1000 ms = 1 sekunda) - rychlost + //je tedy poÄŤet krokĹŻ za sekundu + + } //konec tÄ›la cyklu - a znovu na začátek :-) + //aĹľ se cyklus provede 8x (poÄŤet ledek) + poÄŤet ledek na hada + //- to znamená, Ĺľe had uĹľ vyleze "mimo ledky" + // (10000000 -> 00000000) - všechny ledky jsou zhasnutĂ© + //- cyklus se ukonÄŤĂ (provedl se "(8+DELKA)" krát) + + } // konec nekoneÄŤnĂ© smyÄŤky for(;;) program skoÄŤĂ zpátky na začátek + // a vše se opakuje. + +} //konec funkce main (sem se sice program nikdy nedostane, ale funkce musĂ + //bĂ˝t ukonÄŤená, jinak by hlásil pĹ™ekladaÄŤ chybu + +/* +V tomto programu jsme pouĹľili promÄ›nnou (n), podmĂnÄ›nĂ˝ blok (if) a smyÄŤku s +urÄŤitĂ˝m poÄŤtem opakovánĂ (for(n=0;n<8;n++)). +*/ +/* +PROMÄšNNĂ: +PromÄ›nná je mĂsto v pamÄ›ti mikrokontrolĂ©ru, kam se ukládajĂ ÄŤĂsla. ProtoĹľe +mikrokontrolĂ©r potĹ™ebuje vÄ›dÄ›t, jak velkĂ˝ kus pamÄ›ti si má pro danou promÄ›nnou +vyhradit, pĂše se pĹ™i definici promÄ›nnĂ© jejĂ typ (modrĂ˝ text pĹ™ed promÄ›nnou). +PĹ™ehled typĹŻ promÄ›nnĂ˝ch: + + TYP: VELIKOST: ÄŚĂŤSLO, JAKÉ JE MOĹ˝NO UCHOVAT: +char 8 bit -128 aĹľ 127 +unsigned char 8 bit 0 aĹľ 255 +int 16 bit -32768 aĹľ 32767 +unsigned int 16 bit 0 aĹľ 65535 +long 32 bit -2,14*10^9 aĹľ 2,14*10^9 +unsigned long 32 bit 0 aĹľ 4,29*10^9 +*/ + +/* +PODMĂŤNÄšNĂť BLOK: + +if (podmĂnka) + blok1 +else + blok2 + +PodmĂnÄ›nĂ˝ blok sloužà k vÄ›tvenĂ programu. PouĹľĂvá se tehdy, kdyĹľ potĹ™ebujeme +provĂ©st nÄ›jakĂ© pĹ™Ăkazy jen tehdy, kdyĹľ platĂ nÄ›jaká podmĂnka. +PodmĂnka je vĂ˝raz, kterĂ˝ kdyĹľ je pravdivĂ˝, vykoná se blok1 a kdyĹľ pravdivĂ˝ +nenĂ, vykoná se blok2. +Pokud obsahuje blok1 nebo blok2 vĂce pĹ™ĂkazĹŻ, uzavĂrajĂ se do sloĹľenĂ˝ch +závorek "{}". +*/ +/* +SMYÄŚKA: + +for(inicializátor;podmĂnka;inkrement) +{ +tÄ›lo cyklu +} + +Inicializátor je vlastnÄ› začátek (odkud má cyklus poÄŤĂtat) +PodmĂnka je vĂ˝raz, kterĂ˝ kdyĹľ platĂ, tak cyklus provede dalšà opakovánĂ. +Pokud vĂ˝raz pĹ™estane platit, cyklus se ukonÄŤĂ a program pokraÄŤuje za cyklem. +Inkrement je vĂ˝raz, kterĂ˝ Ĺ™Ăká, kolik se má pĹ™iÄŤĂst, nebo odeÄŤĂst s kaĹľdĂ˝m +opakovánĂm cyklu. My jsme pouĹľĂvali: n++, coĹľ je totĂ©Ĺľ jako: n=n+1\. S kaĹľdĂ˝m +opakovánĂm cyklu se tedy k promÄ›nnĂ© "n" pĹ™iÄŤte 1\. +TÄ›lo cyklu je sada pĹ™ĂkazĹŻ uzavĹ™ená do sloĹľenĂ˝ch závorek "{}" která se pĹ™i +kaĹľdĂ©m opakovánĂ vykoná. + +Dejme tomu, Ĺľe chceme nÄ›jakĂ˝ blok instrukcĂ provĂ©st 3x. +NapĂšeme: +for (n=0;n<3;n++) +{ +blok pĹ™ĂkazĹŻ +} + +Náš cyklus tedy zaÄŤne: + +n=0\. Otestuje podmĂnku n<3 = pravda - pokraÄŤuje se. K promÄ›nnĂ© "n" se +pĹ™iÄŤte 1 (n++). +A znovu: +n=1 (0+1=1). PodmĂnka: n<3 = pravda - pokraÄŤuje se. OpÄ›t se pĹ™iÄŤte 1 (n++). +A zas: +n=2 (1+1=2). PodmĂnka: n<3 = pravda - pokraÄŤuje se. Zase se pĹ™iÄŤte 1 (n++). +A nakonec: +n=3 (2+1=2). PodmĂnka: n<3 = nepravda - konec cyklu. + +Je tedy vidÄ›t, Ĺľe se cyklus provedl 3x. +*/ +/* +NynĂ se podĂváme, co se stalo s registrem PORTB v našem programu. +Nejprve jsme zhasli všechny ledky tak, Ĺľe jsme do PORTB zapsali samĂ© nuly +(0 = 0b00000000). +PotĂ© jsme vstoupili do hlavnĂ smyÄŤky, která neustále spouštĂ cyklus: +"for(n=0;n<(8+DELKA);n++)". Jakmile se tento cyklus provede tolikrát, kolikrát +je potĹ™eba, program "propadne" zpÄ›t do hlavnĂ smyÄŤky "for(;;)" která jej vrátĂ +zpÄ›t na začátek cyklu "for(n=0;n<(8+DELKA);n++)" +HlavnĂ smyÄŤka má tedy jedinĂ˝ Ăşkol, a to resetovat náš cyklus +"for(n=0;n<(8+DELKA);n++)". +*/ + +/* +Na začátku programu jsou definovány konstanty "RYCHLOST" a "DELKA", kterĂ© +urÄŤujĂ rychlost pohybu hada a jeho dĂ©lku. Rychlost je dána poÄŤtem krokĹŻ za +sekundu (1 - 1000) a dĂ©lka je dána poÄŤtem svĂtĂcĂch ledek. (0 - kolik chcete). +*/ + +//Pro radioklub OK1KVK naspal Vašek Král + +``` \ No newline at end of file -- GitLab