Ads_700x200

tme

piątek, 15 maja 2015

RTC - synchronizacja czasu, wieczny kalendarz ...

Witam,

Uwaga! rozpoczynamy cykl poradników pod tytułem RTC. Chciałbym wam przedstawić IDEALNY układ RTC (jaki symbol ? o tym za chwilę) .... Czy istnieje w ogóle taki układ scalony na świecie ? Pomyśl, jak często słyszysz wokoło, czy też na różnych forach, że ktoś chce zbudować idealny (swój własny zegarek), ale boryka się najczęściej z jego dokładnością. Podejmowane są więc próby zaradzenia tej sytuacji, próby kalibracji jego oscylatora, próby programowej korekcji czasu itp itd ... a pomimo to zwykle w dłuższej skali czasu problem i tak doskwiera. Dlatego niejednokrotnie sięgamy po coraz to doskonalsze układy. Jednym z nich (jak dotąd) na pewno był i jest niekwestionowany zwycięzca czyli układ DS3231, którego przedstawiłem już jakiś czas temu w poradniku - LINK. Ale i ten układ w skali całego roku może mieć kilkadziesiąt sekund opóźnienia albo się śpieszyć. Dla jednych jest to już ideał ale dla innych niestety nadal wada. W takim razie ponawiam pytanie, czy istnieje na świecie idealny układ RTC ? Taki RTC, który posiada zalety jak niżej :



UWAGA!!! w odcinku nr 8 podałem funkcję zawierającą kod (wiecznego kalendarza) która oblicza dni tygodnia po podaniu daty. Zawiera ona jednak paskudny błąd który objawi się już od 1 marca 2016 i będzie źle obliczać dzień do końca 2016 roku ! W związku z tym trzeba kod tej funkcji poprawić na taki jak podaję niżej:


  • wieczny kalendarz
  • przechowuje pełną datę
  • obsługuje automatycznie czas letni i zimowy
  • nigdy nie śpieszy się ani nie późni (nawet o kilka sekund na rok)
Dosyć tego, przedstawiam wam nie jeden a całą listę tego typu układów, spójrzcie ;)

 PCF8583   DS12885Q+ 
 PCF8563  DS1302+
 ISL12026IBZ   DS1307+
 MCP795W  DS1337+
 RTC-4543SA  RX4045SAA

co wy na tę informację? Każdy z was, spojrzy się na mnie dziwnie i powie, że plotę bzdury ? Że przecież to różne zwykłe popularne lepsze i gorsze układy RTC ale przecież nie idealne! Przecież na pierwszym miejscu w tabeli jest staruszek PCF8583, który wg wielu ma same wady, gdyż jest niedokładny, zależny od temperatury, nie może przechowywać nawet pełnego roku (niby) itp itd...

Teraz na chwilkę oderwijcie się od tego tekstu, przymknijcie oczy i spróbujcie sobie coś wyobrazić. Załóżmy, że mamy biedny niby RTC PCF8583, posiada on podtrzymanie bateryjne na co najmniej kilka dni, Pełny rok przechowujemy w jego pamięci RAM a nie w procesorze. I TERAZ! ... w sylwestra czyli np 31 grudnia o godzine 20:00 trach! zabrakło prądu, nasz zegarek się wyłączył a układ RTC działa tylko na baterii. Niestety elektrownia włącza prąd DOPIERO 1-go stycznia o godzinie 17:00 ! .... Teoretycznie rok w pamięci RAM układu RTC nie mógł się zmienić bo procek nie działał przecież :( .... więc hmmm rok pozostanie ten sam 1-go stycznia ? nie zaktualizuje się ? (piszę o tym bo padło na dole takie ciekawe pytanie) ..... i obawa o taki słaby punkt. 

Odpowiadam ;) .... z radością - UWAGA! po tym co opowiem w tym cyklu zrozumiecie i zobaczycie, że 1-go stycznia po włączeniu zegarka - BĘDZIE PRAWIDŁOWO WYŚWIETLONY KOLEJNY ROK ..... Co ciekawe - ten rok znajdzie się od razu w pamięci RAM układu RTC !!! Jak to możliwe ? ..... zapraszam do oglądania - WSZYSTKIEGO się dowiecie, zapewniam was.

A ja się uprę i udowodnię wam w tym cyklu poradników, że my (to znaczy ja albo i ty) jeśli tylko chcemy, a przecież jesteśmy programistami, możemy z KAŻDEGO z nich (wyżej wymienionych) a tak na prawdę ze wszystkich innych również, zrobić taki IDEALNY RTC. Owszem będzie to wymagało od nas kilku dodatkowych zabiegów ;) Głównie zabiegu programistycznego ale także małego zabiegu hmmmm ew dodatku elektronicznego ;). Mówię to wszystko pół żartem pół serio, i mam nadzieję, że docenicie to moje poczucie humoru a także ilość wysiłku jaki włożyłem w przedstawienie tego dowodu na możliwość wyidealizowania każdego układu RTC.

Przy tej okazji zapraszam was na wspaniałą GIMNASTYKĘ MÓZGU

Pobawimy się bowiem rubasznie językiem C i jego niesamowitymi możliwościami. Postaram się pokazać tobie w tym cyklu różne techniki programowania, zobaczymy woltyżerkę oraz salto mortale z udziałem wskaźników, zastosujemy w praktyce w przeróżnych okolicznościach ciekawe operatory języka C, żonglerkę maskowaniem, ... myślę, że już chociażby z tego względu warto zaprosić ciebie do oglądania tych poradników ;)
Innym zabiegiem który można zastosować w celu idealizacji dowolnego układu RTC to dodanie do układu "Dawcy czasu" czyli modułu ATNEL-WIFI232-T, który pozwala na bezproblemowe pobieranie dokładnego czasu z serwerów czasu w internecie, a jednocześnie możemy tym pobranym czasem wciąż "nastawiać automatycznie" nasz zegarek, nasz RTC ;) !
Wiem wiem, powiecie, że to za duży koszt ? hmm gdyby tak było że moduł ATNEL-WIFI miałby zostać użyty TYLKO i wyłącznie jako dawca czasu, to być może i w niektórych przypadkach można byłoby się zgodzić z taką tezą o tej "drogości". Tymczasem moduł wifi można wykorzystać niejako przy okazji do wielu innych celów w naszym układzie zegarka i nie tylko. Pierwsze z brzegu przykłady wynikające z moich poprzednich poradników to:

  1. możliwość bezprzewodowej podmiany/aktualizacji firmware
  2. funkcjonalność zdalnego programatora
  3. odpytywanie witryn www o rozmaite dane
  4. uruchomienie prostego serwera http (własna strona np do konfiguracji)
  5. i wiele innych

Spójrz - zebrało się tego trochę ? prawda ? ... ok nie zabieram już cennego czasu na tekst i zapraszam na serial w odcinkach ;)

part 01

part 02

part 03



odcinek specjalny
part 04
fitness dla 
naszego mózgu



part 05


part 06


part 07


part 08


part 09

part 10



KONIEC


;)

45 komentarzy:

  1. Mirku, prosiłeś o komentarze po obejrzeniu 1 odcinka - może mój nic nie wniesie konstruktywnego, ale uważam, że nawet jak przez cały odcinek nie powstaje ani jedna linia kodu, to bardzo przyjemnie się ogląda :):)

    Niemniej nurtuje mnie taki problem teoretyczny z PCF8583 - gdyby zasilać go z baterii podtrzymującej, zapisywać rok w pamięci RAM, ale dajmy na to wyłączamy urządzenie 31 grudnia i ponownie włączamy 1 stycznia - zmieni nam się rok, ale procesor nic o tym nie będzie wiedział (zakładam, że synchronizacji czasu z NTP dokonujemy dość rzadko, albo jest chwilowo niedostępna) - na ten moment wymyśliłem, że można by do RAM zapisywać oprócz roku też miesiąc i jeśli po restarcie procka miesiąc w rejestrze RTC będzie mniejszy niż w RAM, to zmienił nam się rok.

    Założę się jednak, że masz to już nagrane w materiale na 3 czy 4 odcinek i nic szczególnego nie wymyśliłem :):)

    Pozdrawiam serdecznie !:)

    OdpowiedzUsuń
    Odpowiedzi
    1. W odpowiedzi na to pytanie powyżej - UWAGA! Zapewniam ciebie - pokażę to w tym cyklu poradników (co będzie pewnie zaskoczeniem i wisienką na torcie dla wielu widzów) .... że w tym przypadku gdy 31 grudnia wyłączysz RTC PCF8583, będzie on działać tylko na baterii .... to gdy go włączysz 1 stycznia - to zagości szeroki uśmiech na twojej twarzy - ponieważ zegarek zbudowany wg moich porad (chodzi o kod programu w procku) pokaże ci ładnie kolejny ROK !!!

      i to UWAGA! bez ŻADNEGO zapisywania tego roku w pamięci procka !!! ;) UWAGA! bez ŻADNEGO wifi i pobierania czasu z NTP. Przysięgam ci ;) Wszystko załatwimy programowo - no bo w końcu jesteśmy programistami !

      Oczywiście jeśli będzie wifi i NTP to wiadomo że będzie łatwizna - ale my nie idziemy na łatwiznę ;)

      no ale nie uprzedzam faktów poczekajmy na dalsze odcinki - będzie się działo

      Usuń
    2. No to mi nabiłeś teraz klina - będę siedział i kombinował jak to "rozkminić" samemu, zanim pojawi się w poradniku! - ale o to przecież chodzi, czyż nie ?:)

      Usuń
    3. Ależ oczywiście, że o to chodzi - w końcu jak widać - mówiłem że tym razem robimy ostry fittness dla naszych szarych komórek. Więc kombinuj - ja zapewniam, że można to uzyskać i to jak mówię - bez przetrzymywania informacji o roku w jakiejkolwiek postaci w procku :D

      Usuń
    4. Już chyba wiem !!, wysłałem Ci na @ żeby nie psuć zabawy innym - temat maila "Update roku w PCF8583" :)

      Może więcej takich konkursów programistycznych - myślałeś o tym ?:)

      Usuń
    5. No dokładnie - w sumie to fajny jakby mini konkurs z tego wyszedł a pewnie i rozwiązań będzie kilka różnych a równorzędnych ;)

      Usuń
    6. Wysłałem ci odpowiedź na maila w/s propozycji rozwiązania ;)

      Usuń
    7. Tam też omówiliśmy szczegóły - dzięki !

      reszta w poradniku :)

      Usuń
  2. Witam.
    A ja się kurcze zastanawiałem gdzie się podziały cztery miesiące tegoż roku i teraz już wiem , 9 minuta 30 sekunda poradnika Mirek wyjaśnia iż posiadanie BB i GB przyspiesza czas :)

    Jak zwykle rewelacyjny cykl poradników się zapowiada .

    Pozdrawiam .

    OdpowiedzUsuń
    Odpowiedzi
    1. Dokładnie - masz dobry pomysł - BB i GB to są swego rodzaju czaso-przyśpieszacze :D

      Usuń
    2. A YB będzie jak Hyper-threading - nie dość że będziemy uginać czas to jeszcze pracować w światach równoległych.

      Usuń
  3. Osiołkowi w żłoby dano... Tyle tych poradników, że nie wiadomo co wybrać. Bloga znam od niedawna.

    OdpowiedzUsuń
    Odpowiedzi
    1. No właśnie, ledwo co wczoraj komentowałem pierwszą część, a tu już mi komórka pika, że wpadła czwarta - znów "nic" w robocie nie zrobię !! :)

      Usuń
  4. Witam obserwuję panie Mirku pańskiego bloga i muszę powiedzieć, że to co na nim znalazłem bardzo mnie zainteresowało. Teraz jednak, kiedy został uruchomiony cykl przydatnych filmików z pewnością będę obserwował go jeszcze baczniej pozdrawiam.

    OdpowiedzUsuń
  5. Pani Mirku, dobra robota!
    Czy w 6 części może będzie:
    (d+=m<3?y--:y-2,23*m/9+d+4+y/4-y/100+y/400)%7

    Pozdrawiam.

    OdpowiedzUsuń
    Odpowiedzi
    1. no dokładnie coś w tym stylu zdaje się (chociaż już nie pamiętam szczegółów proszę mi wybaczyć, bo zaimplemetowałem go sobie już ładnych kilka lat temu, i nie wracałem już do tego skoro mam działającą funkcję. Zaletą mojej funkcji jest fakt, że nie musimy korzystać z liczb zmiennoprzecinkowych ;) co jak wiadomo oszczędza mnóstwo pamięci Flash, a jak widzisz w twoim wzorze jest sobie liczba 2,93 ;)

      Usuń
  6. Pan Mirek jak super komputer rozprawia się z takimi równaniami.

    OdpowiedzUsuń
  7. Te obliczenia również wykorzystują tylko typ całkowity. Wszystkie zmienna są typu INT i wynik dzielenia również będzie INT. Jest to implementacja uniwersalnego wzoru Zellera do obliczania dnia tygodnia. Idealnie pasuje do tytułu 4 cz. tego poradnika „fitness dla mózgu” Pokazuje możliwości języka C. Cała funkcja obliczająca dzień tygodnia została zawarta w jednej linii kodu. Aby ta funkcja zadziałała prawidłowo zmienna d musi być typu int16_t.
    Pozdrawiam

    OdpowiedzUsuń
    Odpowiedzi
    1. Możliwe , pewnie masz rację - ale w tym wzorze widzę stałą 2,23 ? dobrze widzę ? to jest jednak stała zmiennoprzecinkowa

      Usuń
    2. Nie, to nie jest stała zmiennoprzecinkowa. To jest przykład na zastosowanie rzadko wykorzystywanego operatora , (przecinek).

      Usuń
    3. aaaa ;) ok ... no fajny sposób

      Usuń
  8. Niesamowity tekst :o Naprawde jestem w szoku, oczywiscie w tym pozytywnym sensie, jestem pod wielkim wrazeniem, nie wiedziałem, ze ktos może tak swietnie pisac :) Powiedz mi no, uczysz się gdzies pisac? Studiujesz jakas polonistykę? 1. Naprawde, gromkie brawa, chyle czola przed mistrzem pióra, hehe :) Mam nadzieje, ze jeszcze dlugo będziesz nas raczyć swoimi pieknymi wpisami :)

    OdpowiedzUsuń
    Odpowiedzi
    1. Dzięki ale ja nie uważam siebie za jakiegoś oratora/mówcę itp ;) Tym bardziej, że nigdzie nie uczyłem się jakoś specjalnie pisać, i na pewno nie studiowałem nigdy polonistyki ;) ... Stąd też zdarzają mi się (błędy za które oczywiście przepraszam bo sam ich niecierpię) .... ale no czasem lubię sobie coś tak od siebie po prostu powiedzieć ...

      Usuń
  9. W każdej wolnej chwili "pochłaniam" kolejną część poradnika. Jak na razie 3 części za mną. No i jako rasowy maruda czy jak kto woli malkontent:)) muszę stwierdzić, że to całe "ględzenie" Mirku jest wręcz wskazane, bo nie wiem jak do innych, ale do mnie najbardziej trafia właśnie takie drążenie tematu (włączając w to te różne dygresje) i najwięcej dzięki temu "łykam" C.
    Jak sobie przypomnę programowanie na studiach (a szczególnie formę przekazywania wiedzy) to nie ma porównania - z resztą nic już nie pamiętam z tego Pascala... a tutaj proszę bardzo - pod przykrywką niby ględzenia Maestro Mirek przekazuje samą esencję i praktyczne rozwiązania:)) Tak trzymać!:)

    OdpowiedzUsuń
  10. Kolejny super cykl poradników. Co mnie troszkę zasmuciło na koniec, to że koniec już takich poradników o module WiFi, a ja z niecierpliwością czekałem na choć jeden o UDP i coś o dwóch socketach. Wiem, że może mało osób to zainteresuje, ale myślę, że i sporo nowych przyciągnie.

    OdpowiedzUsuń
    Odpowiedzi
    1. Widzę, że nie tylko ja czekałem na UDP. Może jednak coś jeszcze powstanie. Dwa sockety to ciekawa sprawa i polecam w tym module - śmigają mega.

      Usuń
    2. Niedługo wyjdzie na jaw nowa mała hmm niemała (zależy jak dla kogo) niespodzianka ;) ... ale na razie ani mru mru ;)

      Tymczasem - Panowie - chyba się zagalopowałem - tzn źle wyraziłem w poradniku. To miała być ostatnia część odnośnie takich jakby hmmm najważniejszych możliwości sprzętowych naszych modułów, a na temat ich oprogramowania .... ło matko .... pewnie jeszcze będzie dużo - tylko że chyba w międzyczasie muszę przerwę zrobić małą po ostatnim jak dla mnie mega maratonie i nakręcić też kilka innych poradników.....

      A tym bardziej - że jak mówię - wkrótce mała niespodzianka odnośnie ,.... ale ok o tym potem ;)

      Usuń
    3. Czyżby mega zegar był ukończony? MMmmmmmmmm

      Usuń
    4. Nie nie - nie chodzi o zegar ... ;) chodzi o niespodziankę z modułem wifi

      Usuń
  11. Mirku, czy przewidujesz umieszczenie kodu z tego poradnika ??, bo przez te 10 odcinków, nie licząc tego pierwszego opisowego tak się kotłowało w trakcie tworzenia tego kodu, że ciężko się połapać, zwłaszcza takiemu początkującemu jak ja. :)

    OdpowiedzUsuń
  12. Panie Mirosławie.
    Mam pewną wątpliwość: czy podczas zmiany czasu letniego na zimowy program nie zapętli się? Chodzi o to, że w momencie gdy, nastąpi godzina 3 program cofnie zegar do drugiej, ale za godzinę nastąpi powtórka. Czy nie byłoby wskazane powołać zmienną LZ (lato-zima), i w momencie przejścia z czasu letniego na zimowy, jej wartość ulegałaby zmianie z 0 na 1 lub odwrotnie? Wówczas program sprawdziłby, czy już jest zima, czy jeszcze lato. W przypadku przejścia z zimy na lato problem się nie ujawni, ponieważ przesuwamy czas do przodu.
    Z poważaniem M.

    OdpowiedzUsuń
    Odpowiedzi
    1. Ale ja nie mam żadnej, nawet NAJMNIEJSZEJ wątpliwości, program nie zapętli się ;) Wszystko zostało nie tylko wzięte pod uwagę w tych rozbudowanych wyrażeniach warunkowych (proszę sobie to dobrze przeanalizować) ale też zostało przetestowane. Nie zapętli się dlatego, że po przestawieniu czasu z letniego na zimowy, już ten ostatni warunek nie będzie sprawdzany ;) ... Jak mówię - proszę sobie dokładnie przeanalizować jeszcze raz ;)

      Usuń
  13. Hej :) Na początku mojego komentarza chcialem Ci podziekowac za to, ze piszesz, bo robisz to naprawdę swietnie, a dzieki Twoim wpisom, szczegolnie przy porannej kawie, można naprawdę się odstresowac i pieknie zaczac dzien :) Jestem pelen podziwu, ciesze się, ze w gąszczu tego za przeproszeniem, piszac kolokwialnie badziewia, udało mi się trafic na taka perełkę :)

    OdpowiedzUsuń
  14. Witam. Mirku a możesz powiedzieć co to za tytuł piosenki która leci w podkładzie na końcu trzeciej części poradnika?

    OdpowiedzUsuń
    Odpowiedzi
    1. No nie mów, że nie poznajesz ? ;) ... toż to "kukurydza"

      Usuń
  15. Czy dostępny jest na jakieś stronie soft z bibliotekami z powyższego poradnika?

    OdpowiedzUsuń
    Odpowiedzi
    1. Nie, nie jest udostępniony na żadnej stronie ale wkrótce pojawią się te poradniki w postaci OffLine na DVD, na której to będą też umieszczone wszystkie kody źródłowe itp ... Całość będzie dostępna na:

      www.sklep.atnel.pl

      ale jeszcze trwają prace, więc trzeba będzie poczekać

      Usuń
  16. Mirku w jaki sposob jednym kliknieciem zakomentowywujesz wiele linii?

    OdpowiedzUsuń
  17. Jak ktos chce na szybko sprawdzic dzialanie funkcji ustawiania czasu. To mozna w terminalu wpisac czas w formacie atnel wi-fi i kliknac enter. Ja mam to tak zrobione ze podpinam atnel wi fi lub podlaczam sie pod uart i z programiku na kompie wysylam recznie string ustawiajacy rtc. Procek mysli ze przylecialo z wifi ,to bez znaczenia nalezy tylko zachowac kolejnosc zmiennych w sringu.

    OdpowiedzUsuń
  18. Witam, chciałbym zapytać odnośnie struktury. W jakich przypadkach używać kropki , a kiedy strzałki -> ,bo podczas oglądania odcinków trochę się już w tym pogubiłem.
    W BB ,też nie mogę znaleźć jednoznacznej odpowiedzi.

    OdpowiedzUsuń
    Odpowiedzi
    1. Odnośnie przykładów wskaźników i struktur jest mnóstwo przykładów ale już w GreenBooku, Jeśli go nie masz to poczytaj sobie bloga częściej - masz tu trzy takie spore artykuły i poradniki do nadrobienia ;)

      http://mirekk36.blogspot.com/2013/07/struktury-w-c-wyjasnijmy-sobie-dokadnie.html

      http://mirekk36.blogspot.com/2012/11/avr-eeprom-struktury-poradnik-do-ksiazek.html

      http://mirekk36.blogspot.com/2012/12/wskazniki-struktury-callbacki-jazda-bez.html

      po nich będziesz wiedział dokładnie o co "kaman" ;)

      a w ogromnym skrócie to kropki używamy gdy struktura jest zwykłą zmienną zaś strzałki gdy mamy wskaźnik na strukturę

      Usuń