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

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 18 lip 2025, o 16:55


    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: 27416
    Lokalizacja: Szczecin
    Pomógł: 1043

    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: 266
    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.gryfsmart.pl



    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: 27416
    Lokalizacja: Szczecin
    Pomógł: 1043

    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: 27416
    Lokalizacja: Szczecin
    Pomógł: 1043

    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: 27416
    Lokalizacja: Szczecin
    Pomógł: 1043

    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 9 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:  
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO