From 3b569e4ed5e07c6858ddee7b118573cbf5b6ee46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Sko=C5=99epa?= <jakub@skorepa.info> Date: Thu, 25 Feb 2016 18:20:50 +0100 Subject: [PATCH] =?UTF-8?q?Vylep=C5=A1en=C3=AD=20vzhledu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- articles/2011/avr-led-panel-6-program.md | 264 +++++++++----------- articles/2015/10w-mono-zesilovac-tda2003.md | 2 +- 2 files changed, 115 insertions(+), 151 deletions(-) diff --git a/articles/2011/avr-led-panel-6-program.md b/articles/2011/avr-led-panel-6-program.md index f3a8017..c2aec09 100644 --- a/articles/2011/avr-led-panel-6-program.md +++ b/articles/2011/avr-led-panel-6-program.md @@ -1,34 +1,23 @@ +++ title = "AVR - LED panel - #6 Program" -perex_e = " - -KompatibilnĂ zapojenĂ: LED panel s ATmega8 - -Ke staĹľenĂ: LED_006.c == LED_006.pdf == LED_006.htm -. -. -" +perex_e = "Dalšà pokraÄŤovánĂ sĂ©rie o programovánĂ. Tentokrát se podĂváme na pĹ™erušenĂ, funkce a dalšĂ. Nakonec bude ukázka programu." tags = ["ÄŚlánek"] +lang = "c" +[author] +name = "Vašek Král" +++ - - -KompatibilnĂ zapojenĂ: LED panel s ATmega8 - -Ke staĹľenĂ: LED_006.c == LED_006.pdf == LED_006.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> +KompatibilnĂ zapojenĂ: LED panel s ATmega8 + + +* * * -``` -/* V minulĂ©m programu jsme si ukázali, jak pomocĂ tlaÄŤĂtka ovlivĹovat bÄ›h programu. Tento program však mÄ›l jeden velkĂ˝ nedostatek. KdyĹľ jsme totiĹľ pomocĂ konstanty -"RYCHLOST" zvýšili rychlost bÄ›hu hada, zvýšila se zároveĹ i rychlost, kterou program +`RYCHLOST` zvýšili rychlost bÄ›hu hada, zvýšila se zároveĹ i rychlost, kterou program "ÄŤetl" zda je stisknutĂ© tlaÄŤĂtko. Pokud jsme tedy nastavili rychlost kupĹ™Ăkladu na 20 krokĹŻ za sekundu, tak program takĂ© 20x za jednu vteĹ™inu zjišťoval, jestli nÄ›kdo nedržà stisknutĂ© tlaÄŤĂtko. Pak se stalo, Ĺľe bÄ›hem jednoho stisku tlaÄŤĂtka @@ -45,9 +34,7 @@ potĹ™ebnĂ©, se program opÄ›t vrátĂ k rozdÄ›lanĂ© práci a pokraÄŤuje v normál Pro nás to znamená, Ĺľe náš program mĹŻĹľe bĂ˝t kdykoli v jakĂ©mkoli mĂstÄ› pĹ™erušen. Z tohoto dĹŻvodu je potĹ™eba obsluhu pĹ™erušenĂ (to co má program vykonat, kdyĹľ jej ÄŤasovaÄŤ pĹ™erušĂ) psát co nejkratšĂ, aby co nejmĂ©nÄ› ovlivĹovala bÄ›h hlavnĂho programu. -*/ -/* MikrokontrolĂ©r ATmega8 má zabudovanĂ© dva osmibitovĂ© a jeden šestnáctibitovĂ˝ ÄŤĂtaÄŤ/ÄŤasovaÄŤ. ÄŚĂtaÄŤe/ÄŤasovaÄŤe se nazĂ˝vajĂ proto, Ĺľe se dajĂ pouĹľĂt nejen k pĹ™esnĂ©mu ÄŤasovánĂ programu, ale takĂ© mohou slouĹľit jako ÄŤĂtaÄŤ vnÄ›jšĂch impulzĹŻ. @@ -58,10 +45,10 @@ VlastnÄ› funguje jako ÄŤĂtaÄŤ hodinovĂ©ho signálu (poÄŤĂtá pulzy). NejdĹŻle vynuluje se, a poÄŤĂtá zase od začátku. MaximálnĂ hodnota, ke kterĂ© mĹŻĹľe ÄŤĂtaÄŤ dojĂt, je dána velikostĂ jeho registru. Pro osmibitovĂ˝ ÄŤĂtaÄŤ je to ÄŤĂslo 255 a pro 16\. bitovĂ˝ je to ÄŤĂslo 65535\. -Toto ÄŤĂslo se nacházĂ v registru TCNT. Podle ÄŤĂsla pouĹľitĂ©ho ÄŤasovaÄŤe se pak mÄ›nĂ -koncovka jeho názvu - TCNT0 = ÄŤasovaÄŤ 0, TCNT1 = ÄŤasovaÄŤ 1 a TCNT2 je ÄŤasovaÄŤ 2. +Toto ÄŤĂslo se nacházĂ v registru `TCNT`. Podle ÄŤĂsla pouĹľitĂ©ho ÄŤasovaÄŤe se pak mÄ›nĂ +koncovka jeho názvu - `TCNT0` = ÄŤasovaÄŤ 0, `TCNT1` = ÄŤasovaÄŤ 1 a `TCNT2` je ÄŤasovaÄŤ 2. Pokud tedy chceme nastavit ÄŤas, za jakĂ˝ nám registr ÄŤasovaÄŤe pĹ™eteÄŤe a vyvolá -pĹ™erušenĂ, staÄŤĂ pouze do registru TCNT zapsat nÄ›jakĂ© ÄŤĂslo. ÄŚasovaÄŤ pak nepoÄŤĂtá od +pĹ™erušenĂ, staÄŤĂ pouze do registru `TCNT` zapsat nÄ›jakĂ© ÄŤĂslo. ÄŚasovaÄŤ pak nepoÄŤĂtá od nuly, ale od tohoto ÄŤĂsla, a pĹ™eteÄŤe tedy dĹ™Ăv. Jako zdroj hodinovĂ©ho signálu vÄ›tšinou sloužà vlastnĂ hodinovĂ˝ signál procesoru. ProtoĹľe však hodinovĂ˝ signál procesoru kmitá miliĂłnkrát za vteĹ™inu (1 MHz), @@ -71,153 +58,134 @@ PĹ™eddÄ›liÄŤka je zaĹ™azená mezi zdrojem hodinovĂ©ho signálu a samotnĂ˝m ÄŤaso Jak jiĹľ jejĂ název napovĂdá, pĹ™eddÄ›liÄŤka sloužà k tomu, aby hodinovĂ˝ signál pro ÄŤasovaÄŤ vydÄ›lila nÄ›jakĂ˝m ÄŤĂslem. Funguje to tak, Ĺľe napĹ™Ăklad pĹ™eddÄ›liÄŤka osmi propustĂ kaĹľdĂ˝ osmĂ˝ impulz, pĹ™eddÄ›liÄŤka 64 propustĂ kaĹľdĂ˝ 64\. impulz, atd. -K Ĺ™ĂzenĂ ÄŤasovaÄŤe a pĹ™eddÄ›liÄŤky se pouĹľĂvá registr TCCR (opÄ›t na konci opatĹ™en +K Ĺ™ĂzenĂ ÄŤasovaÄŤe a pĹ™eddÄ›liÄŤky se pouĹľĂvá registr `TCCR` (opÄ›t na konci opatĹ™en ÄŤĂslem ÄŤasovaÄŤe). PodĂvejme se nynĂ, jak se nastavuje napĹ™Ăklad ÄŤasovaÄŤ 0: -*/ -/* -TCCR0 = 0 - ÄŤĂtaÄŤ je vypnut -TCCR0 = 1 - ÄŤĂtaÄŤ je zapnut, a pracuje pĹ™Ămo s hodinovĂ˝m signálem (bez pĹ™eddÄ›liÄŤky) -TCCR0 = 2 - ÄŤĂtaÄŤ je zapnut s pĹ™eddÄ›liÄŤkou osmi (hodinovĂ˝ signál/8) -TCCR0 = 3 - ÄŤĂtaÄŤ je zapnut s pĹ™eddÄ›liÄŤkou 64 -TCCR0 = 4 - ÄŤĂtaÄŤ je zapnut s pĹ™eddÄ›liÄŤkou 256 -TCCR0 = 5 - ÄŤĂtaÄŤ je zapnut s pĹ™eddÄ›liÄŤkou 1024 -*/ -/* -NynĂ tedy umĂme zapnout ÄŤasovaÄŤ a nastavit mu pĹ™eddÄ›liÄŤku (TCCR). Dokážeme takĂ© + + TCCR0 = 0 - ÄŤĂtaÄŤ je vypnut + TCCR0 = 1 - ÄŤĂtaÄŤ je zapnut, a pracuje pĹ™Ămo s hodinovĂ˝m signálem (bez pĹ™eddÄ›liÄŤky) + TCCR0 = 2 - ÄŤĂtaÄŤ je zapnut s pĹ™eddÄ›liÄŤkou osmi (hodinovĂ˝ signál/8) + TCCR0 = 3 - ÄŤĂtaÄŤ je zapnut s pĹ™eddÄ›liÄŤkou 64 + TCCR0 = 4 - ÄŤĂtaÄŤ je zapnut s pĹ™eddÄ›liÄŤkou 256 + TCCR0 = 5 - ÄŤĂtaÄŤ je zapnut s pĹ™eddÄ›liÄŤkou 1024 + +NynĂ tedy umĂme zapnout ÄŤasovaÄŤ a nastavit mu pĹ™eddÄ›liÄŤku `TCCR`. Dokážeme takĂ© jemnÄ› nastavit ÄŤas, za kterĂ˝ nám ÄŤasovaÄŤ pĹ™eteÄŤe. To dÄ›láme pomocĂ registru ÄŤasovaÄŤe -(TCNT), do kterĂ©ho nahrajeme hodnotu, od kterĂ© má zaÄŤĂt poÄŤĂtat. +`TCNT`, do kterĂ©ho nahrajeme hodnotu, od kterĂ© má zaÄŤĂt poÄŤĂtat. JedinĂ© co tedy potĹ™ebujeme ještÄ› udÄ›lat, je povolit pĹ™erušenĂ od ÄŤasovaÄŤe. MusĂme vlastnÄ› procesoru Ĺ™Ăct, aby toto pĹ™erušenĂ akceptoval. ImplicitnÄ› je totiĹľ mikrokontrolĂ©r nastaven tak, Ĺľe všechna pĹ™erušenĂ (kromÄ› resetu) ignoruje. Atmega8 má totiĹľ 19 rĹŻznĂ˝ch moĹľnĂ˝ch zdrojĹŻ pĹ™erušenĂ jako: reset, ÄŤĂtaÄŤe, vnÄ›jšà pĹ™erušenĂ, A/D pĹ™evodnĂk, sĂ©riovĂ© kanály a dalšĂ. Všechna tato zaĹ™ĂzenĂ mohou vyvolat pĹ™erušenĂ. -K povolovánĂ nebo zakazovánĂ pĹ™erušenĂ od ÄŤasovaÄŤĹŻ sloužà registr TIMSK. -NastavenĂm nÄ›kterĂ˝ch bitĹŻ v registru TIMSK na "1" lze povolit pĹ™erušenĂ od +K povolovánĂ nebo zakazovánĂ pĹ™erušenĂ od ÄŤasovaÄŤĹŻ sloužà registr `TIMSK`. +NastavenĂm nÄ›kterĂ˝ch bitĹŻ v registru `TIMSK` na "1" lze povolit pĹ™erušenĂ od jednotlivĂ˝ch ÄŤasovaÄŤĹŻ: -*/ -/* -bit TIMSK: ÄŤasovaÄŤ: vektor: - 0 ÄŤasovaÄŤ 0 ISR(TIMER0_OVF_vect) - 2 ÄŤasovaÄŤ 1 ISR(TIMER1_OVF_vect) - 6 ÄŤasovaÄŤ 2 ISR(TIMER2_OVF_vect) - -Nakonec je ještÄ› potĹ™eba nastavit 7\. bit registru SREG. Tento bit sloužà ke globálnĂmu + +| bit TIMSK | ÄŤasovaÄŤ | vektor | +|-----------|-----------|----------------------| +| 0 | ÄŤasovaÄŤ 0 | ISR(TIMER0_OVF_vect) | +| 2 | ÄŤasovaÄŤ 1 | ISR(TIMER1_OVF_vect) | +| 6 | ÄŤasovaÄŤ 2 | ISR(TIMER2_OVF_vect) | + +Nakonec je ještÄ› potĹ™eba nastavit 7\. bit registru `SREG`. Tento bit sloužà ke globálnĂmu povolenĂ nebo zakázánĂ všech pĹ™erušenĂ najednou. -*/ -/* + Vektor je mĂsto, kam program pĹ™eskoÄŤĂ, kdyĹľ je aktivováno pĹ™erušenĂ. Zápis je následujĂcĂ: -ISR(TIMER0_OVF_vect) - { - pĹ™Ăkazy obsluhy pĹ™erušenĂ; - } + ISR(TIMER0_OVF_vect) + { + pĹ™Ăkazy obsluhy pĹ™erušenĂ; + } Po provedenĂ pĹ™ĂkazĹŻ obsluhy pĹ™erušenĂ se program vrátĂ zpÄ›t na mĂsto, odkud byl pĹ™erušen, a pokraÄŤuje v normálnĂ ÄŤinnosti. -*/ -/* + NynĂ bychom se tedy mohli pustit do psanĂ programu, ale jak jiĹľ bylo minule patrnĂ©, ÄŤĂm delšà program pĂšeme, tĂm je mĂ©nÄ› pĹ™ehlednĂ˝.Proto je lĂ©pe si jej rozloĹľit na jednotlivĂ© dĂlÄŤĂ problĂ©my, a ty pak zapsat pomocĂ funkcĂ. NapĹ™Ăklad program: -*/ -/* -... -PORTB = 0xff; //nastav všechny bity portu "B" na "1" -waitms(5); //poÄŤkej 5 milisekund - -PORTD = 0b00000001; //nastav nultĂ˝ bit portu "D" na "1" -waitms(2); //poÄŤkej 2 milisekundy -PORTD = 0b00000010; //nastav prvnĂ bit portu "D" na "1" - -PORTB = 0x00; //nastav všechny bity portu "B" na "0" -waitms(5); //poÄŤkej 5 milisekund -... -*/ -/* + + ... + PORTB = 0xff; //nastav všechny bity portu "B" na "1" + waitms(5); //poÄŤkej 5 milisekund + + PORTD = 0b00000001; //nastav nultĂ˝ bit portu "D" na "1" + waitms(2); //poÄŤkej 2 milisekundy + PORTD = 0b00000010; //nastav prvnĂ bit portu "D" na "1" + + PORTB = 0x00; //nastav všechny bity portu "B" na "0" + waitms(5); //poÄŤkej 5 milisekund + ... + Tento program by šel pĹ™epsat jednodušeji a pĹ™ehlednÄ›ji takto: -*/ -/* -... -zapni_portb(); //nastav všechny bity portu "B" na "1" a poÄŤkej 5 milisekund -prepni_portd(); //pĹ™epni prvnĂ a druhĂ˝ bit portu "D" s prodlevou 2 milisekundy -vypni_portb(); //nastav všechny bity portu "B" na "0" a poÄŤkej 5 milisekund -... -*/ -/* + + ... + zapni_portb(); //nastav všechny bity portu "B" na "1" a poÄŤkej 5 milisekund + prepni_portd(); //pĹ™epni prvnĂ a druhĂ˝ bit portu "D" s prodlevou 2 milisekundy + vypni_portb(); //nastav všechny bity portu "B" na "0" a poÄŤkej 5 milisekund + ... + Program je nynĂ jednoduššĂ. Ĺada pĹ™ĂkazĹŻ byla nahrazena jednoduchĂ˝mi funkcemi. Aby však program mohl fungovat, musĂme tyto funkce nadefinovat. Definice funkce se provádĂ tak, Ĺľe napĂšeme hlaviÄŤku funkce (jmĂ©no funkce a typy hodnot, kterĂ© funkce pĹ™ijĂmá, popĹ™ĂpadÄ› vracĂ. Definice funkce vypadá takto: -typ_navratove_hodnoty nazev_funkce (definice promÄ›nnĂ˝ch, kterĂ© funkce pĹ™ijĂmá) -{ -tÄ›lo funkce -} + typ_navratove_hodnoty nazev_funkce (definice promÄ›nnĂ˝ch, kterĂ© funkce pĹ™ijĂmá) + { + tÄ›lo funkce + } ProtoĹľe nynĂ pro náš pĹ™Ăklad nepotĹ™ebujeme pĹ™edávat žádnĂ© parametry, napĂšeme mĂsto návratovĂ© hodnoty a pĹ™ijĂmanĂ˝ch hodnot slovo "void". Definice našich novĂ˝ch funkcĂ je tedy následujĂcĂ: -*/ -/* -void zapni_portb(void) //hlaviÄŤka funkce "zapni_portb" - { //začátek tÄ›la funkce - PORTB = 0xff; //nastav všechny bity portu "B" na "1" - waitms(5); //poÄŤkej 5 milisekund - } //konec tÄ›la funkce -*/ -/* -NynĂ máme nadefinovanou funkci "zapni_portb". Pokud tedy v hlavnĂm programu -napĂšeme: -zapni_portb(); + void zapni_portb(void) //hlaviÄŤka funkce "zapni_portb" + { //začátek tÄ›la funkce + PORTB = 0xff; //nastav všechny bity portu "B" na "1" + waitms(5); //poÄŤkej 5 milisekund + } //konec tÄ›la funkce -//spustĂ se tato funkce, a provede pĹ™Ăkazy ve svĂ©m tÄ›le: +NynĂ máme nadefinovanou funkci "zapni_portb". Pokud tedy v hlavnĂm programu +napĂšeme `zapni_portb()` spustĂ se tato funkce, a provede pĹ™Ăkazy ve svĂ©m tÄ›le: -PORTB = 0xff; //nastav všechny bity portu "B" na "1" -waitms(5); //poÄŤkej 5 milisekund + PORTB = 0xff; //nastav všechny bity portu "B" na "1" + waitms(5); //poÄŤkej 5 milisekund -//po provedenĂ tÄ›chto pĹ™ĂkazĹŻ se program vrátĂ zpÄ›t a pokraÄŤuje dalšĂm pĹ™Ăkazem, -//tedy: +po provedenĂ tÄ›chto pĹ™ĂkazĹŻ se program vrátĂ zpÄ›t a pokraÄŤuje dalšĂm pĹ™Ăkazem, +tedy `prepni_portd()` -prepni_portd() +Tuto funkci zatĂm ale nemáme definovanou. JejĂ definice by vypadala takto: + + void prepni_portd(void) //hlaviÄŤka + { + PORTD = 0b00000001; //nastav nultĂ˝ bit portu "D" na "1" + waitms(2); //poÄŤkej 2 milisekundy + PORTD = 0b00000010; //nastav prvnĂ bit portu "D" na "1" + } -//Tuto funkci zatĂm ale nemáme definovanou. JejĂ definice by vypadala takto: -*/ -/* -void prepni_portd(void) //hlaviÄŤka - { - PORTD = 0b00000001; //nastav nultĂ˝ bit portu "D" na "1" - waitms(2); //poÄŤkej 2 milisekundy - PORTD = 0b00000010; //nastav prvnĂ bit portu "D" na "1" - } -*/ -/* PodobnĂ˝m zpĹŻsobem by se nadefinovala i funkce "vypni_portb". Tento program by se pak choval stejnÄ›, jako pĹŻvodnĂ program bez funkcĂ. -*/ -/* + NynĂ se podĂváme na to, jak by se zapisovala funkce, která pĹ™ebĂrá a pĹ™edává parametry: MÄ›jme promÄ›nnĂ© "cislo1", "cislo2" a "vysledek": -unsigned char cislo1, cislo2, vysledek; + unsigned char cislo1, cislo2, vysledek; NynĂ si pĹ™edstavme, Ĺľe v programu budeme potĹ™ebovat vykonat tuto operaci: -vysledek = (cislo1 + cislo2) * cislo1; //do promÄ›nnĂ© "vysledek" se uložà souÄŤet + vysledek = (cislo1 + cislo2) * cislo1; //do promÄ›nnĂ© "vysledek" se uložà souÄŤet //promÄ›nnĂ˝ch "cislo1" a "cislo2" vynásobenĂ˝ //promÄ›nnou "cislo1" Tuto operaci mĹŻĹľeme nahradit funkcĂ: -vysledek = funkce_vypocet(); + vysledek = funkce_vypocet(); ProtoĹľe však potĹ™ebujeme, aby tato funkce poÄŤĂtala s nÄ›jakĂ˝mi promÄ›nnĂ˝mi ("cislo1" a "cislo2") musĂme jĂ tyto promÄ›nnĂ© pĹ™edat jako parametry: -vysledek = funkce_vypocet(cislo1, cislo2); + vysledek = funkce_vypocet(cislo1, cislo2); Tento pĹ™Ăkaz by se nynĂ vykonal následovnÄ›: Program zjistĂ, Ĺľe má nÄ›co pĹ™iĹ™adit do promÄ›nnĂ© "vysledek" jde tedy do prava, a @@ -226,39 +194,37 @@ a pĹ™eskoÄŤĂ do funkce "funkce_vypocet()". TĂ©to funkci pĹ™edá oba parametry a vykoná. Na konci funkce obdržà jedno ÄŤĂslo (návratovou hodnotu). Tuto hodnotu si zapamatuje, a skoÄŤĂ zpátky k našemu pĹ™Ăkazu: -vysledek = funkce_vypocet(cislo1, cislo2); + vysledek = funkce_vypocet(cislo1, cislo2); NynĂ jiĹľ má ale funkci vypoÄŤtenou, a má v pamÄ›ti uloĹľenou jejĂ návratovou hodnotu. NahradĂ tedy pĹŻvodnĂ zápis: "funkce_vypocet(cislo1, cislo2)" pouze návratovou hodnotou a vznikne: -vysledek = navratova_hodnota; + vysledek = navratova_hodnota; Tento pĹ™Ăkaz pak vyĹ™ešà jako prostĂ© pĹ™iĹ™azenĂ - zapĂše do promÄ›nnĂ© "vysledek" návratovou hodnotu funkce. TakĹľe pĹ™Ăkaz: -vysledek = funkce_vypocet(cislo1, cislo2); + vysledek = funkce_vypocet(cislo1, cislo2); se vykoná stejnÄ› jako pĹ™Ăkaz: -vysledek = (cislo1 + cislo2) * cislo1; -*/ -/* + vysledek = (cislo1 + cislo2) * cislo1; + NynĂ si ale musĂme našà funkci ještÄ› nadefinovat: NapĂšeme zase hlaviÄŤku funkce, a blok pĹ™ĂkazĹŻ do tÄ›la funkce: -char funkce_vypocet(char vstup1, char vstup2); - { - char vystup; //nadefinujeme si vĂ˝stupnĂ promÄ›nnou (sem budeme ukládat vĂ˝sledek) + char funkce_vypocet(char vstup1, char vstup2); + { + char vystup; //nadefinujeme si vĂ˝stupnĂ promÄ›nnou (sem budeme ukládat vĂ˝sledek) - vystup = (vstup1 + vstup2) * vstup1; //do promÄ›nnĂ© "vystup" vypoÄŤteme operaci + vystup = (vstup1 + vstup2) * vstup1; //do promÄ›nnĂ© "vystup" vypoÄŤteme operaci + + return vystup; //a Ĺ™ekneme, Ĺľe se má jako návratová hodnota pouĹľĂt hodnota + //promÄ›nnĂ© "vystup" + } - return vystup; //a Ĺ™ekneme, Ĺľe se má jako návratová hodnota pouĹľĂt hodnota - //promÄ›nnĂ© "vystup" - } -*/ -/* NynĂ si rozebereme hlaviÄŤku funkce: Slovo "char" pĹ™ed názvem funkce Ĺ™Ăká, jakĂ©ho typu bude návratová hodnota (kolik mĂsta zabere v pamÄ›ti - char = 8 bitĹŻ) Pak následuje název funkce "funkce_vypocet" @@ -266,29 +232,27 @@ mĂsta zabere v pamÄ›ti - char = 8 bitĹŻ) Pak následuje název funkce "funkce_v závorkách parametry funkce. Zápis: -char funkce_vypocet(char vstup1, char vstup2); + char funkce_vypocet(char vstup1, char vstup2); Ĺ™Ăká, Ĺľe funkce oÄŤekává 2 parametry typu char a vracĂ ÄŤĂslo typu char. TÄ›lo funkce je vytvoĹ™eno stejnÄ›, jako tomu bylo v minulĂ˝ch pĹ™Ăpadech. Jedinou novinkou je pĹ™Ăkaz "return", za kterĂ˝ se napĂše, co má funkce vrátit. Tento pĹ™Ăkaz zároveĹ funkci ukonÄŤuje. -*/ -/* + NynĂ uĹľ tedy vĂme, jak pouĹľĂvat ÄŤasovaÄŤ a jak rozepsat program do jednotlivĂ˝ch funkcĂ. JeštÄ› by se hodila jedna poznámka, a to Ĺľe kaĹľdá funkce musĂ bĂ˝t pĹ™ed svĂ˝m pouĹľitĂm definovaná. V opaÄŤnĂ©m pĹ™ĂpadÄ› hlásĂ pĹ™ekladaÄŤ chybu, Ĺľe tuto funkci nezná. ProzatĂm to tedy vyĹ™ešĂme tak, Ĺľe všechny funkce budeme definovat ještÄ› pĹ™ed hlavnĂ funkcĂ ("main"). Funkce main (ve kterĂ© budeme naše nadefinovanĂ© funkce pouĹľĂvat) bude tedy nadefinovaná aĹľ jako poslednĂ (na konci zdrojovĂ©ho kĂłdu). -*/ -/* + MĹŻĹľeme se tedy pustit do psanĂ programu. Náš program by mÄ›l umÄ›t blikat ledkami v rĹŻznĂ˝ch reĹľimech a rychlostech. ReĹľimy blikánĂ by mohly bĂ˝t: - jednoduchĂ© blikánĂ (svĂtĂ nesvĂtĂ) - stroboskopickĂ© blikánĂ (rozsvĂcenĂ ledek na velmi krátkou dobu) - maják (ledky dvakrát rychle po sobÄ› krátce bliknou) - běžĂcĂ svÄ›tlo (nÄ›co podobnĂ©ho, jako mÄ›l KIT - svÄ›tlo bÄ›há zleva - doprava a zprava doleva) +doprava a zprava doleva) - had (náš starĂ˝ známĂ˝) Program by se mÄ›l ovládat pomocĂ 2 tlaÄŤĂtek (PD2 a PD3), pĹ™iÄŤemĹľ jednĂm tlaÄŤĂtkem by @@ -299,9 +263,10 @@ poĹľadovanou funkci. Funkce pak provede jeden krok (posunutĂ hada, bliknutĂ, a a skonÄŤĂ. ÄŚekánĂ mezi jednotlivĂ˝mi kroky bude zajišťovat hlavnĂ smyÄŤka. MezitĂm se bude pomocĂ ÄŤasovaÄŤe0 provádÄ›t testovánĂ klávesnice, a pĹ™ĂpadnĂ© nastavovánĂ promÄ›nnĂ˝ch "rychlost" a "rezim". -*/ -//Náš program by tedy mohl vypadat takto: +Náš program by tedy mohl vypadat takto: + +``` #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) @@ -320,7 +285,7 @@ promÄ›nnĂ˝ch "rychlost" a "rezim". #define STROBO_CAS 10 //(ms) - UrÄŤuje, kolik milisekund budou svĂtit ledky pĹ™i //strobo efektu. VyuĹľĂvá se i v reĹľimu "maják". -#define MAJAK 50 //definuje, kolik milisekund je mezi dvojicĂ bliknutĂ ve funkci +#define MAJAK 50 //definuje, kolik milisekund je mezi dvojicĂ bliknutĂ ve funkci //maják //VytvoĹ™Ăme si tzv. globálnĂ promÄ›nnĂ© (jsou deklarovanĂ© mimo všechny funkce, @@ -369,8 +334,8 @@ ISR(TIMER0_OVF_vect) if (!(PIND&0b00001000)) //pokud je stisknutĂ© tlaÄŤĂtko 2 (rychlost) { - rychlost*=2; //pĹ™idáme rychlost (2x zrychlĂme je to totĂ©Ĺľ jako: rychlost<<1;) - tlacitko=1; //uloĹľĂme si informaci, Ĺľe bylo stisknuto tlaÄŤĂtko + rychlost*=2; //pĹ™idáme rychlost (2x zrychlĂme je to totĂ©Ĺľ jako: rychlost<<1;) + tlacitko=1; //uloĹľĂme si informaci, Ĺľe bylo stisknuto tlaÄŤĂtko } if (rezim>POCET_REZIMU) //pokud jsme jiĹľ pĹ™ekroÄŤili povolenĂ˝ poÄŤet reĹľimĹŻ... @@ -432,9 +397,9 @@ void majak (void) void semtam (void) { static unsigned char pozice; //statická promÄ›nná - uchovává si hodnotu mezi - //jednotlivĂ˝mi volánĂmi funkce - //nám bude slouĹľit jako ukazatel, kde zrovna je ledka - //1-8 = 1.-8\. ledka. 9-15 = 6.-1\. ledka (jede zpátky) + //jednotlivĂ˝mi volánĂmi funkce + //nám bude slouĹľit jako ukazatel, kde zrovna je ledka + //1-8 = 1.-8\. ledka. 9-15 = 6.-1\. ledka (jede zpátky) if (zmena) //pokud je funkce volána poprvĂ© { PORTB=1; //zhasneme všechny ledky a rozsvĂtĂme pouze jednu (PB0)... @@ -564,5 +529,4 @@ for(;;) //hlavnĂ smyÄŤka } //konec funkce main //Pro radioklub OK1KVK naspal Vašek Král - -``` \ No newline at end of file +``` diff --git a/articles/2015/10w-mono-zesilovac-tda2003.md b/articles/2015/10w-mono-zesilovac-tda2003.md index 67b2e91..7b753e1 100644 --- a/articles/2015/10w-mono-zesilovac-tda2003.md +++ b/articles/2015/10w-mono-zesilovac-tda2003.md @@ -11,7 +11,7 @@ tags = ["ÄŚlánek", "BastlenĂ", "Konstrukce", "ZesilovaÄŤe"] Asi kaĹľdĂ˝ si nÄ›kdy chtÄ›l postavit vlastnĂ zesilovaÄŤ. V tomto zapojenĂ je vyuĹľit integrovanĂ˝ obvod [TDA2003](http://www.st.com/web/en/resource/technical/document/datasheet/CD00000123.pdf), kterĂ˝ v sobÄ› integruje vÄ›tšinu potĹ™ebnĂ˝ součástĂ zesilovaÄŤe. TDA2003 je jednokanálovĂ˝ zesilovaÄŤ s maximálnĂm vĂ˝stupnĂm vĂ˝konem 10W. Obvod takĂ© obsahuje ochrany proti zkratu mezi piny i proti pĹ™ehřátĂ. ZesilovaÄŤ pracuje v rozmezĂ napájecĂho napÄ›tĂ `8 - 18V`. Pro stereo verzi staÄŤĂ vyrobit dva tyto monobloky a doplnit o regulaci hlasitosti. -Hodnoty `R1X` a `C4X` volte `39R, 39nF`, nebo `47R, 33nF`, nebo `33R, 47nF`. Celková hodnota R3 + R4 by mÄ›la bĂ˝t 2.2R. PlošnĂ˝ spoj byl navrĹľen tak, aby se dobĹ™e vyrábÄ›l i osazoval. Na plošnĂ©m spoji se nacházĂ nÄ›kolik SMD součástek velikosti 0805, kterĂ© by ale nemÄ›l bĂ˝t problĂ©m zapájet. +Hodnoty `R1X` a `C4X` volte `39R, 39nF`, nebo `47R, 33nF`, nebo `33R, 47nF`. Celková hodnota `R3 + R4` by mÄ›la bĂ˝t `2.2R`. PlošnĂ˝ spoj byl navrĹľen tak, aby se dobĹ™e vyrábÄ›l i osazoval. Na plošnĂ©m spoji se nacházĂ nÄ›kolik SMD součástek velikosti 0805, kterĂ© by ale nemÄ›l bĂ˝t problĂ©m zapájet. Po osazenĂ všech součástek doporuÄŤuji peÄŤlivÄ› pĹ™ekontrolovat zkraty, studenĂ© spoje a potĂ© zesilovaÄŤ pĹ™ipojit na zdroj s moĹľnostĂ regulace proudu s nastavenĂ˝m `napÄ›tĂm 12V a proudem do 100mA`. Pokud bude zesilovaÄŤ bezproblĂ©movÄ› fungovat, tak jej lze pĹ™ipojit na stálĂ˝ zdroj. V radioklubu nám tento zesilovaÄŤ bezchybnÄ› pracuje vĂce neĹľ rok a nezaznamenali jsme žádnĂ© potĂĹľe. -- GitLab