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).
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:
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