Witajcie!
Napisałem sobie funkcję służącą do obliczania mocy wyjściowej pewnego urządzenia i wyświetlania go na LCD (HD44780 4 x 20):
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Na potrzeby testu wywołuję go z funkcji głównej programu stałymi wartościami:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Pomijam też przeliczanie surowej wartości z adc na fizyczne jednostki (są "zakomentowane").
Zgodnie z oczekiwaniami gdy wartości przekazywane do funkcji wynoszą odpowiednio 1680 i 200, wynikiem mnożenia jest liczba 336000. Ta powinna znajdować się w zmiennej p zapisana binarnie tak:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
następnie w wyniku dzielenia do zmiennej power trafić powinna liczba 336 zapisana tak:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
po czym zostać wyświetlona na lcd.
Niestety jak bym nie próbował - na wyświetlaczu mam cyfrę 8...
Spróbowałem wyświetlić zawartość zmiennej power bez dzielenia na 1000:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
i otrzymuję wynik 8320, binarnie to będzie:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Okazuje się, że jest to wynik mnożenia (336000) z którego znikają cztery najstarsze bity. Wszystko się zgadza. Czemu natomiast dzielenie przez tysiąc wykonywane jest już na obciętej wartości? Tzn dzielone jest 8320 a nie 336000? Próbowałem też zrobić tak:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Niestety również wynikiem jest liczba 8.
Dajcie proszę jakąś wskazówkę - nie mam już za bardzo pomysłu. Myślałem że ostatni przykład załatwi sprawę i do zmiennej uint32_t zostanie zapisany wynik 336000 i podzielony przez 1000, jednak tam również ucięte są cztery najstarsze bity.
Mógłbym teoretycznie dzielić liczby przed mnożeniem ale:
- to jest ominięcie problemu a nie rozwiązanie + zerowa wartość edukacyjna
- nie uzyskam zakładanej dokładności
Procesor to Atmega8 taktowana fcpu = 16MHZ.
Proszę o wyrozumiałość - jestem amatorem hobbystą i dopiero się uczę
Łukasz