ESP8266 i RTC

Ktoś z was ma jakiś pomysł na zaimplementowanie w miarę dokładnego zegara czasu rzeczywistego na ESP8266? Przez "w miarę dokładny" mam na myśli taki, którzy nie "odpływałby" więcej jak kilka sekund na dobę, pozwalając by synchronizacja z NTP co kilka godzina załatwiała sprawę.

W najnowszym SDK mamy gotowe funkcje do pobierania czasu z serwera NTP. Problemem jest późniejsza inkrementacja zmiennej, w której trzymamy czas. Najprościej byłoby użyć mechanizmu timera programowego (os_timer_t), ale on nie gwarantuje wykonania przypisanej funkcji dokładnie po upływie zadanego odcinka czasu. Czas będzie więc sobie pływał...

Dokumentacja najnowszego SDK (wersja 1.1.1) opisuje co prawda funkcje hw_timer, jednak nie widzę nigdzie odpowiadającego im pliku nagłówkowego, ani przykładów. Sam opis jest bardzo oględny i lakoniczny. Czyżby do dokumentacji trafiła jeszcze nie zaimplementowana funkcjonalność?

W końcu mamy też dwie takie funkcje: system_get_time() - zwraca ilość us od startu systemu (z grubsza coś jak millis() w Arduino) system_get_rtc_time() - zwraca ilość taktów zegara RTC system_get_rtc_calib() - zwraca długość trwania taktu zegara RTC z dokładnością do 0,1us.

Na podstawie tego można wyliczyć jak długo pracuje zegar. Dałoby się jakoś wykorzystać ten mechanizm do dokładnego "taktowania" zmiennej, w której trzymam czas w formacie uniksowym, synchronizowany z ntp?

Na razie wolałbym uniknąć stosowania zewnętrznego układu RTC na I2C.

Reply to
Atlantis
Loading thread data ...

Atlantis snipped-for-privacy@wp.pl napisał(a):

Możesz synchronizować co kilka minut. Zwykle synchronizację z NTP wykonuje się rzadziej, ale co Ci szkodzi?

PS. Nie obraź się, ale myślę, że niedawna wypowiedź jednego z grupowiczów na temat Twojego podejścia, jako rozwiązywania problemów nieistniejących gdzie indziej, była całkiem trafna. ESP8266 to chińszczyzna za 5 dolarów. Całkiem fajna chińszczyzna, ale próbujesz traktować ją jako pełnoprawny komputer. Może lepiej rozejrzeć się za modułem, dla którego dokładny timer jest oczywistością? Albo doczepić zewnętrznego RTC? To takie luźne przemyślenia. Nie traktuj tego jako krytyki Twoich postów, które uważam za wartościowe.

Reply to
Grzegorz Niemirowski

Pan Grzegorz Niemirowski napisał:

Nie wiem nawet co za jeden, ten ESP8266 (no, wiem już, że chińszczyzna za pięc dolców) ani nie wiem jak tam NTP zaimplementowano. Ale zaletą tego wynalazku (NTP) jest to, że nie trzeba synchronizować prawie wcale. Bo jak już czas z sieci zostanie dany mu raz i drugi, to komputer sobie z tego wylicza poprawkę (dryft) i spowalnia lub przyśpiesza bieg wewnętrznego zegara. Tak więc porządny komputer o rozstrojonej częstotliwości zegara taktującego, gdy ma odpalone NTP, to nawet po odpięciu od sieci powinien chodzić dobrze. Byle tylko kwarc był sam w sobie stabilny.

Jarek

Reply to
invalid unparseable

W dniu 2015-06-19 o 00:11, Jarosław Sokołowski pisze:

Wiesz, ESP8266 nie jest żadnym "porządnym komputerem". To prosta płytka na małym, 32bitowym mikrokontrolerze z wbudowanym sterownikiem WiFi. Twórcy po prostu udostępnili w SDK filka funkcji do obsługi SNTP. Może zdefiniować do trzech serwerów. Potem każde wywołanie pewnej funkcji zwróci pobrany czas w formacie uniksowym. Resztą trzeba się już zająć samodzielnie.

W SDK jest też zestaw narządzi do periodycznego wykonywania określonej funkcji, liczenia us od startu systemu (coś jak millis() w Arduino), zliczania cykli zegara RTC i pomiaru długości cyklu. Pewnie dałoby się na tej podstawie zrobić dość dokładny zegar. Po prostu pytam o najlepszy sposób. Niewykluczone zresztą, że Espressif doda odpowiednie funkcje w którejś z kolejnych wersji SDK.

Reply to
Atlantis

Atlantis pisze:

Tego już się dowiedziałem.

Skoro nie udostępnili funkcji do wprowadzania poprawek dla tempa pracy wewnętrznego zegara, to nic się nie da zrobić, poza okresowym ustawianiem godziny z zewnętrznego źródła. Jeśli jest dostęp do sieci i serwera czasu w niej, to czemu tego nie robić zawsze w ten sposób? Niby można przy każdej poprawce (co 1000 sekund powiedzmy) zwracać uwagę na to, jak duża była różnica czasu. I aplikować ją później na raty, co 100, 10 czy jedną sekundę. Ale takie rzeczy powinny być zrobione na niższym poziomie. Wyżej chyba nie warto.

Reply to
invalid unparseable

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.