eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronikaRóżny czas pomimo synchronizacji z NTP › Różny czas pomimo synchronizacji z NTP
  • Path: news-archive.icm.edu.pl!news.icm.edu.pl!wsisiz.edu.pl!.POSTED!not-for-mail
    From: Atlantis <m...@w...pl>
    Newsgroups: pl.misc.elektronika
    Subject: Różny czas pomimo synchronizacji z NTP
    Date: Wed, 12 Nov 2014 01:35:22 +0100
    Organization: http://www.wit.edu.pl
    Lines: 32
    Message-ID: <m3ua09$pji$1@portraits.wsisiz.edu.pl>
    NNTP-Posting-Host: cgk31.neoplus.adsl.tpnet.pl
    Mime-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    X-Trace: portraits.wsisiz.edu.pl 1415752521 26226 83.30.238.31 (12 Nov 2014 00:35:21
    GMT)
    X-Complaints-To: a...@w...edu.pl
    NNTP-Posting-Date: Wed, 12 Nov 2014 00:35:21 +0000 (UTC)
    User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101
    Thunderbird/24.6.0
    Xref: news-archive.icm.edu.pl pl.misc.elektronika:673797
    [ ukryj nagłówki ]

    Eksperymentowałem ostatnio z synchronizacją czasu w układzie z Atmegą i
    ENC28J60. Użyłem gotowych funkcji zaimplementowanych w stosie
    tuxgraphics.org, z niewielkimi modyfikacjami (głównie przeliczanie
    odebranej wartości na Unix epoch.
    Generalnie rozwiązanie jest bardzo proste. Programowy licznik odlicza w
    dół liczbę sekund pomiędzy kolejnymi synchronizacjami (w tej chwili
    3600). Gdy dojdzie do zera wysyłany jest pakiet z requestem.
    Jednocześnie w momencie przyjścia pakietu UDP funkcja sprawdza, czy mamy
    do czynienia z odpowiedzią - jeśli tak, to do zmiennej volatile int32_t
    rtc ładowany jest odebrany czas.
    Obliczanie wartości wygląda następująco:

    *time = ( ( ((uint32_t)buf[0x52]<<24) | ((uint32_t)buf[0x53]<<16) |
    ((uint32_t)buf[0x54]<<8) | ((uint32_t)buf[0x55]) ) - 2208988800UL )

    Pomiędzy synchronizacjami zegar jest inkrementowany w przerwaniu timera.
    Przerwanie jest wywoływane co 1ms - normalnie zwiększana jest zmienna
    pomocnicza, jednak w przypadku przekroczenia przez nią wartości 1000
    uruchamia się obsługa zegara i kilku programowych liczników.

    Program zdaje się działać prawidłowo, jednak byłem ciekaw na ile jest
    dokładny. Napisałem prosty skrypt na Raspberry Pi, który odczytuje czas
    z omawianego urządzenia i odejmuje go od czasu systemowego w RasPi.
    Wyniki są dziwne. Nieraz mam kilka sekund różnicy, czasem jednak pojawia
    się wynik w granicach 60 sekund. Niekiedy większą różnicę obserwuję tuż
    po synchronizacji.

    Nie wydaje mi się, żeby mogło to wynikać z niedokładności timera Atmegi
    - niewielki dryf ie objawiłby się tak szybko. No chyba, że jeszcze zegar
    w RasPi ma tak tragiczną stabilność.

    Gdzie mogę szukać przyczyn takiego zachowania?

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: