diff --git a/articles/2010/digitalni-hodiny-s-atmega8.md b/articles/2010/digitalni-hodiny-s-atmega8.md index 0e5555bb977a5f1f3167de2cbe83a8bcc6fbe736..95786a38c5e695e08edea437a19b52d05e7f723d 100644 --- a/articles/2010/digitalni-hodiny-s-atmega8.md +++ b/articles/2010/digitalni-hodiny-s-atmega8.md @@ -1,38 +1,72 @@ -+++ +``` title = "DigitálnĂ hodiny s ATmega8" -perex_e = "Toto zapojenĂ vyuĹľĂvá k Ĺ™ĂzenĂ hodin mikroprocesor od firmy Atmel - ATmega8. OriginálnĂ realizace na Daqq.eu. CelĂ© zapojenĂ je pomÄ›rnÄ› jednoduchĂ©, ale je tĹ™eba naprogramovat mikroprocesor. ZpĹŻsobĹŻ jak toho ĂşspěšnÄ› dosáhnout je mnoho. Pokud nechce stavÄ›t nÄ›co sloĹľitĂ©ho, jeden jednoduchĂ˝ programátor je zde. My jsme si pak na krouĹľku postavili tento do USB. Všechny součástky jsou vĂ˝vodovĂ© a pod mikroprocesor jsme zatĂm dali radÄ›ji patici pro snažšà manipulaci s mikroprocesorem. -.. -. - -" -tags = ["ÄŚlánek"] -+++ +perex = "ZapojenĂ jednoduchĂ˝ch digitálnĂch hodin s mikroprocesorem ATmega8." +tags = ["ÄŚlánek", "BastlenĂ", "AVR", "Pro začáteÄŤnĂky"] +image = "lead.png" +lang="c" + +``` + -Toto zapojenĂ vyuĹľĂvá k Ĺ™ĂzenĂ hodin mikroprocesor od firmy Atmel - ATmega8. OriginálnĂ realizace na Daqq.eu. CelĂ© zapojenĂ je pomÄ›rnÄ› jednoduchĂ©, ale je tĹ™eba naprogramovat mikroprocesor. ZpĹŻsobĹŻ jak toho ĂşspěšnÄ› dosáhnout je mnoho. Pokud nechce stavÄ›t nÄ›co sloĹľitĂ©ho, jeden jednoduchĂ˝ programátor je zde. My jsme si pak na krouĹľku postavili tento do USB. Všechny součástky jsou vĂ˝vodovĂ© a pod mikroprocesor jsme zatĂm dali radÄ›ji patici pro snažšà manipulaci s mikroprocesorem. -.. -. +Toto zapojenĂ vyuĹľĂvá k Ĺ™ĂzenĂ hodin mikroprocesor od firmy Atmel - ATmega8. OriginálnĂ realizace pocházĂ z [Daqq.eu](http://www.daqq.eu/?p=283). CelĂ© zapojenĂ je pomÄ›rnÄ› jednoduchĂ©, jediná záludnost mĹŻĹľe nastat pĹ™i programovánĂ mikroprocesoru. ZpĹŻsobĹŻ jak toho ĂşspěšnÄ› dosáhnout je mnoho. Pokud nechce stavÄ›t nÄ›co sloĹľitĂ©ho, tak jeden jednoduchĂ˝ programátor je [zde](http://pandatron.cz/?166&avr_programator) nebo si ho mĹŻĹľete za pár korun koupit napĹ™Ăklad [zde](http://aukro.cz/listing/listing.php?string=usbasp&search_scope=). My jsme si pak na krouĹľku postavili [tento](/clanek/2011/usbasp-programator-avr/) do USB. Všechny součástky jsou vĂ˝vodovĂ© a pod mikroprocesor jsme zatĂm dali radÄ›ji patici pro snažšà manipulaci s mikroprocesorem. +Toto zapojenĂ jsme pojali jako motivaÄŤnĂ, postavit si nÄ›co praktickĂ©ho s vyuĹľitĂm mikroprocesoru. CelĂ© hodiny jsou tvoĹ™eny dvÄ›ma [DPS](http://cs.wikipedia.org/wiki/Plo%C5%A1n%C3%BD_spoj), kterĂ© jsou na sebe navzájem kolmĂ©. V mĂstÄ› kontaktu desek jsou sletovány pájecĂ plošky a tĂm je zaruÄŤen pĹ™enost signálĹŻ pro displej. Ihned po zapojenĂ na napájenĂ by se na hodinách mÄ›l objevit ÄŤas 00:00 a ÄŤĂtánĂ ÄŤasu běžà (pokud máte samozĹ™ejmÄ› správnÄ› zapojenĂ a naprogramován mikroprocesor). AktuálnĂ ÄŤas nastavĂte pomocĂ tlaÄŤĂtek SW1 (minuty) a SW2 (hodiny). CelĂ© hodiny je pak moĹľnĂ© zabudovat do krabiÄŤky a lze je napájet 9V bateriĂ nebo lĂ©pe adaptĂ©rem ze sĂtÄ› (spotĹ™eba 100 mA). Displej jsme pouĹľili [CA56-21SRWA](http://www.tme.eu/cz/katalog/artykuly.phtml?search=CA56-21SWRA&idp=1#cleanParameters%3D1%26search%3DCA56-21SRWA%26bf_szukaj%3D+) ([2](http://www.hledejsoucastky.cz/Hledani.aspx?lastsearch=CA56-21SRWA)), na kterĂ© máme i nakreslenĂ˝ plošnĂ˝ spoj. Mikroprocesor je [ATmega8a-PU](http://www.hledejsoucastky.cz/Hledani.aspx?lastsearch=ATMEGA8a-PU) v pouzdru DIL28. + +**Pro správnou funkci hodin je zapotĹ™ebĂ naprogramovat pojistky (fuses).** Pojistkami nastavĂme, aby mikroprocesor bral hodinovĂ˝ signál z externĂho krystalu 14.7456 MHz, jinak by běžěl na standardnĂ frekvenci 1 MHz a nefungovalo by správnÄ› zobrazovánĂ ani poÄŤĂtánĂ ÄŤasu. Naše doporuÄŤenĂ© hodnoty pojistek jsou: `hfuse=C9, lfuse=FF`. + + +# SchĂ©ma +. + +# PlošnĂ˝ spoj + + + + + +# ZdrojovĂ© soubory +**SchĂ©ma:** [eagle](https://git.ok1kvk.cz/krouzek/digitalni-hodiny-s-atmega8/raw/master/HW/digitalni-hodiny.sch), +[PDF](https://git.ok1kvk.cz/krouzek/digitalni-hodiny-s-atmega8/raw/master/schema.pdf) +**PlošnĂ˝ spoj:** [eagle](https://git.ok1kvk.cz/krouzek/digitalni-hodiny-s-atmega8/raw/master/HW/digitalni-hodiny.brd), [PDF 1:1](https://git.ok1kvk.cz/krouzek/digitalni-hodiny-s-atmega8/raw/master/plosny-spoj.pdf) +**OsazovacĂ plán:** [PDF](https://git.ok1kvk.cz/krouzek/digitalni-hodiny-s-atmega8/raw/master/osazovaci-plan.pdf) + +**CelĂ˝ projekt:** [ZIP](https://git.ok1kvk.cz/krouzek/digitalni-hodiny-s-atmega8/repository/archive.zip?ref=master) + +**Projekt na GitLabu** [digitalni-hodiny-s-atmega8.git](https://git.ok1kvk.cz/krouzek/digitalni-hodiny-s-atmega8) + +AktuálnĂ zdrojovĂ˝ kĂłd naleznete na našem [GitLabu](https://git.ok1kvk.cz/krouzek/digitalni-hodiny-s-atmega8/blob/master/SW/hodiny.c), kde takĂ© naleznete [pĹ™eloĹľenĂ˝ zdojovĂ˝ kĂłd](https://git.ok1kvk.cz/krouzek/digitalni-hodiny-s-atmega8/builds) do formátu [HEX](https://cs.wikipedia.org/wiki/Intel_HEX). + +Deska byla vyrobena [metodou naĹľehlenĂm tonneru](clanek/2008/vyroba-plosnych-spoju/). + +# Seznam součástek: -Toto zapojenĂ jsme pojali jako motivaÄŤnĂ, postavit si nÄ›co praktickĂ©ho s vyuĹľitĂm mikroprocesoru. CelĂ© hodiny jsou tvoĹ™eny dvÄ›ma [DPS](http://cs.wikipedia.org/wiki/Plo%C5%A1n%C3%BD_spoj), kterĂ© jsou na sebe navzájem kolmĂ©. V mĂstÄ› kontaktu desek jsou sletovány pájecĂ plošky a tĂm je zaruÄŤen pĹ™enost signálu pro displej. Ihned po zapojenĂ na napájenĂ by se na hodinách mÄ›l objevit ÄŤas 00:00 a jiĹľ hodiny běžà (pokud máte samozĹ™ejmÄ› správnÄ› zapojenĂ a naprogramován mikroprocesor). AktuálnĂ ÄŤas nastavĂte pomocĂ tlaÄŤĂtek SW1 (minuty) a SW2 (hodiny). CelĂ© hodiny je pak moĹľnĂ© zabudovat do krabiÄŤky a lze je napájet 9V bateriĂ nebo lĂ©pe adaptĂ©rem ze sĂtÄ› (spotĹ™eba 100mA). Displej jsme pouĹľili [CA56-21SRWA](http://www.tme.eu/cz/katalog/artykuly.phtml?search=CA56-21SWRA&idp=1#cleanParameters%3D1%26search%3DCA56-21SRWA%26bf_szukaj%3D+) ([2](http://www.hledejsoucastky.cz/Hledani.aspx?lastsearch=CA56-21SRWA)), na kterĂ© máme i nakreslenĂ˝ plošnĂ˝ spoj. Mikroprocesor je [ATmega8 - 16PU](http://www.hledejsoucastky.cz/Hledani.aspx?lastsearch=ATMEGA8-16PU) v pouzdru DIL28. -SchĂ©ma: -. -PlošnĂ˝ spoj: -. -PDF verze: [schĂ©ma](../upload/ok1wmr/clanky/hodiny/hodiny_sch.pdf), [plošnĂ˝ spoj 1:1](../upload/ok1wmr/clanky/hodiny/hodiny_dps.pdf), [osazovacĂ plán](../upload/ok1wmr/clanky/hodiny/hodiny_osaz.pdf)Eagle 5.7: [SCH](../upload/ok1wmr/clanky/hodiny/hodiny_1.0.sch) a [BRD](../upload/ok1wmr/clanky/hodiny/hodiny_1.0.brd)Program: [hodiny.c](../upload/ok1wmr/clanky/hodiny/hodiny.c), [hodiny.hex](../upload/ok1wmr/clanky/hodiny/hodiny.hex) (.hex se nahrává do mikroprocesoru, mĹŻĹľete prohlĂĹľet v editoru txt) pĹŻvodnĂ zdroj [Daqq.eu](http://daqq.eu/)Deska byla vyrobena [metodou naĹľehlenĂm tonneru.](index.php/technicke-lanky/425-vyroba-plonych-spoj)[ -](index.php/technicke-lanky/425-vyroba-plonych-spoj)Seznam součástek:R1-R8 - 330RR9-R11 - 10KC1,C2 - 22pC3 - 100nFC4, C5 - 100uF/16VIC1 - 7805 (TO220)IC4 - ATmega8-16PU (DIL28) + patice pro DIL28D1 - LED displej [CA56-21SRWA](http://www.tme.eu/cz/katalog/#cleanParameters%3D1%26searchClick%3D1%26search%3DCA56-21SRWA%26bf_szukaj%3D+)Q1 - krystal 14.7456 MHz - HC49 -SW1, SW2 - mikrotlaÄŤĂtka s delšĂm hmatnĂkem<object height="344" width="425" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,0,0" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"><param value="true" name="allowFullScreen"> <param value="always" name="allowscriptaccess"> <param value="http://www.youtube.com/v/CAZYkOt0Mgk&hl=cs_CZ&fs=1&rel=0&color1=0x2b405b&color2=0x6b8ab6" name="src"><embed height="344" width="425" src="http://www.youtube.com/v/CAZYkOt0Mgk&hl=cs_CZ&fs=1&rel=0&color1=0x2b405b&color2=0x6b8ab6" allowscriptaccess="always" allowfullscreen="true" type="application/x-shockwave-flash"></object> +| OznaÄŤenĂ | Hodnota | Datasheet | Odkaz do obchodu | +|----------|--------------|-----------|------------------| +| R1 - R8 | 330 Ω | | | +| R9 - R11 | 10 kΩ | | | +| C1, C2 | 22 pF | | | +| C3 | 100 nF | | | +| C4, C5 | 100 µF | | | +| IC1 | 7805 (TO220) | [LM7805.pdf](https://www.sparkfun.com/datasheets/Components/LM7805.pdf) | [tme.eu](http://www.tme.eu/cz/details/l7805acv/stabilizatory-napeti-neregulovane/st-microelectronics/) | +| IC4 | ATmega8a-PU | [ATmega8a.pdf](http://www.atmel.com/images/atmel-8159-8-bit-avr-microcontroller-atmega8a_datasheet.pdf) | [tme.eu](http://www.tme.eu/cz/details/atmega8a-pu/mikroprocesory-atmel-avr-tht/atmel/) | +| D1 | LED displej | [CA56-21SRWA.pdf](http://www.tme.eu/cz/Document/fd133b55ab2a5f9e4bf70453b9a4fb6d/BC56-12.pdf) | [tme.eu](http://www.tme.eu/cz/details/ca56-21srwa/ctyrmistne-led-displeje/kingbright-electronic/) | +| Q1 | 14,7456 MHz | | [tme.eu](http://www.tme.eu/cz/details/hc49us-ff3f14.7456/krystalove-rezonatory-tht/ilsi/hc49us-ff3f18-147456/) | +| SW1, SW2 | mikrotlaÄŤĂtka s delšĂm hmatnĂkem | | | -* * * +# Video +<iframe src="https://www.youtube.com/embed/CAZYkOt0Mgk" frameborder="0" height="315" width="560"></iframe> -**Program v jazyce C**<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;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;gt;</style> +# Program v jazyce C ``` #include <avr/io.h> #include <avr/interrupt.h> #include <avr/wdt.h> #include <stdio.h> + + #define _s_A 2 #define _s_B 0 #define _s_C 6 @@ -44,35 +78,38 @@ SW1, SW2 - mikrotlaÄŤĂtka s delšĂm hmatnĂkem<object height="344" width="425" const unsigned char segs[] = { - _BV(_s_A) | _BV(_s_B) | _BV(_s_C) | _BV(_s_D) | _BV(_s_E) | _BV(_s_F), //0 - _BV(_s_B) | _BV(_s_C), //1 - _BV(_s_A) | _BV(_s_B) | _BV(_s_D) | _BV(_s_E) | _BV(_s_G), //2 - _BV(_s_A) | _BV(_s_B) | _BV(_s_C) | _BV(_s_D) | _BV(_s_G), //3 - _BV(_s_B) | _BV(_s_C) | _BV(_s_F) | _BV(_s_G), //4 - _BV(_s_A) | _BV(_s_C) | _BV(_s_D) | _BV(_s_F) | _BV(_s_G), //5 - _BV(_s_A) | _BV(_s_C) | _BV(_s_D) | _BV(_s_E) | _BV(_s_F) | _BV(_s_G), //6 - _BV(_s_A) | _BV(_s_B) | _BV(_s_C), //7 - _BV(_s_A) | _BV(_s_B) | _BV(_s_C) | _BV(_s_D) | _BV(_s_E) | _BV(_s_F) | _BV(_s_G),//8 - _BV(_s_A) | _BV(_s_B) | _BV(_s_C) | _BV(_s_F) | _BV(_s_G),//9 - - _BV(_s_A) | _BV(_s_B) | _BV(_s_C) | _BV(_s_E) | _BV(_s_F) | _BV(_s_G), //A - _BV(_s_C) | _BV(_s_D) | _BV(_s_E) | _BV(_s_F) | _BV(_s_G), //B - _BV(_s_A) | _BV(_s_D) | _BV(_s_E) | _BV(_s_F), //C - _BV(_s_B) | _BV(_s_C) | _BV(_s_D) | _BV(_s_E) | _BV(_s_G), //D - _BV(_s_A) | _BV(_s_D) | _BV(_s_E) | _BV(_s_F) | _BV(_s_G), //E - _BV(_s_A) | _BV(_s_E) | _BV(_s_F) | _BV(_s_G) //F - + _BV(_s_A) | _BV(_s_B) | _BV(_s_C) | _BV(_s_D) | _BV(_s_E) | _BV(_s_F), //0 + _BV(_s_B) | _BV(_s_C), //1 + _BV(_s_A) | _BV(_s_B) | _BV(_s_D) | _BV(_s_E) | _BV(_s_G), //2 + _BV(_s_A) | _BV(_s_B) | _BV(_s_C) | _BV(_s_D) | _BV(_s_G), //3 + _BV(_s_B) | _BV(_s_C) | _BV(_s_F) | _BV(_s_G), //4 + _BV(_s_A) | _BV(_s_C) | _BV(_s_D) | _BV(_s_F) | _BV(_s_G), //5 + _BV(_s_A) | _BV(_s_C) | _BV(_s_D) | _BV(_s_E) | _BV(_s_F) | _BV(_s_G), //6 + _BV(_s_A) | _BV(_s_B) | _BV(_s_C), //7 + _BV(_s_A) | _BV(_s_B) | _BV(_s_C) | _BV(_s_D) | _BV(_s_E) | _BV(_s_F) | _BV(_s_G), //8 + _BV(_s_A) | _BV(_s_B) | _BV(_s_C) | _BV(_s_F) | _BV(_s_G), //9 + + _BV(_s_A) | _BV(_s_B) | _BV(_s_C) | _BV(_s_E) | _BV(_s_F) | _BV(_s_G), //A + _BV(_s_C) | _BV(_s_D) | _BV(_s_E) | _BV(_s_F) | _BV(_s_G), //B + _BV(_s_A) | _BV(_s_D) | _BV(_s_E) | _BV(_s_F), //C + _BV(_s_B) | _BV(_s_C) | _BV(_s_D) | _BV(_s_E) | _BV(_s_G), //D + _BV(_s_A) | _BV(_s_D) | _BV(_s_E) | _BV(_s_F) | _BV(_s_G), //E + _BV(_s_A) | _BV(_s_E) | _BV(_s_F) | _BV(_s_G) //F }; + + #define _ms(n) (17*n) -void wait(unsigned int a) //basic wait -{ - volatile unsigned int b,c; - for(b=0;b!= a; b++)for(c=0;c!= 50;c++); - return; +void wait(unsigned int a) //basic wait +{ + volatile unsigned int b,c; + for(b=0;b!= a; b++)for(c=0;c!= 50;c++); + return; } + + unsigned char prescale=0; unsigned char sec=0; unsigned char min_1=0; @@ -81,41 +118,44 @@ unsigned char hour_1=0; unsigned char hour_10=0; unsigned char show_t=0; - ISR(TIMER1_OVF_vect) + +ISR(TIMER1_OVF_vect) { - if(++prescale == 225){prescale = 0;sec++;}; - if(sec>59){min_1++;sec=0;}; - if(min_1>9){min_1=0;min_10++;}; - if(min_10>5){min_10=0;hour_1++;}; - if(hour_1>9){hour_1=0;hour_10++;}; - if(hour_10>1 && hour_1>3){hour_1=0;hour_10=0;}; - - if(++show_t==4) show_t=0; - switch(show_t) - { - case 0: //show minutes - PORTC = 0x04; - PORTD = (~segs[min_1]); - break; - case 1: //show 10 minutes - PORTC = 0x08; - PORTD = (~segs[min_10]); - break; - case 2: //show hours - PORTC = 0x10; - PORTD = (~segs[hour_1]) & ~_BV(_s_dot); - break; - case 3: //show 10hours - PORTC = 0x20; - PORTD = (~segs[hour_10]); - break; - default: - show_t = 0; - break; - } - return; + if(++prescale == 225){prescale = 0;sec++;}; + if(sec>59){min_1++;sec=0;}; + if(min_1>9){min_1=0;min_10++;}; + if(min_10>5){min_10=0;hour_1++;}; + if(hour_1>9){hour_1=0;hour_10++;}; + if(hour_10>1 && hour_1>3){hour_1=0;hour_10=0;}; + + if(++show_t==4) show_t=0; + + switch(show_t) + { + case 0: //show minutes + PORTC = 0x04; + PORTD = (~segs[min_1]) & ~_BV(_s_dot); + break; + case 1: //show 10 minutes + PORTC = 0x08; + PORTD = (~segs[min_10]) & ~_BV(_s_dot); + break; + case 2: //show hours + PORTC = 0x10; + PORTD = (~segs[hour_1]) & ~_BV(_s_dot); + break; + case 3: //show 10hours + PORTC = 0x20; + PORTD = (~segs[hour_10]) & ~_BV(_s_dot); + break; + default: + show_t = 0; + break; + } + return; } + #define B1() (bit_is_clear(PINB,3)) #define B2() (bit_is_clear(PINB,4)) #define B_WAIT 300 @@ -125,39 +165,30 @@ unsigned char show_t=0; int main(void) { - TIMSK = 0x04; - TCCR1B = 0x01; - - DDRD = 0xFF; - DDRC = 0x3F; - DDRB = 0x00; - PORTB = 0xFF; - - sei(); - while(1) - { - if(B1()) - { - wait(_ms(B_WAIT)); - min_1++; - sec=0; - } - if(B2()) - { - wait(_ms(B_WAIT)); - hour_1++; - sec=0; - } - } + TIMSK = 0x04; + TCCR1B = 0x01; + + DDRD = 0xFF; + DDRC = 0x3F; + DDRB = 0x00; + PORTB = 0xFF; + + sei(); + while(1) + { + if(B1()) + { + wait(_ms(B_WAIT)); + min_1++; + sec=0; + } + + if(B2()) + { + wait(_ms(B_WAIT)); + hour_1++; + sec=0; + } + } } - ``` - -* * * - -.....[http://krouzek.radioklub.cz](http://krouzek.radioklub.cz) -........ - -* * * - -New layer...New layer...New layer... \ No newline at end of file