Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 9 lip 2025, o 14:43


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 
    Autor Wiadomość
    PostNapisane: 14 sie 2018, o 07:44 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 31 gru 2014
    Posty: 88
    Pomógł: 2

    Witajcie
    nie mam pewności czy dobrze zrozumiałem fragment kodu dotyczący obsługi zdarzenia GetNtpTime_EVENT( &stimers[1].cnt , 10,0,0, NULL ); Poglądowo i dużym skrócie cod:

    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Nie mogłem zrozumieć dlaczego działa funkcja (f.) GetNtpTime_EVENT( &stimers[1].cnt , 10,0,0, NULL ); bo f.timer_init( 1, 5000, 0, NULL ); określa
    wszystkie parametry stimer[1] (1-index tablicy/timera, 5000-interval 5s, 0- enable OFF (1-ON), NULL nie wykorzystujemy własnej funkcji callback-owej)
    3-ci parametr funkcji timer_init (enabled) mając wartość 0 wyłącza timer1, f. TIMERS_EVENT nie wywoła dla stimer[1] f. timers_process
    bo wartość wyrażenia if( stimers[1].enabled ) jest FALSE inaczej mówiąc bez wywołania f.timers_process nie może wykonać się: wywołanie f.callback oraz ponowne załadowanie licznika cnt.
    Jednak dekrementacja stimers[1].cnt dokonuje się w przerwaniu Timera2 f. tmr_irq_tick dla każdego licznika stimers[i].cnt niezależnie od wartości parametru
    enabled dlatego po osiągnięciu warności 0 (stimers[1].cnt) wykonają się instrukcje zawarte w f.GetNtpTime_EVENT wartość licznika stimers[1].cnt jest przekazana zmienną wskaźnikową stąd wyrażenie
    if( !*tmr_10ms ) będzie miało wartość TRUE i instrukcje zawarte w f.GetNtpTime_EVENT zostaną wykonane po 5s od startu programu a wiec po wartości jaką określono f.timer_init( 1, 5000, 0, NULL ).
    Wykonanie instrukcji zawartych w f.GetNtpTime_EVENT( &stimers[1].cnt , 10,0,0, NULL ) określi nową wartość *tmr_10ms = 10; (100ms) oraz czas/okres synchronizacji NTP zmienną co_ile_czasu ja dla testu ustawiłem 10s chciałem ten proces częściej obserwować na wyświetlaczu.

    Proszę Was o info czy to co napisałem jest TRUE or FALSE



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 14 sie 2018, o 08:03 
    Offline
    Moderator
    Avatar użytkownika

    Dołączył(a): 03 paź 2011
    Posty: 27415
    Lokalizacja: Szczecin
    Pomógł: 1043

    Ja bym chętnie pomógł (i nie piszę tego teraz złośliwie czy coś) ... ale napisałeś taki zbitek myśli, bez żadnego przecinka czy kropki prawie - wszystko jednym ciurkiem ...

    ale ok opiszę w skrócie jak działa ten mechanizm bo być może coś ci umknęło.

    1. to jest CAŁKOWICIE inne podejście niż z Bluebooka

    2. przygotowana została fajna funkcja napędzająca timery programowe o nazwie tmr_irq_tick(); którą wystarczy odpalać w jakimś timerze sprzętowym odpalanym np co 10ms ... ale wtedy nie jest kompletnie potrzebny ten IF (To jest podobne z kolei podejście jakie pokazałem w bibliotece Matrix KEYBOARD https://www.youtube.com/watch?v=b1dAuBJm7EQ , gdzie też wystarczy do przerwania timera sprzętowego co 10ms - dodać małą napędzającą obsługę klawiatury/klawiszy ;) )

    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    opisuję przecież w YB skąd się wziął ten IF, ale przypomnę, wykorzystałem bowiem przerwanie które odbywa się 5x szybciej niż 10ms i stąd zrobiłem licznik i warunek IF, żeby funkcja obsługująca timery programowe wykonywała się jednak co 10ms a nie szybciej. Jeśli sam tworzysz timer sprzętowy napędzany co 10ms to w ogóle ten IF jest przecież niepotrzebny


    3. Argument timera ON/OFF nie jest do tego, żeby nie działał jego counter. On będzie zawsze tykał jeśli timer powołany jest do życia. Parametr ON/OFF mówi o tym czy ma być odpalane zdarzenie timera programowego o ile podłączyłeś do niego jakąś funkcję. Bo jeśli jako ostatni parametr dałeś NULL to argument ON/OFF będzie ignorowany.


    4. funkcja GetNtpTime_EVENT() może działać ponieważ przekazujemy do niej tylko wskaźnik do countera jednego z powołanych timerów programowych ;) ona go wewnątrz zagospadarowuje na swoje potrzeby ;) ... ale jakbyś chciał to równie dobrze mógłbyś podłączyć jeszcze swoje zdarzenie (swoją funkcję) zamiast tego NULL przy definicji tego timera. Wtedy w oparciu o jeden timer programowy działałby i GetNtpTime_EVENT() i twoja funkcja. Tyle że GetNtpTime_EVENT() panuje nad counterem i zmienia jego zawartość więc trzeba mieć to na uwadze

    _________________
    zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 14 sie 2018, o 08:25 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 31 gru 2014
    Posty: 88
    Pomógł: 2

    Dzięki Mirek za odp. jest zgodna z moim "zbitkiem" no wiesz jak się mieli coś długo to właśnie później wychodzi taka mielonka.

    Jednak nie zgodzę się z tym co napisałeś w p.4
    "... ale jakbyś chciał to równie dobrze mógłbyś podłączyć jeszcze swoje zdarzenie (swoją funkcję) zamiast tego NULL przy definicji tego timera"
    o ile dobrze rozumiem w tym przypadku f.timer_init( 1, 5000, 0, NULL ) jest to niemożliwe bo nawet gdyby napisać własną
    funkcję callbacko-wą np f.migaj_led to żeby ona miała szansę zadziałać musi zostać wywołana f. timers_process a tak się w tym przypadku nie dzieje.
    No chyba, że nie zrozumiałem tego co miałeś na myśli, bo oczywiści gdyby było tak f.timer_init( 1, 5000, 1, migaj_led ) to ok f.callback migaj_led się odpali.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 14 sie 2018, o 08:49 
    Offline
    Moderator
    Avatar użytkownika

    Dołączył(a): 03 paź 2011
    Posty: 27415
    Lokalizacja: Szczecin
    Pomógł: 1043

    Jak to się nie odpali - jak odpali ;)

    Tylko musisz argument ON dać na 1 ;) ... ale też mówię - że GetNtp coś tam robi z counterem i nie pamiętam teraz co - więc zajrzyj do jej środka

    _________________
    zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 14 sie 2018, o 09:55 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 31 gru 2014
    Posty: 88
    Pomógł: 2

    Dziękuję za odpowiedź i wyjaśnienie wątpliwości jaką miałem,

    pozdrawiam.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    Wyświetl posty nie starsze niż:  Sortuj wg  
    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 

    Strefa czasowa: UTC + 1


    Kto przegląda forum

    Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 10 gości


    Nie możesz rozpoczynać nowych wątków
    Nie możesz odpowiadać w wątkach
    Nie możesz edytować swoich postów
    Nie możesz usuwać swoich postów
    Nie możesz dodawać załączników

    Szukaj:
    Skocz do:  
    cron
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO