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



Teraz jest 29 mar 2024, o 15:48


Strefa czasowa: UTC + 1





Utwórz nowy wątek Ten wątek jest zablokowany. Nie możesz w nim pisać ani edytować postów.  [ Posty: 18 ] 
Autor Wiadomość
PostNapisane: 5 wrz 2013, o 13:18 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2012
Posty: 97
Lokalizacja: Tarnów
Pomógł: 2

Witam

Podejrzewam że problem jest dobrze znany ale niestety nie udało mi się znaleźć na forum jakiegoś wątku który by poruszał ten temat. Ale do rzeczy, mam zmienną typu float. Np:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Teraz chciałbym jej wartość wyświetlić na lcd (hd44780). I chciałbym to zrobić poprzez zapisanie do zmiennej typu uint osobno części całkowitej i osobno części ułamkowej.
Udało mi się zrobić tylko to pierwsze poprzez rzutowanie float na unsigned int (zresztą jest to wykonywane niejawnie przez kompilator) ale zrobiłem to tak:

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


I zmienna cz_calkowita posiada wartosc 14. Natomiast nie mogę wpasc na pomysł jak zapisac to co jest po przecinku czyli 58 do zmiennej typu int tak żeby wyswietlic. Żadne reszty z dzielenia niestety nie działają w tym przypadku.



Góra
 Zobacz profil  
 
PostNapisane: 5 wrz 2013, o 13:27 
Offline
Moderator zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 18 lip 2012
Posty: 3187
Lokalizacja: Kraków - obok FAB5 ATMEL'a
Pomógł: 89

Odejmij
zmienna - cz_calkowita

i masz częśc po przecinku :lol:


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
 
PostNapisane: 5 wrz 2013, o 13:29 

Pomógł: 0

Rzuć okiem na biblioteki Mirka do 1wire, zero floatów, a masz temperaturę w postaci xxx,x ;).

To samo obsługa ADC.



Góra
  
 
PostNapisane: 5 wrz 2013, o 13:37 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 paź 2011
Posty: 581
Pomógł: 17

Tak jak pisze jaglarz
możesz zrobić to tak
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Pisane z glowy :D


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
 
PostNapisane: 5 wrz 2013, o 13:42 

Pomógł: 0

Ale po co w ogóle wtedy double, czy floaty?
wrzucasz wszystko do uint32_t i potem tylko przecinek sobie wyświetlacz w odpowiednim miejscu.

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
  
 
PostNapisane: 5 wrz 2013, o 21:06 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2012
Posty: 97
Lokalizacja: Tarnów
Pomógł: 2

Dzięki Jaglarz i xamrex o to właśnie mi chodziło. Nie wiem, jakieś klapki na oczach czy coś że na to wcześniej nie wpadłem. Kombinowałem z dzieleniem modulo i mnożeniem ale kompilacja kończyła się błędem.

Co do biblioteki Mirka do ds18b20 to używałem jej i widziałem jak tam sprawa jest rozwiązana bez float'ów ale w moim przypadku akurat float jest potrzebny bo wyliczam prędkość w [cm/s] poprzez dzielenie dwóch liczb zmiennoprzecinkowych (z czego jedna jest dana a druga ulega zmianie) więc siłą rzeczy wynik też musi być zmiennoprzecinkowy, a niestety tego co jest po przecinku nie mogę zgubić bo właśnie dokładność do co najmniej dwóch miejsc gra tutaj kluczową rolę.

W każdym bądź razie dziękuje za wszystkie odpowiedzi.



Góra
 Zobacz profil  
 
PostNapisane: 5 wrz 2013, o 22:21 
Offline
Moderator
Avatar użytkownika

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

The River napisał(a):
ale w moim przypadku akurat float jest potrzebny bo wyliczam prędkość w [cm/s] poprzez dzielenie dwóch liczb zmiennoprzecinkowych (z czego jedna jest dana a druga ulega zmianie) więc siłą rzeczy wynik też musi być zmiennoprzecinkowy, a niestety tego co jest po przecinku nie mogę zgubić bo właśnie dokładność do co najmniej dwóch miejsc gra tutaj kluczową rolę.


No właśnie w tak prostych przypadkach w ogóle nie trzeba floatów, uwierz mi ;) a jest to mega prosty przypadek i wszystko można zrobić na całkowitych ... jak ??

przemnóż sobie zmienne razy tyle ile masz miejsc po przecinku plus jeszcze ze dwa na zapas ;) ... i rób dzielenia, mnożenia, dodawania, odejmowania co zechcesz na takich dużych liczbach całkowitych, jak skończysz to ..... to odzyskaj to co po przecinku - zajrzyj do rozdziału o ADC w książce i zobacz jak ;) prosto ...

floaty są potrzebne ... hmmm no ale może wtedy gdy w grę zaczynają wchodzić jakieś sin, cos, tg, ctg itp .... ale i w takich przypadkach da się obejść czasem bez floatów bo wtedy można sobie stablicować wartości sinusa, cosinusa itp ;) i znowu wszystko puścić na całkowitych ...

dzięki czemu masz SZYBCIEJ i MNIEJ kodu - i to nie troszkę a ZDECYDOWANIE mniej

------------------------ [ Dodano po: 1 minucie ]

tzn tylko nie zrozum mnie źle - jak masz np ATmega128 i po kompilacji zostaje ci jeszcze 80kB wolnego miejsca we Flash a do tego na szybkości nie zależy - to po co się przejmować - wtedy floaty można używać do woli ;)

_________________
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  
 
PostNapisane: 9 wrz 2013, o 18:54 
Offline
Nowy

Dołączył(a): 20 lip 2013
Posty: 16
Pomógł: 0

A co np z liczba 12,04, przykład z przetwornikiem da w wyniku 12,4 na LCD.
Przykład z książki (ADC pomiar napięcia)
wynik = 276250
zmieniam na 270250 i dalej
(wynik/100)%100=2,5 (powinno być 025)
Chodzi mi o to brakujące 0 na początku części ułamkowej, które jest istotne. Czy to mój błąd ?



Góra
 Zobacz profil  
 
PostNapisane: 9 wrz 2013, o 20:19 
Offline
Moderator
Avatar użytkownika

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

APVIRC napisał(a):
A co np z liczba 12,04, przykład z przetwornikiem da w wyniku 12,4 na LCD.
Przykład z książki (ADC pomiar napięcia)
wynik = 276250
zmieniam na 270250 i dalej
(wynik/100)%100=2,5 (powinno być 025)
Chodzi mi o to brakujące 0 na początku części ułamkowej, które jest istotne. Czy to mój błąd ?


Obejrzyj proszę ten cykl poradników do książki:

http://www.youtube.com/playlist?list=PL ... 5hRnig_f23

a szczególnie odcinek 4 i np 5 jeśli chodzi właśnie o prezentację wyników to zobaczysz sposoby na to zero ok?

_________________
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  
 
PostNapisane: 9 wrz 2013, o 20:29 
Offline
Nowy

Dołączył(a): 20 lip 2013
Posty: 16
Pomógł: 0

Znalazłem sposób i się z nim podzielę w razie mojego klona :)

np. x=2,03
if(x-(int)x<0,1) //- prawda ?
//2,03-2=0,03<0,1 TAK
lcd_int(0); dopisz brakujące zero



Góra
 Zobacz profil  
 
PostNapisane: 9 wrz 2013, o 20:31 
Offline
Moderator
Avatar użytkownika

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

No dokładnie takich sposobów i sposobików jest mnóstwo a w książce na DVD masz też opisaną funkcję w ćwiczeniach z ADC formatującą liczbę z wyświetlaniem nieznaczących zer ... , w poradnikach wideo jeszcze inne podejście

jak widzisz to nie jest jakaś tam trudna rzecz

_________________
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  
 
PostNapisane: 10 wrz 2013, o 12:06 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 maja 2012
Posty: 758
Pomógł: 9

12.73 * 100 = 1273
1273 / 100 = 12 => część całkowita
1273 mod 100 = 73 => część ułamkowa

Ja tak zazwyczaj robię. ;)
Co do zera wiodącego, przydaje się flaga.

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


Czy wyświetlać kropkę i zera po kropce czy nie możesz sprawdzić czy reszta z dzielenie jest niezerowa i też flaga.
Dzięki temu masz ładne wyniki:
12 a nie 12.00
12.73 a nie 12

_________________
ATB 1.03, Win XP SP3, ECLIPSE Indigo 3.7.2



Góra
 Zobacz profil  
 
PostNapisane: 12 cze 2018, o 14:53 
Offline
Użytkownik

Dołączył(a): 13 mar 2018
Posty: 25
Pomógł: 0

Witam,

korzystam ze sposobu Mirka na wyświetlanie winku ADC na LCD. Wszystko działa super.
Chciałby tylko wyświetlać zamiast 2 miejsc po przecinku jedno.
Czy ktoś wie może jak to zrobić?
Kombinuje i nic mi nie wychodzi. Znaczy wyszło mi tak że jak jest liczba np. 12.10 to wyświetla ją jako 12.1 czyli ok ale jak pojawia się np. 12.11 to wyświetla ją 12.11.



Góra
 Zobacz profil  
 
PostNapisane: 12 cze 2018, o 14:57 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 sty 2016
Posty: 1146
Lokalizacja: Kraków
Pomógł: 93

Podziel część ułamkową przez 10 i wtedy wyświetl ;)



Góra
 Zobacz profil  
 
PostNapisane: 12 cze 2018, o 15:19 
Offline
Użytkownik

Dołączył(a): 13 mar 2018
Posty: 25
Pomógł: 0

Dziękuje, spróbuję!



Góra
 Zobacz profil  
 
PostNapisane: 25 lip 2019, o 19:01 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 paź 2013
Posty: 62
Pomógł: 2

Odkopuję temat, bo jakoś nie mam koncepcji.

Robię ustrojstwo, które będzie zliczać impulsy. Maksymalna ilość impulsów to 150000.
Ilość impulsów jest zapisywana w zmiennej d. No i muszę ją przemnożyć przez współczynnik konwersji, który wynosi 0,006666.

Próbuję wyświetlić część całkowitą na LCD 4x16 pędzonym bibliotekami z BB.

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


Nie idzie. Póki co generuję impulsy w ilości około 300. Ilość impulsów się wyświetla. Ale pod spodem ma być wynik z konwersją i tu czcalkowita cały czas wyświetla ZERO. Przy 300 impulsach powinno wyświetlić się 1 nie? (wynik konwersji 1,9998)

O co kaman?



Góra
 Zobacz profil  
 
PostNapisane: 25 lip 2019, o 19:37 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1960
Lokalizacja: Lipsko
Pomógł: 125

Zamiast float zrób jakąś dużą np. uint32 albo 64 i teraz:

wynik=impulsy*6666/1000000

i będziesz miał 1 w wyniku (o ile to też jakiś uint).

Manewrując zerami przez które dzielisz, możesz dowolnie przesuwać przecinek albo pozbyć się go całkowicie i bez problemu wyświetlić wynik tak jak to już wcześniej inni opisali.

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
 
PostNapisane: 25 lip 2019, o 22:02 
Offline
Moderator
Avatar użytkownika

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

rescue1 napisał(a):
Odkopuję temat, bo jakoś nie mam koncepcji.

a zamiast odkopywać - zakładaj nowy wątek na przyszłość

_________________
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  
 
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Ten wątek jest zablokowany. Nie możesz w nim pisać ani edytować postów.  [ Posty: 18 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 11 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