Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 8 lis 2024, o 23:24


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 18 ] 
Autor Wiadomość
 Tytuł: Terminal
PostNapisane: 16 lip 2012, o 07:31 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 25 maja 2012
Posty: 296
Lokalizacja: Chebzie Dolne
Zbananowany użytkownik

Pomógł: 6

Witam!
Potrzebuję wyświetlić w terminalu liczby typu zmiennoprzecinkowego.
Czy mógłby ktoś dać jakąś wskazówkę jak to zrobić. Ponieważ za pomocą funkcji
z biblioteki MKUART Pana Mirka można tylko typ int.
Aha nie wchodzi bardzo w grę zamiana zmiennoprzecinkowych jak to jest opisane w rozdziale
"Pomiar napięcia za pomocą ADC" ponieważ jestem zmuszony użyć funkcji trygonometrycznych.

Pozdrawiam
Arek

_________________
Inspekcja TV kanalizacji
Programowanie



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Terminal
PostNapisane: 16 lip 2012, o 08:01 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27306
Lokalizacja: Szczecin
Pomógł: 1041

arko_go napisał(a):
Aha nie wchodzi bardzo w grę zamiana zmiennoprzecinkowych jak to jest opisane w rozdziale
"Pomiar napięcia za pomocą ADC" ponieważ jestem zmuszony użyć funkcji trygonometrycznych.


A co ma wspólnego sposób opisany w tym rozdziale z wykorzystaniem funkcji trygonometrycznych ? ;) NIC

Musi kolega niestety - czy chce czy nie chce - zrozumieć dokładnie co to jest i na czym polega zamiana postaci binarnej na znaki ASCII.

jeśli chodzi o wyświetlanie liczb typu INT to jest to robione można powiedzieć identycznie tylko jest użyta jakaś tam funkcja itoa() ... . Tu można użyć jeszcze innych ale trzeba zrozumieć podstawę - z którą jak widzę wiele osób ma poważne problemy. Tzn nie za bardzo początkujący rozumieją co to reprezentacja liczb w postaci ASCII. Gdzie nie ma różnicy czy ta liczba jest int czy float.

dla przykładu - jak masz liczbę np 14, tzn bajt o wartości = 14 to zdajesz sobie sprawę jak to leci do terminala ? Ile bajtów musi wysłać procek do terminala żeby pokazała się w nim liczba 14 ?????

- jeden bajt ?
- dwa bajty ?
- trzy bajty ?
- czy więcej bajtów ?

podobnie gdybyś miał liczbę np: 14.7 to ile bajtów musi polecieć do terminala wg ciebie ???

- jeden bajt ?
- dwa bajty ?
- trzy bajty ?
- czy więcej bajtów ?

spróbuj mi odpowiedzieć na te pytania - to podpowiem ci dalej ok ? wtedy może zaskoczysz - a to dość ważne

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Terminal
PostNapisane: 16 lip 2012, o 08:41 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 25 maja 2012
Posty: 296
Lokalizacja: Chebzie Dolne
Zbananowany użytkownik

Pomógł: 6

Nie chce zgadywać bo nie o to chodzi.

Funkcja która realizuje konwersje i wysyła string do terminala:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Prosiłbym o mały tutorial, na pewno przyda się wielu osobą, które zaczynają naukę C.

_________________
Inspekcja TV kanalizacji
Programowanie



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Terminal
PostNapisane: 16 lip 2012, o 08:49 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2011
Posty: 265
Lokalizacja: Szczecin
Pomógł: 9

arko_go napisał(a):
Potrzebuję wyświetlić w terminalu liczby typu zmiennoprzecinkowego.
"Pomiar napięcia za pomocą ADC" ponieważ jestem zmuszony użyć funkcji trygonometrycznych.


Nie stanowi to żadnego problemu! W programie używasz zmiennych zmiennoprzecinkowych.
Na sam koniec wynik zamieniasz na ASCII (np napisz sobie funkcje: FloatToASCII()) i wysyłasz na terminal.
Liczysz swoje funkcje np:
c=arcsin(a)+sin(x)+ctg(2*x);
wsk=FloatToASCII(c);

Następnie wsk możesz spokojnie wysyłać jako ASCII.

_________________
www.iuvo.it - Automatyka Budynkowa



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Terminal
PostNapisane: 16 lip 2012, o 10:25 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27306
Lokalizacja: Szczecin
Pomógł: 1041

arko_go napisał(a):
Nie chce zgadywać bo nie o to chodzi.


Właśnie o to chodzi żeby troszkę pomyśleć i odpowiedzieć, ja z odpowiedzi wiedziałbym gdzie kolega popełnia błąd w rozumowaniu i wtedy precyzyjnie mógłbym dalej podpowiadać ... ale jeśli kolega woli inaczej to nie ma sprawy pewnie ktoś napisze tutorial.

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Terminal
PostNapisane: 16 lip 2012, o 10:43 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 24 cze 2012
Posty: 414
Lokalizacja: Oborniki
Pomógł: 5

Język C dla AVR zmusza do myślenia. Co z tego, że kolega chce wyświetlić coś tam/gdzieś tam, jak nie chce wiedzieć jak się to odbywa? W takich sytuacjach lepiej użyć BASCOM - nie trzeba myśleć, sam zrobi wszystko za nas ;)

Oczywiście nie namawiam do tego, tylko po co się męczyć i coś rozumieć, jak można prościej??

_________________
Pozdrawiam:
Mikołaj



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Terminal
PostNapisane: 16 lip 2012, o 12:14 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 25 maja 2012
Posty: 296
Lokalizacja: Chebzie Dolne
Zbananowany użytkownik

Pomógł: 6

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.

_________________
Inspekcja TV kanalizacji
Programowanie



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Terminal
PostNapisane: 16 lip 2012, o 12:25 
Offline
Użytkownik

Dołączył(a): 15 lut 2012
Posty: 344
Lokalizacja: Bydgoszcz
Pomógł: 11

Kolego arko_go, a kolega korzysta w ogóle z funkcji itoa. Ona właśnie służy do konwersji zmiennej int na łańcuch. Za bardzo nie wiem co to jest za zapis uart_putint(alfa,10). Bo jesli uart_putint jest z biblioteki Mirka to powinna być sama alfa uart_putint(alfa).



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Terminal
PostNapisane: 16 lip 2012, o 12:29 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 25 maja 2012
Posty: 296
Lokalizacja: Chebzie Dolne
Zbananowany użytkownik

Pomógł: 6

Funkcja uart_putint() wykorzystuje do konwersji int na string właśnie funkcję itoa().
Tylko nie wiem czego przy dzieleniu dwóch liczb i zapisaniu jej do zmiennej typu int
nie wyświetla części całkowitej tylko zero.

_________________
Inspekcja TV kanalizacji
Programowanie



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Terminal
PostNapisane: 16 lip 2012, o 12:36 
Offline
Użytkownik

Dołączył(a): 15 lut 2012
Posty: 344
Lokalizacja: Bydgoszcz
Pomógł: 11

Słuchaj wejdź w funkcje uart_putint i zamień itoa na ultoa.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Terminal
PostNapisane: 16 lip 2012, o 12:48 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 25 maja 2012
Posty: 296
Lokalizacja: Chebzie Dolne
Zbananowany użytkownik

Pomógł: 6

Dzęki:) Pomogło!

_________________
Inspekcja TV kanalizacji
Programowanie



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Terminal
PostNapisane: 16 lip 2012, o 12:52 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27306
Lokalizacja: Szczecin
Pomógł: 1041

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 312

ale 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

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Terminal
PostNapisane: 16 lip 2012, o 20:31 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 25 maja 2012
Posty: 296
Lokalizacja: Chebzie Dolne
Zbananowany użytkownik

Pomógł: 6

Przyjąłem wszystko z pokorą.
Wytłumaczenie jest super. Ale.... oczywiście się pojawi zawsze. To był prosty przykład ze zmiennymi typu float.
A co zrobic gdy mam w tym funkcję trygonometryczną arcsin??
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Konwersja będzie wyglądała jak napisałeś wcześniej?

_________________
Inspekcja TV kanalizacji
Programowanie



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Terminal
PostNapisane: 16 lip 2012, o 20:57 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27306
Lokalizacja: Szczecin
Pomógł: 1041

No trudno robić bardziej zaawansowane funkcje matematyczne w tym trygonometryczne bez zmiennych typu float. Więc jeśli już to przecież nie będziesz nadawał zmiennej alfa typu całkowitego i świadomie skorzystasz z typu float. To że mówiłem aby unikać - podkreślałem "unikać gdzie się da i kiedy się da". Nie oznacza to że zawsze się da. Chociaż z drugiej strony jeśli potrzeba zbyt dużo takich funkcji to warto rozważyć w ogóle inny procek. Z drugiej zaś strony jeśli właśnie - masz na tyle flasha wolnego a dodatkowo nie zależy ci na każdym takcie zegara - to czemu nie ?

-----------------

ale dobrze - bo ja wyżej zwróciłem tylko uwagę na konkretny przykład który podałeś - odchodząc trochę od tematu pokazywania tego na terminalu - bo jak widać problem leżał gdzieś głębiej ...

w tym przypadku o który teraz pytasz , jeśli już musisz posługiwać się zmiennymi zmiennoprzecinkowymi to

float alfa = asin(bit/6554.0);

natomiast na końcu zamiana alfa na znaki ASCII to przecież żaden problem....

poczytaj przykład w książce pierwszej w rozdziale o ADC OK ? Wprawdzie tam mowa o zamianie na ASCII na potrzeby LCD ale to przecież żadna różnica żeby w C skierować te znaki ASCII (tą liczbę z LCD na Terminal)


Autor postu otrzymał pochwałę

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Terminal
PostNapisane: 17 lip 2012, o 07:22 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

Często w przypadku funkcji trygonometrycznych używa się tablic (i nie musi to być float, bo można przechowywać np. dla funkcji sinus wartości pomnożone przez 1000 ), a skoro nie ma obliczeń to działanie jest przyspieszone.

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Terminal
PostNapisane: 28 kwi 2014, o 15:59 
Offline
Użytkownik

Dołączył(a): 21 sty 2014
Posty: 75
Pomógł: 0

A co z liczbami większymi od 65535, jak je wyświetlić w terminalu?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Terminal
PostNapisane: 28 kwi 2014, o 20:37 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Można jeszcze korzystać z funkcji utoa i ultoa dla liczb bez znaku.

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Terminal
PostNapisane: 28 kwi 2014, o 20:39 
Offline
Użytkownik

Dołączył(a): 21 sty 2014
Posty: 75
Pomógł: 0

Super dzięki wiedziałem że trzeba zmienić itoa() na ltoa() ale kompletnie zapomniałem że również trzeba zwiększyć tablice .

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 18 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 4 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO