Bombové hodiny
....precízne prevedené vyvolajú vždy efekt WOW!
jaro61, 04.01.2017-19:06

Je to v podstate jednoduché zariadenie skonštruované na základe mikroprocesora Atmega8 doplnené modulom reálneho času RTC DS1307, teplotným senzorom DS1820 a posuvným registrom 74HC164. Zariadenie je skonštruované na jednom plošnom spoji, ktorý je umiestnený k atrape dynamitu a doplnený niekoľkými drôtmi stočenými do špirály pre konečný efekt. Môže slúžiť ako hodiny, budík, teplomer, stopky a časovač.



Hardware
Schéma zariadenia je na obrázku alebo si ju môžete stiahnuť spolu s ostatnými súbormi na konci článku.



Jadrom celého zariadenia je mikroprocesor Atmega8A-PU (a jeho pokrvný príbuzný) taktovaný vnútorným RC oscilátorom. Zapojenie mikroprocesora je štandardné. Kondenzátor na filtráciu napájania a odpor na RESET pine.

Časovanie a meranie teploty zabezpečujú obvody DS1307 a DS1820. Pri analýze schémy si môžete všimnúť, že na zbernici  I²C (TWI) chýbajú pull-up rezistory pre SDA a SCL, ale nie je to až taká vážna chyba, nakoľko ich nahradia vnútorné pull-up rezistory mikroprocesora. Zariadenie pracuje aj bez týchto rezistorov stabilne a spoľahlivo.

Úlohu používateľského rozhrania plnia štyri tlačidlá, bzučiak, štyri LED diódy ovládané jedným tranzistorom (bodky medzi LED displejmi) a tri dvojmiestne 7-segmentové LED displeje so spoločnou anódou. Okrem toho na DPS sa nachádza aj ICSP konektor na programovanie mikroprocesora Atmega8A-PU.

Samotný tvar DPS je prispôsobený na neskoršie pripevnenie zariadenia k tomu, čo práve to robí toto zariadenie atraktívnym - k makete dynamitu. Návrh DPS bol dosť komplikovaný pretože rozmiestnenie najdôležitejších komponentov (tlačidla, LED displeje, konektory, LED diódy) bolo ustálené na začiatku a nebolo možné ich neskôr meniť. Napriek tomu sa podarilo navrhnúť celkom kompaktnú jednostrannú DPS (dvoch kondenzátorov) ale za cenu celkom slušného počtu prepojov. Našťastie väčšina prepojov sa nachádza pod LED displejmi, takže ich vôbec nie je vidieť a nekazia vzhľad DPS. Ja osobne si dávam robiť DPS do Činy a im je jedno či chcete jednostrannú alebo dvojstrannú dosku. Cena je tá istá. DPS som preto dal vyrobiť dvojstranné s prekovenými otvormi a potlačou. Na takéto DPS je radosť pozerať. Je to proste pastva pre oči. Či nie?



Software
Software bol napísany v C++. Použitie jazyka C++ sa možno bude zdať nevhodné, ale v programe neboli použité triedy ani objektové programovanie. Celý projekt je rozdelený do niekoľkých častí, ktoré sú umiestnené v samostatných súboroch.

Zdrojový kód je pomerne rozsiahly a nevyžaduje žiadne špeciálne vysvetľovanie. Poznámky v programe budú úplne stačiť k pochopeniu kódu.

Program pre mikroprocesor Atmega8 (a jeho príbuzných) pracujúci na frekvencii 8MHz s nastavením „fusebite“:

Low: E4
High: D9


Devastator/DS1820/

Súbory ds.h a ds.cpp obsahujú funkcie potrebné na obsluhu teplomera. Kód obsahuje len najnutnejšie minimum. Dve funkcie, ktoré umožňujú inicializáciu konverzie a samotné načítanie teploty. Funkcia ktorá načítava teplotu ju okamžite prevádza na 16-bitovú premennú so znamienkom podľa algoritmu pre DS1820, takže zmena senzoru na DS18B20 alebo DS18S20 bude vyžadovať prepísanie tejto funkcie nanovo podľa príslušného datasheetu.

Súbory onewire.h a onewire.c sú knižnice pre obsluhu zbernicu onewire pomocou ľubovoľného I/O pinu.


Devastator/RTC/

Súbory rth.h a rtc.cpp zahrňujú podporu pre DS1307 a ďalšie veci potrebné na riadenie času. Tu je okrem iného aj deklarácia štruktúry na uloženie času a funkcia pre konverziu dat medzi desiatkovou sústavou, ktorá je používaná v programe a sústavou BCD s ktorou pracuje DS1307.

Súbory twi.h a twi.c sú knižnice na obsluhu vstavaného hardvérového rozhrania mikroprocesora TWI (I²C).


Devastator/

Súbory user.h a user.cpp obsahujú všetko potrebné na implementáciu používateľského rozhrania. Je tu obsluha displeja, tlačidiel, bodky medzi číslicami a bzučiak. V súbore user.h sú tiež popísané aj funkcie jednotlivých pinov.

Súbor main.cpp obsahuje globálne premenné now, alarm a alarm_on, ktoré vždy obsahujú aktuálny čas, čas pre budík a príznak alarmu.

Funkcia main - zahŕňa inicializáciu všetkých potrebných periférii a timera2, ktorý vykonáva hlavné prerušenia v programe. Na konci je nekonečná slučka, ktorá sa vykonáva počas nečinnosti.
Prerušenie pri TIMER2 - hlavná časť celého programu. Prerušenie sa vykonáva s frekvenciou 1 kHz. Na začiatku sa nachádzajú deklarácie premenných, ktoré sú používané v celom prerušení. Sú to:

1. Obsah displeja
2. Stlačené tlačidlo, respektíve tlačidlo stlačené pri poslednej iterácii
3. Užívateľom vybraný režim, respektíve režim vybraný pri poslednej iterácii
4. Premenná budíka
5. Doba stlačenia tlačidla 4 potrebná pre vstup do nastavenia.

Tu sú realizované obsluhy tlačidiel, generátor milisekúnd a výber prevádzkového režimu.

Použitie generátora milisekúnd sa ukázalo ako nevyhnutné nakoľko obvod DS1307 zabezpečuje len sekundy. Presnosť takéhoto riešenia môže byť pochybná, tým viac, že mikroprocesor je taktovaný vstavaným RC generátorom. Ale všetky pochybnosti sa ukazujú ako neopodstatnené ak zoberieme do úvahy, že doba odozvy na stlačenie tlačidla je zvyčajne asi 20-40ms a navyše nie je konštantná.

Všetky funkcie sú umiestnené na jednom mieste postupne jedna za druhou, čo umožňuje vykonávať všetky úloh naraz a to i napriek tomu, že na displeji môže byť zobrazená len jedna funkcia. To vám umožní súčasne spustiť stopky, odpočítavanie času, a zobrazenie aktuálneho času.



Nasleduje procedúra na obsluhu špeciálneho režimu – nastavenia. Tu sa nastavuje aktuálny čas a dátum a čas aktivácie alarmu. Režim nastavenia sa aktivuje 3 sekundovým stlačením tlačidla 4. Týmto tlačidlom sa vykonáva aj uloženie nastavení a zápis do DS1307 EEPROM.

Prerušenie ukončuje procedúra kde sa nachádza obsluha displeja, aktualizácia premenných last, last_mode a obsluha bzučiaka.
Posledným prvkom programu je vonkajšie prerušenie INT0 z DS1307, ktorý generuje signál s frekvenciou 1 Hz. Na tomto mieste je aktualizovaná globálna štruktúra v ktorej je uložený vždy aktuálny čas.
Pri práci sa zistilo, že komunikácia s obvodom DS1307 je príliš časovo náročná a spôsobuje, blikanie displeja. Z tohto dôvodu bol pridaný atribút ISR_NOBLOCK a prerušenie bolo rozdelené do dvoch častí. Prvá z nich je zodpovedná za komunikáciu s DS1307 a pri komunikácii nie sú blokované prerušenia. Druhá časť zodpovedná za aktualizáciu globálnej premennej „now“ a synchronizáciu softvérového generátora milisekúnd a je umiestnená v bloku so zakázanými prerušeniami. K prenosu dat sa používa buffer. Kopírovanie dat z buffera na miesto určenia je tak rýchle, že nespôsobuje žiadne problémy v prevádzke systému.



Umelecká čásť

Každý projekt, ktorý má opustiť dielňu sa musí nejako dokončiť. Nakoniec doska plošného spoja sama o sebe nie je ani pekná ani praktická. Najbežnejším spôsobom je umiestniť zariadenie do nejakej krabičky. Bohužiaľ krabičky ktoré je možne zakúpiť často nie sú estetické. Výroba vlastnej estetickej krabičky tiež ďaleko prevyšuje moje schopnosti a možnosti. Rozhodol som sa preto vyrobiť niečo originálne. Dosku plošného spoja som umiestnil na maketu dynamitu a zariadenie dostalo hneď impozantný a filmový vzhľad.

Maketa dynamitu je zhotovená zo stredových roliek z papierových kuchynských utierok, ktoré sú obalené červeným papierom, fóliou alebo jednoducho nastriekané farbou. Kvôli pevnosti je vnútro rolky vyplnené zrolovanými starými novinami a konce sú zalepené kartónovými kolieskami. Pri výrobe makety sa medze fantázii nekladú. Pre realistický (možno až veľmi) vzhľad bolo zariadenie ešte doplnené farebnými vodičmi stočenými do špirály, ktoré sú na jednej strane ukončené v jednotlivých rolkách a z druhej strany pod plošným spojom. Výsledný efekt je ohromujúci.



Vzhľadom na nedostatok znakov alebo prídavného displeja informujúceho o vybranej funkcii sa môže obsluha zariadenia zdať zložitá, ale je to len zdanie. Hodiny majú tri prevádzkové režimy, v ktorých každá klávesa má trochu inú úlohu. Najlepšie to ukáže tabuľka:

 

 

Hodiny

Stopky

Časovač

Nastavenia (špeclny režim)

Tlačidlo 1

Dátum

Štart/pauza

Štart/pauza

Zvýši hodnotu o jeden

Tlačidlo 2

Teplomer

Reset

Reset

Zníži hodnotu o jeden

Tlačidlo 3

Budík ON/

Hold

Nastaveniečasu

Nasledujúca hodnota

Tlačidlo 4

Nasledujúci mód

Nasledujúci mód

Nasledujúci mód

Zapis a ukončenie



Niektoré veci si vyžadujú bližšie vysvetlenie.

Funkcia HOLD umožňuje zmraziť čas na displeji bez zastavenia stopiek. V režime časovača je namiesto funkcie HOLD vstup do režimu nastavenia štartovacieho času. Obsluha je rovnaká ako pri špeciálnom režime nastavovania, ale ukončenie nastáva automaticky po prejdení všetkých troch hodnôt (hod. min. sek) pomocou tlačidla 3. Je to dobré vidieť na videu.

Režim nastavovania je realizovaný ináč. Pomocou tlačidla 3 posúvame vybranú hodnotu vľavo. Celkovo existujú tri nastavenia: dátum, budík a čas. Čas sa nastavuje na konci, aby sme ho mohli synchronizovať s inými hodinami. Bodka na spodnej časti displeja nám umožňuje zorientovať sa aby sme vedeli kde sme.

Posledná vec, ktorú treba objasniť je spôsob signalizácie aktívneho budíka. Bodka v dolnej časti pravého displeja sa rozsvieti, keď je budík aktívny.



Záver

Pôvodná schéma neobsahuje obmedzovacie odpory na LED diódy 7-segmentových displejov.
Autor argumentuje tým, že na doske bolo málo miesta a nechcel do zariadenia umiestňovať SMD súčiastky a že zariadenie spoľahlivo pracuje aj bez týchto odporov. Ja som tieto odpory som doplnil do schémy a do návrhu plošného spoja. Tieto odpory sú ale v prevedení SMD 1206.

Ďalšou vecou ktorú som poopravil je napájanie na konektor pre ISP programovanie. (pin č.2). V pôvodnom zapojení nie je na tento pin privedené napájanie a pri programovaní bolo nutné napájať aj celé zariadenie.

Z vlastnej skúsenosti môžem potvrdiť, že zariadenie pracuje na prvé zapojenie bez závad.


Zdroj:
http://mikrokontrolery.blogspot.sk/2011/03/DIY-Devastator-Bombowy-zegarek-ATmega8.html

Video:
https://youtu.be/Muaa3-Mgbmc


tento článok je z mikroZONE
( http://www.mikrozone.sk/pluginy/content/content.php?content.141 )