RadekB86 napisał(a):
w 10 linijce Dzielisz przez 5.2 ? wiesz o tym że tak naprawdę dzielisz tylko przez 5 ?
Obawiam się, że nie masz racji. Obliczenia będą wykonane na liczbach typu float, a wynik zostanie dopiero zaokrąglony do liczby całkowitej.
Większym problemem może być czas potrzebny na takie obliczenia. Taka operacja może zająć kilkaset taktów zegara, co w procedurze obsługi przerwania może być niewskazane, bo np. w czasie obsługi przerwania od timera przerwania zewnętrzne są wyłączone, więc można zgubić impulsy (choć tu raczej wygląda, że jest ich za dużo). Wszystko tu zależy od tego, jaka jest maksymalna częstotliwość tych impulsów z silnika. Może to nie jest tutaj problemem, ale i tak dobrze byłoby skrócić czas obsługi przerwania np. tak:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
To powinno znacząco skrócić czas wykonania procedury obsługi przerwania (która zawsze powinna być jak najkrótsza), a wynik obliczeń będzie taki sam. W sumie nie bardzo widzę sensu stosowania dodatkowej zmiennej. Wystarczyłoby:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Generalnie w tym, co przedstawiłeś nie widzę raczej żadnego błędu, jeśli chodzi o logikę programu. Nie wiem, skąd wziąłeś tę wartość 5.2, ani jaki jest zakres obrotów silnika, więc nie wiem, czy obliczenia są prawidłowe. Na wszelki wypadek mógłbyś spróbować wyświetlić zamiast prędkości wartość zmiennej
count i sprawdzić, czy zliczona ilość impulsów zgadza się z założeniami. Może masz problem sprzętowy np. jakieś zakłócenia od silnika powodują, że impulsów jest więcej niż oczekujesz? Jeśli masz możliwość, mógłbyś też sprawdzić te impulsy oscyloskopem.
Najlepiej byłoby wydzielić minimum kodu niezbędnego tylko do samego pomiaru prędkości usuwając wszystkie inne zadania programu i sprawdzić, czy to działa. Jeśli nie, łatwiej będzie znaleźć błąd. Jeśli będzie działać, to będzie oznaczało, że problem leży w innym fragmencie kodu.