-
Path: news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!newsfeed2.atman.pl!newsfeed.
atman.pl!goblin1!goblin.stu.neva.ru!eternal-september.org!feeder.eternal-septem
ber.org!news.eternal-september.org!.POSTED!not-for-mail
From: "Pszemol" <P...@P...com>
Newsgroups: pl.misc.elektronika
Subject: Re: Działająca biblioteka do BMP085
Date: Thu, 24 Apr 2014 13:04:54 -0500
Organization: prywatna
Lines: 2
Message-ID: <ljbjng$uh3$1@dont-email.me>
References: <lj8s5v$q9a$1@portraits.wsisiz.edu.pl>
<lj9clo$e2i$1@portraits.wsisiz.edu.pl> <lj9ig7$tij$1@dont-email.me>
<ljb6vm$mdt$1@portraits.wsisiz.edu.pl>
Reply-To: "Pszemol" <P...@B...com>
Mime-Version: 1.0
Content-Type: text/plain; format=flowed; charset="utf-8"; reply-type=original
Content-Transfer-Encoding: 8bit
Injection-Date: Thu, 24 Apr 2014 18:04:33 +0000 (UTC)
Injection-Info: mx05.eternal-september.org;
posting-host="d763077b99e7293485067b7f9c6d1a11";
logging-data="31267";
mail-complaints-to="a...@e...org";
posting-account="U2FsdGVkX1+pnjAJnSOu6aIPpDbltSQK"
X-MimeOLE: Produced By Microsoft MimeOLE V14.0.8117.416
In-Reply-To: <ljb6vm$mdt$1@portraits.wsisiz.edu.pl>
X-Newsreader: Microsoft Windows Live Mail 14.0.8117.416
Importance: Normal
Cancel-Lock: sha1:sLcxMlpVrI5EnYRVcRhpNGEafmA=
X-Priority: 3
X-MSMail-Priority: Normal
Xref: news-archive.icm.edu.pl pl.misc.elektronika:663871
[ ukryj nagłówki ]"Atlantis" <m...@w...pl> wrote in message
news:ljb6vm$mdt$1@portraits.wsisiz.edu.pl...
> W dniu 2014-04-24 01:31, Pszemol pisze:
>
>> Podejrzewałbym następujące linie Twojego kodu:
>>
>> 1) itoa(pressure, result, 10);
>
> Dokładnie, ta diagnoza okazała się być poprawną. Najpierw nie
> zauważyłem, że itoa() przyjmuje short inta, a potem przeoczyłem literkę
> "l" w tokenie obsługującym przesyłaną wartość w sprintf_P. Zaowocowało
> to takim samym błędem.
>
> Teraz wszystko działa, otrzymuję ciśnienie o prawdopodobnej wartości.
No to fajnie :-)) Cieszę się, że mi kryształowa kula wciąż działa dobrze ;-)
> Jeśli chodzi o temperaturę, to zastosowana biblioteka zwraca ją jako
> double. Myślę, że nie będę się już bawił w jej przerabianie, zresztą
> miło byłoby, gdyby wynik był zwracany w normalnych jednostkach, a nie
> 0,1 stopnia C.
>
> Włączanie operacji zmiennoprzecinkowych w stdio.h raczej nie chodzi w
> grę. Nie dosyć, że kod od tego tyje, to jeszcze zużywane są cykle
> procesora.
>
> Dobrze pamiętam tę sztuczkę?
>
> double temperature = bmp085_gettemperature();
> int16_t intpart = (int16_t)temperature;
> int16_t decpart = ((int16_t)(temperature*2)%2);
> sprintf_P(pAnswer, PSTR("+TEMP: %d.%d\r\n"), intpart, decpart);
Hm... Sprawdźmy na szybko... :-)
Temperatura pokojowa, załóżmy 21,563C.
Mamy więc wartość zmiennej 'temperature' w dziesiątych Celciusza: 215.63
A więc wartość intpart jest automagicznie 215, tu OK.
Wartość decpart obliczamy, w kolejności, mnożąc 215.63*2 = 431.26
Teraz rzutujemy takiego doubla do inta, mamy 431.
Reszta z dzielenia tego 431 przez 2 wyjdzie nam 1.
Czyli sprintf wyświetli 215.1 zamiast 215.63 - kiepsko.
Lepiej chyba zrobić tak:
double dblTemperature = bmp085_gettemperature();
int iTemperature = ( dblTemperature < 0 ) ? dblTemperature - 0.5 :
dblTemperature + 0.5;
sprintf(pAnswer, "+TEMP: %d.%d\r\n"), iTemperature, iTemperature%10);
Podstawmy nasz przykład z dblTemperature = 215.63.
iTemperature = (int)(216.13);
Zatem
iTemperature = 216
Dla wartości z przedziału < xx.5, np dblTemperature = 215.33.
iTemperature = (int)(215.83);
Zatem
iTemperature = 215
Dla temperatur ujemnych, np dblTemperature = -215.63.
iTemperature = (int)(-216.13);
Zatem
iTemperature = -216
Ale nie bardzo rozumiem czemu skoro już masz typ zmiennej double
w swoim kodzie, a więc musiałeś włączyć takie liczby, nie?
Czemu więc nie zrobisz po prostu tak:
double dblTemperature = bmp085_gettemperature();
sprintf_P(pAnswer, PSTR("+TEMP: %.1f\r\n"), dblTemperature/10.0);
I od razu uwaga, pewnie zauważyłeś dodałem przedrostki oznaczające
typ zmiennej... Tak się po prostu łatwiej czyta kod, zwłaszcza jak używasz
zmiennych o bardzo różnych typach które dawałyby niebezpieczne efekty
przy cichym (domyślnym) rzutowaniu przez kompilator...
Takie przedrostki to popularna konwencja zwana "notacją węgierską",
warto się jej od razu nauczyć i trzymać nawet w małych programach
a jak wejdzie Ci w nawyk to będziesz miał później jak znalazł ;-)
http://pl.wikipedia.org/wiki/Notacja_w%C4%99gierska
Następne wpisy z tego wątku
- 24.04.14 21:01 Sylwester Łazar
- 24.04.14 21:01 Sylwester Łazar
- 24.04.14 21:05 Pszemol
- 24.04.14 21:10 Grzegorz Niemirowski
- 24.04.14 21:14 Sylwester Łazar
- 24.04.14 21:28 Pszemol
- 24.04.14 21:28 Pszemol
- 24.04.14 21:31 Grzegorz Niemirowski
- 24.04.14 23:15 Pszemol
- 25.04.14 08:05 Zbych
- 25.04.14 14:00 Pszemol
- 25.04.14 14:08 Sylwester Łazar
- 25.04.14 14:55 Pszemol
- 25.04.14 15:09 Zbych
- 25.04.14 17:04 Pszemol
Najnowsze wątki z tej grupy
- Jaki silikon lub może klej?
- Smar do video
- Litowe baterie AA Li/FeS2 a alkaliczne
- "ogrodowa linia napowietrzna"
- jaki zasilacz laboratoryjny
- jaki zasilacz laboratoryjny
- Puszka w ziemię
- T-1000 was here
- Ściąganie hasła frezem
- Koszyk okrągły, walec 3x AA, na duże paluszki R6
- Brak bolca ochronnego ładowarki oznacza pożar
- AMS spalony szybkim zasilaczem USB
- stalowe bezpieczniki
- Wyświtlacz ramki cyfrowej
- bateria na żądanie
Najnowsze wątki
- 2025-02-07 Jaki silikon lub może klej?
- 2025-02-07 Gdańsk => iOS Developer (Swift experience) <=
- 2025-02-07 Warszawa => Starszy Programista C <=
- 2025-02-07 Niby to nie sąd ale kooorwa tak to w sądach dziś wygląda?
- 2025-02-06 PROGRAM DOPŁAT DO AUT ELEKTRYCZNYCH TO ABSURD. ZA ŚRODKI Z KPO KUPIMY NIEMIECKIE I CHIŃSKIE AUTA
- 2025-02-05 ceny OC
- 2025-02-05 Re: ceny OC
- 2025-02-05 Re: ceny OC
- 2025-02-07 Smar do video
- 2025-02-06 Litowe baterie AA Li/FeS2 a alkaliczne
- 2025-02-07 Gliwice => Business Development Manager - Network and Network Security
- 2025-02-07 Warszawa => System Architect (Java background) <=
- 2025-02-07 Warszawa => System Architect (background deweloperski w Java) <=
- 2025-02-07 Warszawa => Solution Architect (Java background) <=
- 2025-02-07 Gliwice => Ekspert IT (obszar systemów sieciowych) <=