eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronikaDziałająca biblioteka do BMP085Re: Działająca biblioteka do BMP085
  • 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

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: