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



Teraz jest 23 kwi 2024, o 20:00


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 3 ] 
Autor Wiadomość
PostNapisane: 6 maja 2018, o 12:31 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 02 kwi 2014
Posty: 150
Pomógł: 1

Hej,

Chciałem dzisiaj wykorzystać nowe rozwiązanie timerów programowych zaprezentowanych w YB.
I wydaje mi się, że jest mały błąd w kodzie przerwania od Timera2 (strona 83 YB).

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


Już objaśniam dlaczego.
Jeżeli ustawimy REFRESH_RATE na 500 Hz, to będziemy cyklicznie (co 2ms) sprawdzać warunek if( ms10++ > 5).
Załóżmy, że właśnie wyszliśmy z warunku if więc zmienna ms10 ma wartość 0 i teraz analiza krokowa:
Krok 1. po 2ms sprawdzamy warunek if( 0 > 5), wynik negatywny, zwiększamy ms10 o 1 (ms10 = 1), wychodzimy z przerwania.
Krok 2. po 2ms sprawdzamy warunek if( 1 > 5), wynik negatywny, zwiększamy ms10 o 1 (ms10 = 2), wychodzimy z przerwania.
Krok 3. po 2ms sprawdzamy warunek if( 2 > 5), wynik negatywny, zwiększamy ms10 o 1 (ms10 = 3), wychodzimy z przerwania.
Krok 4. po 2ms sprawdzamy warunek if( 3 > 5), wynik negatywny, zwiększamy ms10 o 1 (ms10 = 4), wychodzimy z przerwania.
Krok 5. po 2ms sprawdzamy warunek if( 4 > 5), wynik negatywny, zwiększamy ms10 o 1 (ms10 = 5), wychodzimy z przerwania.
Krok 6. po 2ms sprawdzamy warunek if( 5 > 5), wynik negatywny, zwiększamy ms10 o 1 (ms10 = 6), wychodzimy z przerwania.
Krok 7. po 2ms sprawdzamy warunek if( 6 > 5), wynik pozytywny, zerujemy ms10 (ms10 = 0), wychodzimy z przerwania.

Czyli tak naprawdę funkcja tmr_irq_tick() wykona się po 7*2ms = 14ms a nie zakładane 10ms.

Moim zdaniem kod powinien wyglądać następująco:
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 analiza krokowa z tym, że sprawdzamy warunek if( ms10++ >= 4)
Załóżmy, że właśnie wyszliśmy z warunku if więc zmienna ms10 ma wartość 0.
Krok 1. po 2ms sprawdzamy warunek if( 0 >= 4), wynik negatywny, zwiększamy ms10 o 1 (ms10 =1), wychodzimy z przerwania.
Krok 2. po 2ms sprawdzamy warunek if( 1 >= 4), wynik negatywny, zwiększamy ms10 o 1 (ms10 = 2), wychodzimy z przerwania.
Krok 3. po 2ms sprawdzamy warunek if( 2 >= 4), wynik negatywny, zwiększamy ms10 o 1 (ms10 = 3), wychodzimy z przerwania.
Krok 4. po 2ms sprawdzamy warunek if( 3 >= 4), wynik negatywny, zwiększamy ms10 o 1 (ms10 = 4), wychodzimy z przerwania.
Krok 5. po 2ms sprawdzamy warunek if( 4 >= 4), wynik pozytywny, zerujemy ms10 (ms10 = 0), wychodzimy z przerwania.

Funkcja tmr_irq_tick() wykona się po 5*2ms = 10ms.

Jeżeli się mylę to proszę o sprostowanie :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 maja 2018, o 14:44 
Online
Moderator
Avatar użytkownika

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

mylić się nie mylisz - ale nie to było celem pokazania timerów programowych w nowej wersji ;) ... bo tego typu warunki, to że tak powiem wałkujemy już od Bluebooka ...

ale oczywiście masz rację - tylko zamiast tego odejmowania jedynki może bym zrobił szybciej tak

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


chociaż - co to za różnica ? ale trzeba byłoby sprawdzić jak wygląda kod ASM i który lepiej się optymalizuje czasowo

_________________
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: 6 maja 2018, o 14:57 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 02 kwi 2014
Posty: 150
Pomógł: 1

Cel jest wiadomy, a że wkradł mały babol no to cóż, bywa ;)

Tak też można zrobić :)



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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 2 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