arko_go napisał(a):
To może inaczej. Mam wartość uint16_t bit = 2047.
Robię tak uint16_t alfa=(bit/6554)*1000;
i następnie uart_putint(alfa,10);
A to wyświetla 0 a powinno 312.
No i widzisz - tak o wiele łatwiej tłumaczyć
pierwszy błąd poważny i to bardzo poważny jaki popełniasz to już jest w tej linii:
Kod:
uint16_t alfa=(bit/6554)*1000;
a w zasadzie dokładniej to w tym wyrażeniu już wszystko ci leży
Kod:
uint16_t alfa=(bit/6554)
2047/6554 będzie ile równe ??? ano będzie równe 0.312328
skoro robisz dzielenie na liczbach całkowitych to jak sobie wyobrażasz że kompilator ma podejść do obliczenia dalej ??? dla niego w wyniku takiego działania NIGDY nie będzie brane pod uwagę to co po przecinku - więc to wyrażenie będzie = 0 (ZERO) i dalej już chyba zrozumiałe że
0 * 1000 = 0 prawda ???
No ale tu wychodzi jak widać nieznajomość podstaw związanych z typami danych dla zmiennych więc zachęcam koniecznie jeszcze raz do poczytania tych rozdziałów w książce - jakie mamy typy i jakie one liczby mogą przechowywać
oczywiście najprostszym sposobem żeby to załatwić byłoby zrobić to tak:
Kod:
float alfa = (bit/6554)*1000;
wtedy w zmiennej alfa pojawi się DOKŁADNIE wartość typu: 312.328
tyle że kompilator zaraz dorzuci TYLE bibliotek do obsługi FLOAT'ów że program spuchnie ci jak żaba napompowana powietrzem
od samego początku mówię więc że w prockach 8-bitowych należy unikać floatów jak ognia .... hmmm no to co ? to mamy się poddać i tego nie zrealizować? bez typu float się nie da ????
ależ pewnie że się da ..... i to też jest opisane w książce - tylko znowu podkreślę - od razu widzę, że kolega przynajmniej RAZ nie przeczytał jej w całości od deski do deski. A ten materiał dydaktyczny jest tak przygotowany że wtedy dużo by koledze dał i wiedziałby kolega, że O!!!!!!! coś o tym było w rozdziale o ADC jak sobie radzić z liczbami zmiennoprzecinkowymi bez używania typu float
dlatego taki konkretny przykład można TAK MEGA PROSTO zrobić żeby wyszło upragnione 312 że SZOK, proszę bardzo:
Kod:
uint16_t bit = 2047.
uint16_t alfa= (bit*1000UL)/6554;
i co ??? prosto ? teraz dlaczego ? ano bo
2047 * 1000 = 2047000
jak wiadomo a:
2047000 / 6554 = 312.328
czyli ponieważ działamy na liczbach całkowitych to nigdy nie zobaczymy tego co po kropce zatem wynik w alfa będzie równy dokładnie
312ale UWAGA!!!!!!! do liczby 1000 dodaliśmy na końcu UL .... przypomina sobie kolega z książki co to znaczy ???? to znaczy że każemy kompilatorowi obliczyć to wyrażenie jako liczbę UNSIGNED LONG czyli jako liczbę 4 bajtową bo domyślnie kompilator robi promocję zawsze do typu 16-bitowego i znowu by nam obcięło część wyniku - liczba 2 miliony by się nie zmieściła i byłaby skucha - a tak ??? a tak kompilator na 4 bajtach obliczy sobie ten wynik 2 miliony - potem podzieli go przez 6554 (Tu też warto dodać UL na wszelki) a już wynik ponieważ jest mniejszy od 65535 to spokojnie jest niejawnie rzutowany do zmiennej 16-bitowej alfa
-------------------
reasumując panie kolego mam nadzieję że pokazałem ci tym nieco innym tutorialem niż tego którego się spodziewałeś , że warto tak podchodzić do tematu tu na forum hmmm ... mam nadzieję, że to pomoże a moje sugestie o odesłaniu do poczytania wskazanych rozdziałów w książce nie potraktujesz przypadkiem jako złośliwości z mojej strony