From 863a036cd8fd8341bad442db9a734e075e8b6911 Mon Sep 17 00:00:00 2001 From: "Michal, OK1WMR" <ok1wmr@gmail.com> Date: Sat, 9 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#5=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-5-program.md | 178 +++++++++++++++++++++++ 1 file changed, 178 insertions(+) create mode 100644 articles/2011/avr-led-panel-5-program.md diff --git a/articles/2011/avr-led-panel-5-program.md b/articles/2011/avr-led-panel-5-program.md new file mode 100644 index 0000000..f60e4e6 --- /dev/null +++ b/articles/2011/avr-led-panel-5-program.md @@ -0,0 +1,178 @@ ++++ + +title = "AVR - LED panel - #5 Program" +perex_e = " + +KompatibilnĂ zapojenĂ: LED panel s ATmega8 + +Ke staĹľenĂ: LED_005.c == LED_005.pdf == LED_005.htm +. +. +" +tags = ["ÄŚlánek"] ++++ + + + +KompatibilnĂ zapojenĂ: LED panel s ATmega8 + +Ke staĹľenĂ: LED_005.c == LED_005.pdf == LED_005.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;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;gt;</style> + +``` +/* +V minulĂ©m programu jsme si ukázali, jak pouĹľĂvat promÄ›nnou, jak vytvářet cykly s +urÄŤitĂ˝m poÄŤtem opakovánĂ (for) a jak pouĹľĂvat podmĂnku (if). +UmĂme uĹľ tedy rosvÄ›cet a zhasĂnat ledky v námi zvolenĂ©m poĹ™adĂ. +*/ + +/* +Naše dosavadnĂ programy majĂ ale jeden velkĂ˝ nedostatek. Pokud jsme chtÄ›li nÄ›co +zmÄ›nit (dĂ©lku hada, rychlost), museli jsme v programu upravit potĹ™ebnĂ© konstanty, +program zkompilovat a znovu nahrát do mikrokontrolĂ©ru. Hodilo by se nám proto, aby +bylo moĹľnĂ© tyto konstanty mÄ›nit pĹ™Ămo za bÄ›hu programu bez nutnosti jej upravovat +a znovu nahrávat. +PotĹ™ebujeme tedy, aby program nÄ›jakĂ˝m zpĹŻsobem zjistil, Ĺľe jsme se rozhodli nÄ›kterou +konstantu zmÄ›nit, a zmÄ›nil jĂ sám. +K tomuto účelu mĹŻĹľeme pouĹľĂt tlaÄŤĂtka. Jakmile program zjistĂ, Ĺľe jsme stiskli +tlaÄŤĂtko, zmÄ›nĂ konstantu, a pokraÄŤuje dál. +NynĂ tedy potĹ™ebujeme v programu nÄ›jakĂ˝m zpĹŻsobem zjistit, Ĺľe je stisknutĂ© tlaÄŤĂtko. +*/ + +/* +Náš pĹ™Ăpravek ATmega8_LED_start_2 má 3 tlaÄŤĂtka. Jedno je pouĹľito jako reset (resetuje +mikrokontrolĂ©r) a dvÄ› jsou volná pro všeobecnĂ© pouĹľitĂ. Tato dvÄ› tlaÄŤĂtka jsou +pĹ™ipojena k pinĹŻm PD2 a PD3\. +ZkusĂme pomocĂ jednoho tlaÄŤĂtka (tĹ™eba PD2) prodluĹľovat hada z minulĂ©ho pĹ™Ăkladu +Budeme tedy potĹ™ebovat nastavit port PD2 jako VSTUP a nÄ›jakĂ˝m zpĹŻsobem pak zjistit, +jaká je jeho hodnota. NastavenĂ PD2 jako vstup, by se provedlo pomocĂ registru DDRD +(registr DDR portu D) tak, Ĺľe by se na pĹ™ĂslušnĂ© mĂsto (2\. bit) zapsala "0". ProtoĹľe +však po resetu mikrokontrolĂ©ru jsou všechny I/O porty nastaveny na "0" - tedy vstup, +nemusĂme nic nastavovat. +Otázkou tedy pouze je, jak z portu ÄŤĂst. K tomuto účelu jsou v mikrokontrolĂ©ru +registry PIN. Registr PIN se podobnÄ› jako registry PORT a DDR oznaÄŤuje pĂsmenem portu +(PINA, PINB, PINC...). ProtoĹľe tlaÄŤĂtko je pĹ™ipojeno k portu "D", budeme potĹ™ebovat +PIND. PIND je stejnÄ› jako ostatnĂ registry osmibitovĂ˝ (obsahuje 8 jedniÄŤek a nul). +BÄ›hem chodu programu se do tohoto registru automaticky ukládá hodnota všech noĹľiÄŤek +danĂ©ho portu. +Pokud je na noĹľiÄŤce napÄ›tĂ 0 - 0,8 V, objevĂ se v registru PIN na pĹ™ĂslušnĂ©m mĂstÄ› "0". +Pokud však je k noĹľiÄŤce pĹ™ipojeno napÄ›tĂ mezi 2 a 5 V, je pĹ™ĂslušnĂ˝ bit registru PIN +nastaven na "1". +TlaÄŤĂtka jsou na našem "ATmega8_LED_start_2" zapojeny tak, Ĺľe pokud nenĂ tlaÄŤĂtko +stisknuto, je na pĹ™Ăslušnou noĹľiÄŤku mikrokontrolĂ©ru pĹ™ivedeno 5 V.Pokud je tlaÄŤĂtko +stisknuto, je na noĹľiÄŤce 0 V. +KdyĹľ tedy chceme zjistit, zda je stisknuto tlaÄŤĂtko PD2, musĂme se podĂvat do registru +PIND, zda je tĹ™etĂ bit vynulován (3 bit proto, Ĺľe se noĹľiÄŤky i bity poÄŤĂtajĂ od "0" +- 0, 1, 2, (tĹ™etĂ pozice)). +Abychom zjistili stav jednoho bitu z celĂ©ho registru, musĂme si jej takzvanÄ› +"vymaskovat". Vymaskovat znamená, Ĺľe provedeme nÄ›jakou poÄŤetnĂ operaci, která nám +odstranĂ ostatnĂ (nepotĹ™ebnĂ©) bity. ZĹŻstane nám tak osmibitovĂ© ÄŤĂslo, kde budou +všechny bity "0" jen náš poĹľadovanĂ˝ bit zĹŻstane nezmÄ›nÄ›n ("0" nebo "1"). NynĂ mĹŻĹľeme +zjistit, zda je tento registr vÄ›tšà neĹľ "0" (bit byl "1"), nebo ne (bit byl "0"). +VymaskovánĂ se dá provĂ©st pomocĂ logickĂ©ho souÄŤinu (&). LogickĂ˝ souÄŤin porovná dvÄ› +promÄ›nnĂ© tak, Ĺľe postupnÄ› porovnává bity kterĂ© ležà na stejnĂ˝ch mĂstech a do vĂ˝sledku +zapisuje "1" pouze tehdy, pokud byly jedniÄŤky na tomto mĂstÄ› v obou promÄ›nnĂ˝ch. +NapĹ™Ăklad: + +promÄ›nná1: 10001101 (dekadicky: 141) +promÄ›nná2: 01101011 (dekadicky: 107) +VĂ˝sledek: 00001001 (dekadicky: 9) + +KdyĹľ tedy chceme zjistit jestli je nastaven tĹ™etĂ bit, provedeme to takto: + +promenna: 00110101 (dekadicky: 53) +maska: 00000100 (dekadicky: 4) +vysledek: 00000100 (dekadicky: 4 - je vÄ›tšà neĹľ "0" - bit byl "1") + +Zápis je následujĂcĂ: + +vysledek = promenna & maska + +nebo: + +vysledek = maska & promenna + +NynĂ tedy umĂme zjistit stav napÄ›tĂ na noĹľiÄŤkách mikrokontrolĂ©ru (registr PIN) a +vymaskovat si potĹ™ebnou noĹľiÄŤku (bitovĂ˝ souÄŤin - &). MĹŻĹľeme se tedy pustit do psanĂ +programu: +*/ + +#define F_CPU 1000000UL // 1 MHz (základnĂ frekvence) kvĹŻli delay.h + +#include <avr/io.h> //Knihovna vstupĹŻ a vĂ˝stupĹŻ (PORT, DDR, PIN) +#include <util/delay.h> //Knihovna ÄŤekacĂch funkcĂ + +#define RYCHLOST 5 //PoÄŤet krokĹŻ hada za sekundu + +#define DELKA_MIN 1 //PočáteÄŤnĂ dĂ©lka hada (poÄŤet ledek) +#define DELKA_MAX 10 //KoneÄŤná dĂ©lka hada (kam aĹľ se mĹŻĹľe prodlouĹľit) + +int main (void) +{ +unsigned char delka; //nadefinujeme si promÄ›nnou pro dĂ©lku hada (bude se mÄ›nit) +delka=DELKA_MIN; //nastavĂme dĂ©lku hada na minimálnĂ hodnotu + +DDRB = 0xff; //všechny piny na portu "B" budou vĂ˝stupnĂ +//DDRD = 0 nastavovat nemusĂme - je nastaveno implicitnÄ› po resetu + +for(;;) + { //hlavnĂ smyÄŤka + + for(unsigned char n=0;n<(8+delka);n++) //NadefinovánĂm promÄ›nnĂ© "n" pĹ™Ămo v + //cyklu zajistĂme, Ĺľe mimo cyklus tato + //promÄ›nná neexistuje a tudĂĹľ nezabĂrá + //mĂsto v pamÄ›ti. + { + if (n<delka) //pokud jsme rozsvĂtili mĂ©nÄ› ledek neĹľ je dĂ©lka hada + { + PORTB <<=1; //pĹ™idáme ÄŤlánek hada (bity se posunou doleva a + //vpravo se doplnĂ "0" + + PORTB ++; //pĹ™iÄŤteme "1" (nastavĂme nultĂ˝ bit na "1") + } + else //pokud nenĂ poÄŤet opakovánĂ menšà neĹľ dĂ©lka hada + { //to znamená, Ĺľe hada uĹľ jsme nakreslili.. + + PORTB <<=1; //pouze posuneme bity (hada) doleva a doplnĂ se nula... + } + + _delay_ms (1000/RYCHLOST); //ÄŚekánĂ (1000 ms = 1 sekunda) + + //V tuto chmĂli probÄ›hlo vykreslenĂ jednoho kroku hada a probÄ›hlo ÄŤekánĂ. + //NeĹľ ale program necháme skoÄŤit na začátek, a nakreslit dalšà krok hada + //zkusĂme se podĂvat, jestli nÄ›kdo zrovna teÄŹ nemaÄŤká tlaÄŤĂtko: + if (PIND&0b00000100) //pokud je 3\. bit nastaven na "1" + { //(tlaÄŤĂtko nenĂ stisknutĂ©) + ; //nic nedÄ›lej a jdi dál (; = prázdnĂ˝ pĹ™Ăkaz) + } + else //pokud nenĂ 3\. bit nastaven na "1" (nÄ›kdo držà tlaÄŤĂtko) + { + delka++; //prodlouĹľĂme hada o 1 + + //TeÄŹ by se ale mohlo stát, Ĺľe jsme uĹľ hada prodlouĹľili pĹ™ĂliĹľ. + //MusĂme tedy zjistit, jestli uĹľ had nenĂ delšà neĹľ DELKA_MAX + if(delka>DELKA_MAX) //Pokud je tedy dĂ©lka vÄ›tšà neĹľ maximum, kterĂ© + { //jsme si na začátku programu nastavili... + delka=DELKA_MIN; //...zkrátĂme hada na minimum a mĹŻĹľeme zase + } //prodluĹľovat. + } + } //...a znovu na začátek smyÄŤky + + } //hlavnĂ smyÄŤka... +} //konec funkce main + +/* +Tento program by mÄ›l po nahránĂ do mikrokontrolĂ©ru vytvoĹ™it "svÄ›telnĂ©ho hada", +o dĂ©lce definovanĂ© konstantou DELKA_MIN. Had se bude pohybovat rychlostĂ udanou +konstantou RYCHLOST. Po stisku tlaÄŤĂtka se had přÚtĂ kolo objevĂ o jeden ÄŤlánek +delšĂ. +*/ + +//Pro radioklub OK1KVK naspal Vašek Král + +``` \ No newline at end of file -- GitLab