Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Zegar dwunastodiodowy w oparciu o ATmega8 i DS1307

linuxtorpeda 19 Jul 2015 01:12 3525 21
IGE-XAO
  • Zegar dwunastodiodowy w oparciu o ATmega8 i DS1307

    Wstęp

    Główną przyczyną powstania tej konstrukcji była nuda oraz chęć zweryfikowania, jak poczciwa ATmega8 radzi sobie z software'ową realizacją PWM na wielu wyjściach jednocześnie. Żeby nie było nudno, postanowiłem, że urządzenie powinno mieć śladowe oznaki użyteczności - wybór padł więc na zegar pseudoanalogowy.


    Opis konstrukcji

    Urządzenie, jak już wspomniałem wcześniej, zostało oparte na mikrokontroler ATmega8. Dwanaście diod (osiem diod czerwonych i cztery zielone) służą do wyświetlania aktualnego czasu w następujący sposób:
    - dioda, która świeci się stałym mocnym światłem, wskazuje aktualną godzinę,
    - dioda, która miga z częstotliwością ok. 0,5 Hz, oznacza aktualną minutę (przeskok z jednej diody na drugą oznacza upływ pięciu minut),
    - pozostałe diody lekko się jarzą, co ułatwia odczyt czasu w nocy.
    Realizacja poziomu jasności realizowana jest za pomocą modulacji PWM.

    Zielone diody wyróżniają godziny będące wielokrotnością liczby 3 (3, 6, 9 i 12). Na schemacie można zauważyć, że do podłączenia ich do mikrokontrolera zastosowałem rezystory o mniejszej wartości (4k7) niż do diod czerwonych (10k). Spowodowane jest to faktem, że oko ludzkie jest bardziej wrażliwe na światło czerwone, a więc żeby uzyskać wrażenie równomiernego świecenia wszystkich diod, diody zielone powinny świecić z większą mocą.

    Warto też wspomnieć o miłym dodatku w postaci wyświetlania krótkich animacji w przypadku wystąpienia nowej godziny - to taki wizualny odpowiednik kukułki w zegarze z kukułką. W chwili obecnej zaimplementowanych jest pięć różnych animacji - wszystkie w mniejszym lub większym stopniu korzystają z dobrodziejstw PWM.

    ATmega8 wykorzystuje wewnętrzny oscylator RC pracujący na częstotliwości ok. 8 MHz. Wiadomo, że oscylator RC nie nadaje się do bycia wzorcem czasu. W projekcie wzorcem jest kwarc 32 kHz podłączony do układu RTC DS1307. Układ ten zapewnia również ciągłe odmierzanie czasu w przypadku utraty głównego zasilania urządzenia. Zasilaniem zastępczym jest bateria litowa 3V.

    Firmware został napisany w języku C. Starałem się stworzyć w miarę ogólne API, które pozwalałoby na zmianę rozstawu pinów na poziomie hardware'u bez znacznej ingerencji w software. Ucierpiała na tym jednak wydajność całego programu - w chwili obecnej program nie spełnia swoich zakładanych funkcji, o ile nie jest skompilowany z opcją -O3 (toolchain avr-gcc), co wymusza od kompilatora maksymalny poziom optymalizacji.

    Zarówno schemat ideowy urządzenia, jak i kod źródłowy firmware'u, dostępne są w postaci załączników.

    Zegar dwunastodiodowy w oparciu o ATmega8 i DS1307 Zegar dwunastodiodowy w oparciu o ATmega8 i DS1307

    Podsumowanie

    Koszt wykonania całego projektu nie powinien przekroczyć 50 zł:
    - ATmega8 - ok. 10zł
    - 12 LEDów - ok. 3zł
    - uniwersalne PCB - ok. 15zł
    - pudełko - ok. 10 zł
    - DS1307 - ok. 7zł
    - drobnica w postaci odrobiny termokleju do klejenia diod do obudowy, cyny, itp. jest trudna do oszacowania, ale raczej nie nadwyręży domowego budżetu

    Z konstrukcji jestem raczej zadowolony, trochę mniej z firmware'u. Doszedłem do smutnego wniosku, że w przypadku embedded nie ma często miejsca na pisanie zgeneralizowanego i abstrakcyjnego kodu.

    Cool! Ranking DIY
    Can you write similar article? Send message to me and you will get SD card 64GB.
    About Author
    linuxtorpeda
    Level 24  
    Offline 
    Has specialization in: zbrojarz betoniarz
    linuxtorpeda wrote 580 posts with rating 86, helped 72 times. Been with us since 2014 year.
  • IGE-XAO
  • #2
    KKonradev2
    Level 15  
    Czyli chce kolega powiedzieć, że mierzymy czas z dokładnością +- 5 minut :d. Osobiście ten zegar nie podoba mi się, z racji dużej obudowy, brak jakiegokolwiek "wyrazu", jednak skoro poćwiczył kolega Timery i PWM to + dla autora.
  • #3
    dondu
    Moderator on vacation ...
    Nawet prosty projekt przynosi dużo satysfakcji :)

    Drobna uwaga:

    linuxtorpeda wrote:
    ATmega8 wykorzystuje wewnętrzny oscylator RC pracujący na częstotliwości ok. 8 MHz. Wiadomo, że oscylator RC nie nadaje się do bycia wzorcem czasu. W projekcie wzorcem jest kwarc 32 kHz podłączony do układu RTC DS1307. Układ ten zapewnia również ciągłe odmierzanie czasu w przypadku utraty głównego zasilania urządzenia. Zasilaniem zastępczym jest bateria litowa 3V.


    Twój projekt można było rozwiązać znacznie prościej:
    - zastosować ATmega8A lub ATmega8L (możliwość pracy od 2,7V),
    - kwarc 32,768kHz podłączyć do Timer2 pracujący w trybie asynchronicznym,
    - usypiać mikrokontroler do trybu Pover Save, w którym łącznie z włączonym Timer2 mikrokontroler pobiera zaledwie około 10µA.

    W ten sposób zrealizujesz programowo to samo, co sprzętowo za pomocą DS1307.
  • IGE-XAO
  • #4
    linuxtorpeda
    Level 24  
    @KKonradev2
    Nie, nie mierzymy czasu z dokładnością 5 minut, 5 minut to dokładność, z jaką możemy czas odczytać. Czas jest mierzony na tyle dokładnie, na ile pozwala kwarc, czyli typowo +/- 15 sekund na miesiąc. Ja na co dzień posługuję się terminami typu "kwadrans po pierwszej" lub "za pięć dwunasta", więc nie przeszkadza mi to, że zegara nie mogę używać jako stopera.

    @dondu
    DS1307 przy odcięciu głównego zasilania pobiera z baterii typowo ok. 300nA, czyli jakieś 30 razy mniej niż 10uA.
  • #5
    dondu
    Moderator on vacation ...
    linuxtorpeda wrote:
    @dondu
    DS1307 przy odcięciu głównego zasilania pobiera z baterii typowo ok. 300nA, czyli jakieś 30 razy mniej niż 10uA.

    Zgadza się, ale Twój zegar w stanie zasilania z baterii nie przebywa prawie nigdy - zasilanie to jest tylko na wszelki wypadek:

    linuxtorpeda wrote:
    Zasilaniem zastępczym jest bateria litowa 3V.

    Policzmy więc ile czasu ATmega w zaproponowanym przeze mnie przykładzie mogłaby pracować na baterii którą zastosowałaś, czyli CR2032?:

    244mAh / 10µA = 24400h = 1016 dni = 2,78 roku

    Należałoby oczywiście jeszcze odjąć ilość mocy traconej co 8 sekund (bo w trybie zasilnia z baterii nie trzeba odmierzać co sekundę) wzrost poboru prądu ułamek sekundy więc dla zaokrąglenia przyjmijmy, że były by to 2 lata.
  • #6
    linuxtorpeda
    Level 24  
    @dondu
    Jaki by nie był czas działania ATmegi na tej baterii, to z użyciem DS1307 urządzenie będzie funkcjonowało dłużej - w tym przypadku spokojnie ponad 60 lat. Przewiduję, że zegar może czasem znaleźć się na strychu przez dłuższy okres - dobrze by było, żeby w takim przypadku również funkcjonował. Można się czepiać tylko tego, że nie stosuję żadnej metody korekty czasu, co przy tak długim planowanym działaniu może być problemem.
  • #7
    dondu
    Moderator on vacation ...
    linuxtorpeda wrote:
    ... w tym przypadku spokojnie ponad 60 lat.

    Czy wiesz co to jest upływność lub samorozładowanie baterii?
    Czy sprawdziłeś jaka jest wartość tego parametru i jak to wpłynie na 60 lat, które przytoczyłeś?
    http://mikrokontrolery.blogspot.com/2011/01/bateria-zasila-mikrokontroler-czesc-3.html

    Pomijam już fakt, że gdyby Twój projekt mógł cudownym zrządzeniem praw fizyki działać na DS przy zasilaniu CR2032 przez 60 lat, to czas wskazywany nie miałby nic wspólnego z rzeczywistością, bo zastosowany kwarc ma dokładność rzędu 20-30ppm i w dodatku starzeje się ±5 ppm/rok:
    http://mikrokontrolery.blogspot.com/2011/04/stopery-timery-itp.html


    linuxtorpeda wrote:
    Przewiduję, że zegar może czasem znaleźć się na strychu przez dłuższy okres - dobrze by było, żeby w takim przypadku również funkcjonował.

    Dobieramy irracjonalny przykład by bronić swoją tezę? :D :D :D


    linuxtorpeda wrote:
    Można się czepiać ...

    Oj kolego czytaj co napisałem w pierwszym poście - broniłem Ciebie przed częściowo negatywną oceną kol. KKonradev2

    dondu wrote:
    Nawet prosty projekt przynosi dużo satysfakcji :)

    a następnie dopisałem:

    dondu wrote:
    Drobna uwaga: ...

    Jeśli więc takie postępowanie uznajesz za czepianie się, to nie publikuj swoich projektów.


    linuxtorpeda wrote:
    ... że nie stosuję żadnej metody korekty czasu, co przy tak długim planowanym działaniu może być problemem.

    Nie jest to żadnym problemem w przypadku, gdy masz pełnię władzy nad programem.

    Reasumując:
    - nie dostrzegaj krytyki tam gdzie jej nie ma,
    - zastanawiaj się nad tym co piszą nieco bardziej doświadczeni koledzy,
    - czytaj dokumentacje stosowanych elementów,
    - DS1307 itp. przydaje się w projektach, w których nie ma innej możliwości realizacji zegara asynchronicznego.
  • #9
    kombo
    Level 12  
    Za moich młodych lat musiałem być skromnym by fachowcy mnie czegokolwiek nauczyli, trzeba było stulić uszy po sobie i nauczyć się pokory.
  • #11
    japko1024
    Level 18  
    W jakim środowisku napisałeś ten program? I w jakim systemie operacyjnym? Chociaż to drugie pytanie jest chyba, sądząc po nicku, pytaniem retorycznym :D
  • #12
    linuxtorpeda
    Level 24  
    Jeśli dobrze pamiętam, to moim środowiskiem developerskim było Eclipse + AVR-Plugin do Eclipse'a + avr-gcc + avrdude. No a system operacyjny - jedyny słuszny, czyli Linux, konkretniej mówiąc ArchLinux. Sam projekt powstał rok temu w wakacje z nudów, zajął mi około 15 godzin (projektowanie schematu + montaż + programowanie - łącznie trzy dni po kilka godzin dziennie). Wahałem się między ATmegami a PICami (bo mam sporo mikroklocków z obydwu rodzin), ale wybrałem ATmegi z kilku względów, o których nie chce mi się rozpisywać :) Polecam jednak obie rodziny.
  • #13
    User removed account
    Level 1  
  • #14
    dondu
    Moderator on vacation ...
    Ad 1 i 3:
    Jeśli pytasz o ATmega8, to timerem asynchronicznym jest (jak napisałem powyżej) Timer2. Posiada on dedykowany temu kwarcowi (32,768kHz) oscylator. W przypadku tego mikrokontrolera niestety piny XTAL i TOSC są tymi samymi pinami. W innych przypadkach np. ATmega32 piny te są wydzielone więc można dwa kwarce podłączyć.

    Szczegóły w tym zakresie: http://mikrokontrolery.blogspot.com/2011/03/A...AVR-Oscylatory-kwarcowe-kwarc-ceramiczne.html

    Ad 2. Możesz oczywiście taktować mikrokontroler z wewnętrznego generatora RC, a Timer2 z kwarcu.

    AdamZad wrote:
    ... jakie trudności programistyczne mogą się pojawić dla średnio zaawansowanego delikwenta takiego jak ja jeśli podejmie się realizacji tego typu układu zaproponowanego m.in. przez Donda.

    Żadne, to banalnie proste rozwiązanie :)

    PS.
    Dondu, nie Donda
    :)
  • #15
    linuxtorpeda
    Level 24  
    Uzupełniając to, co napisał dondu:

    Ad. 1. i Ad. 3.
    Na zewnętrzne wejścia T0/T1 możesz zapodać sygnał cyfrowy, który stanie się sygnałem zegara dla timerów 0/1. Sygnał musi być na tyle wolny, by dał się spróbkować przez mikrokontroler - szczegóły w dokumentacji.
    Warto zauważyć różnicę pomiędzy zewnętrznym sygnałem zegarowym a zewnętrznym elementem (np. kwarcem), który skutkuje tym, że mikrokontroler działa z określoną częstotliwością - kwarc/rezonator ceramiczny i zewnętrzne kondensatory są jedynie elementami generatora częstotliwości, którego pozostała część jest zabudowana w mikrokontrolerze - de facto na żadnym z pinów XTAL1 i XTAL2 nie ma sygnału cyfrowego w czasie wykorzystywania kwarcu jako elementu regulującego częstotliwość pracy całego układu.
    Częstotliwość kwarcu nie ma wpływu na dokładność zliczania impulsów na wejściu T1, dopóki trzymasz się zaleceń, tzn. żaden impuls nie zostanie pominięty przy zliczaniu (natomiast może być wykryty w różnym momencie od wystąpienia, co nie ma w zasadzie znaczenia).

    Ad. 2.
    Do T1 nie podepniesz kwarcu. Wyjaśnienie wyżej. Jeśli chcesz zrobić dokładny zegar, taktując jednocześnie procka z innego wzorca niż timer, musisz na pinie T1 zapewnić dokładny sygnał zegarowy, np. z jakiegoś generatora kwarcowego, zegara atomowego, itp. Problem z wewnętrznym generatorem RC polega na tym, że jego parametry różnią się dość znacznie w zależności od egzemplarza mikrokontrolera, temperatury i wieku układu oraz nie ma możliwości jego kalibracji o dokładności wystarczającej do zbudowania zegarka. Generator oparty o kwarc jest znacznie mniej zależny od ww. czynników, choć nadal można poprawić jego parametry przez np. zapewnienie mu stałej temperatury pracy - kwarce stabilizowane temperaturowo również są dostępne na rynku :)

    Co do trudności przy realizacji projektu - prawdopodobnie przeszkodą może być znajomość angielskiego, czytanie dokumentacji to podstawa, materiały nt. AVRów po polskiej stronie internetu są niestety dość słabe (chociaż akurat do zbudowania zegarka powinny być wystarczające). Warto zainteresować się układami scalonymi z funkcją RTC, wyręczają programistę w żmudnym liczeniu czasu, nowsze układy tego typu potrafią po kalibracji kompensować błędy wykorzystanego kwarcu.
  • #16
    User removed account
    Level 1  
  • #17
    dondu
    Moderator on vacation ...
    Ad 1. Skaczesz po procesorach, ze trudno nadążyć :)
    ATtiny2313 nie ma TOSC, bo nie ma Timera2 pracującego asynchronicznie,
    Możesz oczywiście zrobić własny generator i podłączyć do T0, ale wtedy uśpisz ATtiny jedynie do trybu Idle przez co będzie zużywał sporo prądu. Ale jeśli to nie jest projekt zasilany z baterii, to nie ma znaczenia.

    Ad 2. i 3. http://mikrokontrolery.blogspot.com/2011/04/jak-mikrokontroler-widzi-sygnal-cyfrowy.html


    Ad 4. Jakoś musisz stwierdzić, że napięcie zasilające zostało odcięte. Dlatego jakiś pin + program muszą o to zbadać.

    Ad 5. Tak Timer2 wybudzi mikrokontroler przerwaniem. Zobacz tabelkę trybów wybudzenia oraz opis trybu Pover Safe w rozdziale: Power Management and Sleep Modes
    W przypadku Power Save dodatkowo zobacz wykresy w dziale: Electrical Characteristic


    Ad 6. Jeśli to projekt zasilany z baterii, to nie ma sensu robić zewnętrznego generatora, bo będzie zapewne zużywał więcej energii niż wbudowany oscylator Timer2.

    Jeżeli brakuje Ci jednego pinu, to w takiej sytuacji należy szukać oszczędności w pozostałej części projektu lub wybrać inny mikrokontroler. Atmega8 to tylko jeden z wielu AVR, i nie da się odpowiedzieć na Twoje pytanie nie znając dokładnie projektu.

    Często bowiem bywa tak, że te projekt jest zrealizowany w sposób nieoptymalny i niewykorzystujący wielu sprzętowych możliwości danego mikrokontrolera. Czasami jest także tak, że zmiana procesora na inny pozwala rozwiązać projekt od strony sprzętowej znacznie prościej. Innymi słowy, w 99% przypadków dobieramy mikrokontroler do projektu a nie odwrotnie.

    Nie obrażamy się, tylko w nocy czasami śpimy :)
  • #18
    User removed account
    Level 1  
  • #20
    User removed account
    Level 1  
  • #22
    dondu
    Moderator on vacation ...
    AdamZad wrote:
    Przerwanie od przepełnienia (co 1 sek.)

    Jeśli masz taką potrzebę możesz co 1 sekundę, ale jeśli nie musisz, to wykorzystaj timer do końca i wybudzaj co 8 sekund :)

    AdamZad wrote:
    Czy poza Atmegą8 i Atmegą32 jest jeszcze jakiś inny AVR mający taką fajną funkcję jak możliwość podpięcia kwarcu zegarkowego oraz to aby pracował na nim w trybie asynchronicznym ?

    ... nie będę przecież sprawdzał dokumentacji w kontekście każdego z procków Atmela... stąd ta prośba...

    No pewnie, że nie będziesz :)
    Wykorzystaj wyszukiwarkę: http://goo.gl/OBeZdo
    Wybierasz rodzinę w kolumnie CPU oraz zaznaczasz tylko Yes w kolumnie 32kHz RTC i wsio.
    Powyższy link prowadzi od razu do tak zawężonych wyników jak opisałem wyżej :)