eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronikaRóżny czas pomimo synchronizacji z NTP
Ilość wypowiedzi w tym wątku: 54

  • 21. Data: 2014-11-12 17:43:38
    Temat: Re: Różny czas pomimo synchronizacji z NTP
    Od: Atlantis <m...@w...pl>

    W dniu 2014-11-12 17:21, Jakub Rakus pisze:

    > Prawdę powie Ci kod w assemblerze, zajrzyj tam i policz ile to
    > instrukcji wymaga. Takie liczenie bywa upierdliwe, szczególnie gdy
    > fragment kodu zawiera jakieś pętle i odwołania do funkcji, ale wynik
    > bywa zaskakujący i dobrze uświadamia gdzie spędzamy za dużo czasu.

    Hmm... To ja głupio zapytam - w jaki sposób dostać się do tego kodu?
    Istnieje jakiś sposób na ustalenie która część kodu odpowiada danemu
    fragmentowi w C? Bo niestety nie znam asemblera AVR-ów, a z jako takim
    miałem do czynienia przed laty, robiąc proste "wprawki" pod x86...

    Generalnie istnieje jeszcze jakaś inna możliwa przyczyna takiego
    zachowania programu? Najbardziej dziwi mnie to, że opóźnienie wynosi
    kilka sekund tuż po ostatniej synchronizacji, a sprowadzenie go do 0-1s
    wymaga wielokrotnych, wymuszanych synchronizacji, jedna po drugiej.

    Generalnie układ nie był projektowany z myślą o liczeniu czasu. Gdybym
    wiedział o tym na początku, zastosowałbym inny mikrokontroler, dający
    możliwość podłączenia zewnętrznego kwarcu zegarkowego i generowania
    przerwań z częstotliwością dokładnie 1Hz. To już trochę ułatwiłoby
    sprawę, gdyż nie musiałbym zliczać milisekund w przerwaniu.


  • 22. Data: 2014-11-12 19:50:26
    Temat: Re: Różny czas pomimo synchronizacji z NTP
    Od: Jakub Rakus <s...@o...pl>

    On 12.11.2014 17:43, Atlantis wrote:

    > Hmm... To ja głupio zapytam - w jaki sposób dostać się do tego kodu?

    Nie wiem jakiego tam kompilatora używasz, ale jeśli GCC to wystarczy
    dodać flagę -S i masz kod asemblera w pliku z rozszerzeniem .s

    > Istnieje jakiś sposób na ustalenie która część kodu odpowiada danemu
    > fragmentowi w C? Bo niestety nie znam asemblera AVR-ów, a z jako takim
    > miałem do czynienia przed laty, robiąc proste "wprawki" pod x86...

    Jak potrzebujesz bardziej zaawansowanych opcji (np. przeplatanie kodu
    C/ASM):
    http://www.delorie.com/djgpp/v2faq/faq8_20.html

    > Generalnie istnieje jeszcze jakaś inna możliwa przyczyna takiego
    > zachowania programu? Najbardziej dziwi mnie to, że opóźnienie wynosi
    > kilka sekund tuż po ostatniej synchronizacji, a sprowadzenie go do 0-1s
    > wymaga wielokrotnych, wymuszanych synchronizacji, jedna po drugiej.

    Nie wiem co tam się dzieje w pozostałej części programu, być może masz
    tam kilka przerwań, które przerywają się nawzajem zbyt często.
    Generalnie wiele przerwań a atmegach to śliska sprawa, trzeba dobrze
    rozplanować ich wykonywanie, bo te procki nie mają jako takich "jawnych"
    priorytetów przerwań. Może dobrze by było odebrane dane z pakietu
    wyrzucać na jakiś uart, niestety dla atmegi to jest chyba najszybszy
    sposób na debugowanie.

    --
    Pozdrawiam
    Jakub Rakus


  • 23. Data: 2014-11-12 19:53:04
    Temat: Re: Różny czas pomimo synchronizacji z NTP
    Od: Marek <f...@f...com>

    On Wed, 12 Nov 2014 15:45:05 +0100, Atlantis <m...@w...pl>
    wrote:
    > Jeśli to tu leży przyczyna, to w jaki sposób powinienem wprowadzić
    > poprawkę? Jak ustalić czas potrzebny do wykonania tych operacji?

    Kod wygląda ok, myślałem, że w przerwaniu robisz te obliczenia. Nie
    znam się na avr ale domyślam się z kodu, że przerwanie generowane
    jest przez komparator tmera, przy czym timer biegnie dalej w trakcie
    obsługi przerwania, tak? Ja bym na razie w funkcji main () obserwował
    tylko wartość uptime (np. wyświetlając ja przez uart przy każdej jej
    zmianie, taki stoper) . Chodzi o to by się upewnić czy lokalne
    odliczanie sekund jest ok. Na pickach bez kwarcu odliczanie sekund
    (uptime) taką metodą jak Ty zastosowałeś (przerw. co 10ms) na dobę
    rozjezdżało mi się max kilka - kilkanaście sekund względem dobrego
    zegarka.

    --
    Marek


  • 24. Data: 2014-11-12 20:00:50
    Temat: Re: Różny czas pomimo synchronizacji z NTP
    Od: Atlantis <m...@w...pl>

    Hmm... Nie wydaje mi się, żeby tu chodziło tylko o zajmowanie cykli
    procesora przez operacje na zmiennych 32bitowych w przerwaniu.
    Trochę przerobiłem program:

    1) Zwiększyłem czas pomiędzy kolejnymi przerwaniami do 20 ms.
    2) Przeniosłem obsługę niekrytycznych timerów do pętli głównej. Nic
    złego się nie stanie, jeśli od czasu do czasu odczyt jakiegoś czujnika
    opóźni się o sekundę albo uptime będzie pokazywał wartość zafałszowaną o
    kilka sekund.

    W tej chwili procedura obsługi przerwania wygląda następująco:

    ISR(TIMER0_COMPA_vect) {
    twenty_millis++;

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

    one_second_tick = 1;

    if (rtc) rtc++;

    twenty_millis = 0;
    }
    }

    Normalnie jest to tylko inkrementacja jednej zmiennej ośmiobitowej. Raz
    na sekundę dochodzi do tego jeszcze kilka operacji na zmiennych
    szesnastobitowych oraz inkrementacja zegara (zmienna 32bit), jeśli czas
    został już pobrany. Trochę trudno mi uwierzyć, że zajmuje to więcej niż
    20ms...

    Poza tym jest jeszcze jedna dziwna sprawa - parę razy tuż po wymuszonej
    synchronizacji czasu zauważyłem opóźnienie wynoszące np. 3 albo i 10
    sekund. Przecież niemożliwe, żeby taka wartość nabiła się w kilka sekund!


  • 25. Data: 2014-11-12 20:07:36
    Temat: Re: Różny czas pomimo synchronizacji z NTP
    Od: Marek <f...@f...com>

    On Wed, 12 Nov 2014 17:43:38 +0100, Atlantis <m...@w...pl>
    wrote:
    > Hmm... To ja głupio zapytam - w jaki sposób dostać się do tego kodu?
    > Istnieje jakiś sposób na ustalenie która część kodu odpowiada danemu
    > fragmentowi w C? Bo niestety nie znam asemblera AVR-ów, a z jako
    takim

    Ale poczekaj, sprawdż najpierw czy lokalnie czas (bez ntp) w miarę
    precyzyjnie odliczasz (max rozjazd kilkanascie sek. na dobę).
    Twoje przerwanie wygląda ok, nie powinno wprowadzać błędu o ile nie
    ma innych przerwań blokujące to od timera. No i oczywiście timer musi
    biegać podczas obsługi przerwania, aby czas jego obsługi nie dodawał
    się do biegu timera. Przerwanie jest krótkie, a 10ms interwał
    spokojnie powinien dać czas na jego obsługę. Atmega odkłada flagę
    przerwania gdy ono nastąpi po cli() aby je wywoływać zaraz po sei()?
    Jeśli czas lokalny będzie liczony ok to wtedy weryfikuj kod
    synchronizujący czas ntp.

    --
    Marek


  • 26. Data: 2014-11-12 20:48:31
    Temat: Re: Różny czas pomimo synchronizacji z NTP
    Od: Atlantis <m...@w...pl>

    W dniu 2014-11-12 20:07, Marek pisze:

    > Ale poczekaj, sprawdż najpierw czy lokalnie czas (bez ntp) w miarę
    > precyzyjnie odliczasz (max rozjazd kilkanascie sek. na dobę).

    To już wiem. Domyślnie synchronizacje zegara są wykonywane co godzinę. W
    tej chwili mam 26 sekund opóźnienia po 18 minutach od uruchomienia układu...


    > Twoje przerwanie wygląda ok, nie powinno wprowadzać błędu o ile nie
    > ma innych przerwań blokujące to od timera.

    W tym programie nie występują żadne inne przerwania. Drugi,
    szesnastobitowy timer pracuje w trybie licznika, nie wywołując żadnych
    przerwań.


    > No i oczywiście timer musi biegać podczas obsługi przerwania, aby
    > czas jego obsługi nie dodawał się do biegu timera. Przerwanie jest
    > krótkie, a 10ms interwał spokojnie powinien dać czas na jego
    > obsługę.

    W tej chwili dałem 20ms i wyrzuciłem mniej krytyczne instrukcje do pętli
    głównej. Problem ciągle występuje.


    > Atmega odkłada flagę przerwania gdy ono nastąpi po cli() aby je
    > wywoływać zaraz po sei()?

    Tego nie jestem pewien, ale z ciekawości zrezygnowałem ze stosowania
    cli() i sei() przy odczycie/zapisie zmiennej rtc. Chciałem zobaczyć czy
    dryf będzie nadal występował. Występuje...


    > Jeśli czas lokalny będzie liczony ok to wtedy weryfikuj kod
    > synchronizujący czas ntp.

    Nie jest liczony ok, jednak tej synchronizacji też nie jestem pewien.
    Kilka razy zauważyłem, że skrypt pokazywał nawet kilkanaście sekund
    opóźnienia (albo i więcej) tuż po starcie urządzenia albo wymuszonej
    synchronizacji.


  • 27. Data: 2014-11-12 21:26:46
    Temat: Re: Różny czas pomimo synchronizacji z NTP
    Od: Marek <f...@f...com>

    On Wed, 12 Nov 2014 20:48:31 +0100, Atlantis <m...@w...pl>
    wrote:
    > To już wiem. Domyślnie synchronizacje zegara są wykonywane co
    godzinę. W
    > tej chwili mam 26 sekund opóźnienia po 18 minutach od uruchomienia
    układu...

    To za dużo. Takie rozbieżności wskazują na źle dobrane wartości do
    wygenerowania przerwania timera (pre/post scaler itp) albo timer
    jest wstrzymywany gdy przerwanie jest obsługiwane.

    --
    Marek


  • 28. Data: 2014-11-12 21:29:38
    Temat: Re: Różny czas pomimo synchronizacji z NTP
    Od: "J.F." <j...@p...onet.pl>

    Dnia Wed, 12 Nov 2014 12:43:21 +0100, Atlantis napisał(a):
    > W dniu 2014-11-12 12:17, J.F. pisze:
    >> Porownujesz z jakims innym urzadzeniem ... ale jakim ?
    >
    > Porównałem z webowymi wzorcami (np. currenttimestamp.com). Pokazują
    > dokładnie to samo, co Raspberry Pi. Czas na Atmedze prawie zawsze różni
    > się o pewną liczbę sekund...

    Czekaj, zaczynam rozumiec.
    Atmel wysyla pakiet NTP, przychodzi odpowiedz, atmega ustawia swoj
    zegar na podstawie tego co przyszlo.
    Potem sobie powieksza wlasny zegar w przerwaniach, a gdzies obok RasPi
    odczytuje zegar z atmegi, odczytuje z ntp, porownuje i wychodzi mu
    roznica znaczna ?
    Mimo ze niedawno atmega ustawila czas w/g pakietu NTP?

    Ja bym zrezygnowal z tego RasPi, wyrzucal wszystko tekstowo, i
    porownywal naocznie.

    Ale co mi sie nasuwa:
    -czy oba korzystsja z tego samego serwera - ale mysle ze nawet jak z
    innych to czas powinien byc zgodny,
    -o ile kojarze, to NTP jest bardziej skomplikowany, wysyla sie w dwie
    strony pakiety - moze cos nie/zle ustawiles ?
    -czy przerwania tam dobrze wspoldzialaja ? Bo jak rozumiem -
    przychodzi pakiet, w przerwaniu ustawiasz timer, w przerwaniu go
    powiekszasz - to sie moze cos zle dziac. Ale rzadko.

    -jaki masz czas odpowiedzi ? Moze cos tam sie w sieci blokuje i
    pakiety gdzies czekaja

    -typowo na unixach NTP nie przestawia zegara, tylko go zwalnia lub
    przyspiesza i zmiana jest rozciagnieta w czasie. Unix nie lubi skokow
    czasu. Ale to by dotyczylo RP, bo na ATmega jak rozumiem sam
    programujesz.

    Ale najbardziej podejrzewam:
    -czy dobrze odczytujesz tego ENC i przerwania dobrze przychodza ?
    Bo jakby tak pakiet przychodzil, ale atmega nic o tym nie wiedziala,
    tylko czekala, a odczytywala pakiet przy calkiem innej okazji, ktora
    nadejdzie nie wiadomo kiedy - to by tak moglo byc jak opisujesz.

    J.


  • 29. Data: 2014-11-12 21:36:58
    Temat: Re: Różny czas pomimo synchronizacji z NTP
    Od: Marek <f...@f...com>

    On Wed, 12 Nov 2014 21:29:38 +0100, "J.F."
    <j...@p...onet.pl> wrote:
    > Ale najbardziej podejrzewam:
    > -czy dobrze odczytujesz tego ENC i przerwania dobrze przychodza ?
    > Bo jakby tak pakiet przychodzil, ale atmega nic o tym nie
    wiedziala,
    > tylko czekala, a odczytywala pakiet przy calkiem innej okazji,
    ktora
    > nadejdzie nie wiadomo kiedy - to by tak moglo byc jak opisujesz.

    Przecież mu się czas już źle liczy lokalnie z timera a co dopiero z
    ntp.

    --
    Marek


  • 30. Data: 2014-11-12 22:20:25
    Temat: Re: Różny czas pomimo synchronizacji z NTP
    Od: Atlantis <m...@w...pl>

    W dniu 2014-11-12 21:26, Marek pisze:

    > To za dużo. Takie rozbieżności wskazują na źle dobrane wartości do
    > wygenerowania przerwania timera (pre/post scaler itp)

    Hmm... Faktycznie coś jest nie tak z timerem.
    Wyłączyłem synchronizację przez NTP i kazałem po starcie programu
    inkrementować zmienną rtc od 1 w górę. Po trochę ponad godzinie
    nazbierało się 81 sekund opóźnienia...


    > albo timer jest wstrzymywany gdy przerwanie jest obsługiwane.

    Jak to sprawdzić?

strony : 1 . 2 . [ 3 ] . 4 ... 6


Szukaj w grupach

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: