<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=4&amp;t=12342&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-07-23T09:31:23+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=12342&amp;mode</id>
<entry>
<author><name><![CDATA[Atlantis]]></name></author>
<updated>2015-07-23T09:31:23+01:00</updated>
<published>2015-07-23T09:31:23+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12342&amp;p=135271#p135271</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12342&amp;p=135271#p135271"/>
<title type="html"><![CDATA[Re: Konwersja czasu z unix timestamp]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12342&amp;p=135271#p135271"><![CDATA[
<div class="quotetitle">mokrowski napisał(a):</div><div class="quotecontent"><br />https://pl.wikipedia.org/wiki/Network_Time_Protocol<br /><!-- m --><a class="postlink" href="https://pl.wikipedia.org/wiki/Uniwersalny_czas_koordynowany" >https://pl.wikipedia.org/wiki/Uniwersal ... ordynowany</a><!-- m --><br /><!-- m --><a class="postlink" href="https://pl.wikipedia.org/wiki/Czas_uniwersalny" >https://pl.wikipedia.org/wiki/Czas_uniwersalny</a><!-- m --><br /><!-- m --><a class="postlink" href="https://pl.wikipedia.org/wiki/Strefa_czasowa" >https://pl.wikipedia.org/wiki/Strefa_czasowa</a><!-- m --><br /><!-- m --><a class="postlink" href="https://www.iana.org/time-zones" >https://www.iana.org/time-zones</a><!-- m --><br />Filmy MIrka o dawcy czasu..<br /></div><br /><br />Ja teorię mniej-więcej znam...<br />Chodzi mi raczej o przykład praktycznej implementacji algorytmu, który robiłby to wszystko w sposób zautomatyzowany. Parę pomysłów mam, nie wiem jednak, czy są one najbardziej optymalnymi rozwiązaniami.<br /><br />Na chwilę obecną mam:<br />1) Synchronizację przez NTP<br />2) RTC zliczający sekundy w formacie uniksowym.<br />3) Procedurę konwertującą podany czas (Unix timestamp) do formy czytelnej dla człowieka i zapisującą go do struktury z rozbiciem na godziny, minuty, sekundy, dni itp.<br /><br />Ten zestaw jest w tej chwili wykorzystywany do oznaczania pomiarów oraz modyfikacji plików (FatFS) za pomocą czasu UTC.<br /><br />Mój pomysł na rozwiązanie jest następujący:<br /><br />1) Dodać procedurę stwierdzającą na podstawie podanej daty i godziny, czy mamy do czynienia z czasem letnim, czy zimowym. Kilka przykładów jest w sieci.<br />2) Przy konwersji z unix timestamp do struktury podawać czas na zasadzie (timestamp + offset*ILOSC_SEKUND_NA_DZIEN), jeśli tylko chcemy uzyskać na wyjściu czas lokalny.<br />3) Cyklicznie wywoływać funkcję sprawdzającą, czy mamy do czynienia z czasem letnim czy zimowym. Wynik jej działania zapisywać w osobnej zmiennej globalnej uint8_t offset. W takim wypadku jak częste powinny być wywołania? Wystarczy przy każdej pełnej minucie czy może jeszcze rzadziej?<br /><br />A może istnieje bardziej optymalny sposób? Może da się w jakiś sposób zorientować jaki mamy czas już podczas konwersji z czasu uniksowego do struktury?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2174">Atlantis</a> — 23 lip 2015, o 09:31</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Atlantis]]></name></author>
<updated>2015-07-18T12:41:35+01:00</updated>
<published>2015-07-18T12:41:35+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12342&amp;p=134873#p134873</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12342&amp;p=134873#p134873"/>
<title type="html"><![CDATA[Re: Konwersja czasu z unix timestamp]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12342&amp;p=134873#p134873"><![CDATA[
Hmm... Wykorzystałem jeszcze inny kod, wzorując się na zegarze ze strony Tuxgraphics.<br /><br />[syntax=c]#defineEPOCH_YR1970<br />#defineSECS_DAY86400UL<br />#defineLEAPYEAR(year)(!((year) % 4) &amp;&amp; (((year) % 100) || !((year) % 400)))<br />#defineYEARSIZE(year)(LEAPYEAR(year) ? 366 : 365)<br /><br />void rtc_gettime (uint32_t timestamp, RTC *rtc_struct) {<br /><br />uint32_t dayclock;<br />uint16_t dayno;<br />uint16_t tm_year = EPOCH_YR;<br />uint8_t tm_sec,tm_min,tm_hour,tm_wday,tm_mon;<br /><br />dayclock = timestamp % SECS_DAY;<br />dayno = timestamp / SECS_DAY;<br /><br />tm_sec = dayclock % 60UL;<br />tm_min = (dayclock % 3600UL) / 60;<br />tm_hour = dayclock / 3600UL;<br />tm_wday = (dayno + 4) % 7;/* day 0 was a thursday */<br />while (dayno &gt;= YEARSIZE(tm_year)) {<br />dayno -= YEARSIZE(tm_year);<br />tm_year++;<br />}<br />tm_mon = 0;<br />while (dayno &gt;= monthlen(LEAPYEAR(tm_year),tm_mon)) {<br />dayno -= monthlen(LEAPYEAR(tm_year),tm_mon);<br />tm_mon++;<br />}<br />rtc_struct-&gt;year = tm_year;<br />rtc_struct-&gt;month = tm_mon+1;<br />rtc_struct-&gt;mday = dayno+1;<br />rtc_struct-&gt;wday = tm_wday+1;<br />rtc_struct-&gt;hour = tm_hour;<br />rtc_struct-&gt;min = tm_min;<br />rtc_struct-&gt;sec = tm_sec;<br /><br />}[/syntax]<br /><br />Działa, jednak pokazuje czas spóźniony o dwie godziny. Podejrzewam wiec, że została w nim zakodowana na stałe inna strefa czasowa.<br />Co powinienem zmienić, żeby funkcja działała prawidłowo w polskich warunkach? Wiem, że mógłbym ręcznie dodawać te dwie godziny, ale przecież to nie załatwi sprawy zmiany czasu z letniego na zimowy i odwrotnie. Jak powinien wyglądać ko realizujący taką funkcjonalność.<br /><br />I jeszcze odnośnie zmiany czasu. Jak to jest zwykle realizowane w datalogerach? W jakim formacie zapisuje się czas odczytu? Bo chyba nie w czasie lokalnym, w którym jedna godzina może wystąpić ponownie. UTC? A może wystarczy czas uniksowy?<br /><br />W jaki sposób powinna być zrealizowana obsługa sekund przestępnych? A może są one uwzględniane już na poziomie systemu NTP?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2174">Atlantis</a> — 18 lip 2015, o 12:41</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Atlantis]]></name></author>
<updated>2015-07-15T12:12:29+01:00</updated>
<published>2015-07-15T12:12:29+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12342&amp;p=134597#p134597</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12342&amp;p=134597#p134597"/>
<title type="html"><![CDATA[Konwersja czasu z unix timestamp]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12342&amp;p=134597#p134597"><![CDATA[
Już parę razy stosowałem w swoich projektach prosty RTC, zbudowany w oparciu o Timer2 i kwarc zegarkowy. Ponieważ nie było mi potrzebne wyświetlanie czasu w formie czytelnej dla człowieka, stosowałem Unix Timestamp (32 bitowa zmienna, licząca ilość sekund, jakie upłynęły od 1 stycznia 1970 roku). Niebywałą zaletą takiego rozwiązania jest łatwość synchronizacji za pomocą NTP oraz prosta obsługa samego zegara - wystarczy zwiększać zmienną o 1 w przerwaniu 1Hz.<br />Teraz jednak pojawiła się konieczność przetłumaczenia tej zmiennej na &quot;ludzki&quot; czas, uwzględniający strefę czasową, czas letni i zimowy, a także lata i sekundy przestępne. Odpowiednia funkcja będzie wykonywana tylko od czasu do czasu - użyję jej do oznaczania plików w FatFS oraz wyświetlania czasu na LCD/OLED (który jednak będzie aktywny tylko na żądanie). Z tego powodu nie opłaca mi się odchodzenie od czasu Uniksowego, na rzecz kaskady instrukcji warunkowych, wykonywanych w przerwaniu zegara.<br /><br />W Linuksie dostępne są wygodne funkcje, konwertujące czas systemowy do formy struktury albo tekstu.<br />Czy ktoś zetknął się z podobnym, sprawdzonym kodem dla AVR, ewentualnie Arduino, który można by przeportować?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2174">Atlantis</a> — 15 lip 2015, o 12:12</p><hr />
]]></content>
</entry>
</feed>