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



Teraz jest 29 kwi 2026, o 11:40


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 12 ] 
Autor Wiadomość
PostNapisane: 26 lut 2019, o 08:25 
Offline
Użytkownik

Dołączył(a): 13 paź 2015
Posty: 303
Lokalizacja: Rybnik
Pomógł: 10

Witam,

Mam problem ze zrozumieniem jak obliczany jest czas timera programowego z YB.

W pliku mk_matrix_disp.c jest zainicjalizowany TIMER2 z częstotliwością odświerzania 500 Hz to jest 2ms

W ciele obsługi procedury przerwania Timera2 jest jak niżej (REFRESH_RATE = 500):
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


i teraz nie wiem co ile ms timery programowe w funkcji tmr_irq_tick() będą się zerować.

Załóżmy, że chciałbym aby dioda migała co 1s to musiałbym zainicjalizować np. programowy timer0 jak niżej, ponieważ w książce napisane jest, że wartość podaje się w ms:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Ale w tym przypadku miganie jest dużo wolniejsze niż 1s, dlatego trzeba wpisać nie 1000 tylko coś około 720. I tego nie rozumiem, czy ktoś potrafiłby mi wytłumaczyć jak obliczać czas tych timerów z YB?



Ostatnio edytowano 26 lut 2019, o 08:39 przez Tom92, łącznie edytowano 2 razy

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 lut 2019, o 08:26 
Offline
Użytkownik

Dołączył(a): 25 lip 2013
Posty: 2606
Pomógł: 129

A jakiego kwarcu kolega używa?



Ostatnio edytowano 26 lut 2019, o 08:29 przez micky, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 lut 2019, o 08:27 
Offline
Użytkownik

Dołączył(a): 13 paź 2015
Posty: 303
Lokalizacja: Rybnik
Pomógł: 10

Tak jak w książce 18 432 000 Hz



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 lut 2019, o 09:14 
Offline
Moderator
Avatar użytkownika

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

Przecież w YB w tym przykładzie wykorzystany został timer sprzętowy odpowiedzialny za odświeżanie ekranu, stąd takie dodatkowe operacje ... jeśli nie robisz wyświetlacza i odświeżania to ustaw sobie timer sprzętowy na 10ms a później jak chcesz co sekundę to daj wartość 100

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

_________________
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: 26 lut 2019, o 09:21 
Offline
Użytkownik

Dołączył(a): 13 paź 2015
Posty: 303
Lokalizacja: Rybnik
Pomógł: 10

Ale chciałem zrozumieć dlaczego została zastosowana taka operacja, siedzę z kalkulatorem i kombinuję :) bo wyświetlaczem też się bawię.

------------------------ [ Dodano po: 7 minutach (420 tyś milusekundach) ]

OK, timer sprzętowy jest ustawiony na 2ms.

Teraz jeśli zmienna w warunku if zwiększy wartość 5 razy ----> czyli (5 * 2 = 10ms) to napędza timery programowe i zeruje zmienną.

Czyli timery programowe są ustawione na 10ms?

Ale dalej nie pasuje w inicjalizacji albo już sie pomieszałem :p



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 lut 2019, o 10:53 
Offline
Moderator
Avatar użytkownika

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

Ja już nie pamiętam dokładnie ;) ale zdaje się że tak jak piszesz - timery programowe powinny śmigać co 10ms - ja tak zwykle domyślnie ustawiam.

_________________
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: 28 lut 2019, o 00:29 
Offline
Użytkownik
Avatar użytkownika

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

Ponieważ masz YB to zakładam, że szczegóły doczytasz w książce, bazując na niej przedstawię moje uproszczone rozumowanie wyjaśniające Twoje pytanie, nie traktuj poniższego jako wyroczni wszyscy popełniamy błędy a przecież też jestem stale początkujący jeżeli coś opisałem błędnie to mam nadzieję, że ktoś mnie "wyprostuje" i się czegoś nauczę.

W funkcji main w petli While w kółko wywoływane są funkcje zdarzeniowe w tym f.zdarzeniowa TIMERS_EVENT();
Po jej wywołaniu (f.TIMERS_EVENT();) pętla for( uint8_t i=0; i<MAX_TIMERS; i++ ) sprawdza czy i-ty soft timer jest enabled, jeżeli tak wywołana zostanie f. timers_process ( &stimers[ i ] );
f. timers_process sprawdza czy TRUE jest warunek if( !tmr->cnt ) a ten może być TRUE tylko wtedy gdy w przerwaniach f. tmr_irq_tick zrobi swoje czyli zdekrementuje cnt do zera.
Funkcja tmr_irq_tick umieszczona jest w obsłudze przerwania licznika T2.

Skoro dotarliśmy do przerwania można odnieść się do Twojego pytania „ teraz nie wiem co ile ms timery programowe w funkcji tmr_irq_tick() będą się zerować”
Co ile ms będzie się realizował dany soft.timer zależy od wartości z jaką został zainicjowany np.: timer_init( 0, 800, 1, timer0_tick );
0 –soft.timer0; parametr intterwal=800 czyli cnt=80; 1-enabled; timer0_tick – funkcja użytkownika

Zakładam, że wartość REFRESH_RATE=500 --> 500Hz przerwanie co 2ms, f. tmr_irq_tick petlą if( ms10++ > (REFRESH_RATE/100) ) dodatkowo opóźnia wykonanie dekrementacji licznika cnt dla REFRESH_RATE=500 --> 5 krotnie czyli 2ms*5=10ms. Co 10ms będzie dekrementowana wartość licznika cnt.
Jeżeli wynosi ona 80 to po 800ms będzie spełniony (TRUE) warunek if( !tmr->cnt ) z f. timers_process która wywoła f.callback-ową użytkownika i załaduje ponownie wartość cnt=80 tak by ponownie mógł zadziałać po 800ms soft.timer0.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 mar 2019, o 08:34 
Offline
Użytkownik

Dołączył(a): 13 paź 2015
Posty: 303
Lokalizacja: Rybnik
Pomógł: 10

fobos napisał(a):
Zakładam, że wartość REFRESH_RATE=500 --> 500Hz przerwanie co 2ms, f. tmr_irq_tick petlą if( ms10++ > (REFRESH_RATE/100) ) dodatkowo opóźnia wykonanie dekrementacji licznika cnt dla REFRESH_RATE=500 --> 5 krotnie czyli 2ms*5=10ms. Co 10ms będzie dekrementowana wartość licznika cnt.
Jeżeli wynosi ona 80 to po 800ms będzie spełniony (TRUE) warunek if( !tmr->cnt ) z f. timers_process która wywoła f.callback-ową użytkownika i załaduje ponownie wartość cnt=80 tak by ponownie mógł zadziałać po 800ms soft.timer0.


Dokładnie, dlatego zastanawia mnie to, że jeżeli wpiszę interval = 1000, to warunek nie będzie spełniony po 1 sekundzie tylko trochę dłużej to zajmuje. Możliwe, że jest małe opóźnienie z powodu dużej ilości kodu w ciele procedury obsługi przerwań
ISR( TIMER2_COMPA_vect ) {}



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 mar 2019, o 08:40 
Offline
Moderator
Avatar użytkownika

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

Tom92 napisał(a):
to warunek nie będzie spełniony po 1 sekundzie tylko

... panie kochany - najpierw postaraj się jednak zrozumieć co to są timery programowe i do czego się ich używa .... bo jak ktoś pisze, że one nie działają dokładnie ;) to oznacza, że właśnie tego nie wie...

_________________
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: 3 mar 2019, o 09:16 
Offline
Użytkownik

Dołączył(a): 13 paź 2015
Posty: 303
Lokalizacja: Rybnik
Pomógł: 10

mirekk36 napisał(a):
najpierw postaraj się jednak zrozumieć co to są timery programowe i do czego się ich używa


Brak mi doświadczenia dlatego nie przychodzi mi od razu do głowy wszystko co czytałem lub się dowiedziałem (trzeba czasem mnie pacnąć w głowę) :P jednak przypomniałem sobie, że Pan mówił na webinarze o Timerach, że sprzętowe są dokładniejsze od programowych i sprzętowych się używa do odliczania krótkiego czasu. A do odmierzania podstawy czasu najlepiej używać timerów 8 bitowych :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 mar 2019, o 11:58 
Offline
Użytkownik
Avatar użytkownika

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

Zajrzyj do poradnika --> #0385 Analizator, debuger - jak sprawdzić ile czasu trwa funkcja w C oraz innych, ten poradnik świetnie wyjaśnia co się dzieje z czasem wykonywania rożnych funkcji gdy w programie działają przerwania ( soft_timery to nie są przerwania, sądzę, że to wiesz ale akcentuję ) myślę, że wówczas lepiej to zagadnienie zrozumiesz.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 mar 2019, o 13:41 
Offline
Użytkownik

Dołączył(a): 13 paź 2015
Posty: 303
Lokalizacja: Rybnik
Pomógł: 10

fobos napisał(a):
( soft_timery to nie są przerwania, sądzę, że to wiesz ale akcentuję )


Tak wiem o tym - źle napisałem :oops: ale dobrze, że sprostowałeś. Oczywiście chodziło mi o ciało procedury obsługi timera, a nie przerwań.

Dzięki, do poradnika zajrzę bo tego jeszcze nie widziałem - warto uzupełnić wiedzę.



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: 12 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 3 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:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO