eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronikaRóżny czas pomimo synchronizacji z NTPRe: Różny czas pomimo synchronizacji z NTP
  • Data: 2014-11-12 15:45:05
    Temat: Re: Różny czas pomimo synchronizacji z NTP
    Od: Atlantis <m...@w...pl> szukaj wiadomości tego autora
    [ pokaż wszystkie nagłówki ]

    W dniu 2014-11-12 15:02, Marek pisze:

    > Bez synch. późni się czy spieszy?

    Spóźnia się. Z każdą chwilą coraz bardziej.


    > Pisałeś, że ten *time liczysz w przerwaniu timera 1ms, który odlicza
    > czas lokalny, uwzględniłeś czas tych obliczeń *time (maltretujesz
    > 8bit mcu obliczeniami na int32, timer powinien być aktywny podczas
    > ich trwania)?

    W tej chwili używam przerwania 10ms.
    Hmm... Uważasz, że operacje na zmiennych mogą zajmować więcej czasu,
    przez co różnica odkłada się z każdą sekundą?
    Czy to (wraz z czasem potrzebnym na obliczenie nowego czasu z pakietu
    NTP) tłumaczyłoby także początkowe, kilkusekundowe opóźnienie,
    pojawiające się zwykle po synchronizacji?

    Funkcja obsługująca przerwanie wygląda następująco:

    ISR(TIMER0_COMPA_vect) {
    ten_millis++;

    if (ten_millis > 100) {
    geiger_pulses[seconds] = TCNT1;
    TCNT1 = 0;
    seconds = (seconds + 1) % 60;

    one_second_tick = 1;

    uptime++;
    if (rtc) rtc++;
    if (ntp_update_timer) ntp_update_timer--;
    if (bmp085_update_timer) bmp085_update_timer--;
    if (dht_update_timer) dht_update_timer--;
    if (graphite_upload_timer) graphite_upload_timer--;

    ten_millis = 0;
    }
    }

    Pierwszy blok poleceń w instrukcji warunkowej to obsługa licznika
    Geigera (właściwe główny czujnik zamontowany w tym urządzeniu) - co
    sekundę ilość impulsów zliczonych przez licznik sprzętowy jest
    zapisywana do tablicy, sam licznik jest czyszczony i liczony jest numer
    kolejnego pola do zapisania.

    Zmienna "one_second_tick" to uint8_t - jej jedyną funkcją jest
    przekazywanie do pętli głównej informacji o przekręceniu się licznika
    sekund.

    Zmiennymi 32bitowymi są jedynie uptime i rtc.
    Zmienne bmp085_update_timer i dht_update_timer mają rozmiar ośmiu bitów
    - odliczają czas pomiędzy kolejnymi odczytami czujników BMP085 oraz DHT11.
    Podobne jest przeznaczenie szesnastobitowych zmiennych ntp_update_timer
    oraz graphite_upload_timer, które odliczają czas do kolejnego wysłania
    requesta do serwera NTP oraz uploadu wyników pomiarów do Graphite'a.

    Jeśli to tu leży przyczyna, to w jaki sposób powinienem wprowadzić
    poprawkę? Jak ustalić czas potrzebny do wykonania tych operacji?

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: