Witam
Przymierzam się do zakupu pewnego czujnika, ze względu na to że jest dosyć drogi chcę przed zakupem napisać do niego bibliotekę żeby potem nie okazało się że tego nie oprogramuję.
Zacząłem od rzeczy najprostszej czyli zmiennych i obliczeń na nich, niestety wynik końcowy nie zgadzał się z tym z noty katalogowej (wszystkie obliczenia razem z przykładowymi wartościami podane).
Znalazłem miejsce w którym wynik jest nie prawidłowy, oto kod:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
błąd w obliczeniu jest tu: TEMP = 200 + dT*(C5+100)/2048;
po podstawieniu wartości wygląda to tak: TEMP = 200 + 587*(51+100)/2048; co powinno dać 243 a daje 211
(Wyniki wyświetlam na wyświetlaczu podpiętym do uC)
Rozbiłem to na mniejsze działanie żeby sprawdzić gdzie jest błąd
i jest on tu TEMP = dT*(C5+100); w wyniku powinno dać 88637
a daje coś ok 23000 (nie mogę sprawdzić dokładnie bo układ mam w pracy)
Nie wiem dlaczego tak się dzieje, zakres zmiennej TEMP jest wystarczający bo jest ona typu uint32_t
próbowałem też jawnego rzutowania
TEMP=(uint32_t) dT*(C5+100); \\ nie wiem czy to ma sens w tym przypadku
nie pomogło
Przy takim zapisie końpilator nie wywala błędów ani warningów
dopiero po napisaniu
TEMP = 587*151; wyświetla warning "integer overflow in expression"
dodam jeszcze że podejrzewałem że za ten błąd może być odpowiedzialna zła kolejność
bo jeśli najpierw (151) podzielić przez 2048 to wychodzi 0,07373046875 co na procku dało by 0
ale z tego co rozumiem z książki przy takim zapisie TEMP = 200 + dT*(C5+100)/2048; najpierw wykona się mnożenie.
uC to Atmega8
Proszę o pomoc, ja niczego nie wymyślę...