logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Konwersja float na string - dane z ds18b20 i PC

^Rachel 10 Cze 2011 22:30 2617 4
REKLAMA
  • #1 9598299
    ^Rachel
    Poziom 21  
    Witam !

    Piszę program regulatora temperatury. Używam czujnika ds18b20, którego obsługuje Attiny2313. Komunikacja z komputerem poprzez USART. Postanowiłem, że prześle 2B danych z czujnika ds18b20 i konwersje dokonam na komputerze, w terminalu otrzymuje śmieszne krzaczki, ale nie przejąłem się tym, napisałem w Delphi używając bibliotek CPort program do wyświetlania temperatury :
    Kod: Delphi
    Zaloguj się, aby zobaczyć kod


    Program pobiera 2B, przelicza je na temperaturę i konwertuje na stringa, jednak po skompilowaniu tego programu w memo1 otrzymuję coś takiego:

    
    1871819,25
    1868763,25
    1871819,25
    1868763,25
    1871819,25
    1868763,25
    1871819,25
    1868763,25
    1871803,25
    1868763,25
    1871819,25
    1868763,25
    1871819,25
    1868763,25
    


    nie wiem co jest grane, proszę o pomoc.

    Pozdrawiam.

    Dodano po 2 [minuty]:

    Może wystarczy, że wynik podzielę przez 100000 wtedy otrzymam przesunięcie przecinka w lewo o 5 pozycji i może to będzie wynikiem temperatury ?

    Dodano po 14 [minuty]:

    Potraktowałem czujnik hot airem ale temperatura i tak się znacząco nie zmienila .
  • REKLAMA
  • #2 9598483
    piotrek700
    Poziom 13  
    Robiłem tez termometr na tym samym procesorze i na tym samym termometrze. Dobrze ci radzę nie kombinuj z liczbami zmiennoprzecinkowymi bo sama obługa liczb zmiennoprzecinkowych zajmie ci połowę pamięci. Operuj na liczbach całkowitych ewentualnie mnóż wynik przez 10^x żeby mieć dokładniejszy pomiar. Tu masz przykład jak ja to zrobiłem Link
  • REKLAMA
  • #3 9598524
    ^Rachel
    Poziom 21  
    Ale przecież ja wysyłam 2B danych do komputera i tam dopiero wykonywana jest konwersja, zreszta nie mam na tyle pamieci w uC, zeby uzyc instrukcji do rzutowania typu sprintf czy innych.
  • REKLAMA
  • Pomocny post
    #4 9600119
    Andrzej__S
    Poziom 28  
    Zacząłbym od tego:
    Otrzymujesz wartość zmiennej temperatura równą np. 1871819,25.
    Jak przemnożysz to przez 16 to okaże się, że wyrażenie (temp1 + (temp2*256)) zwraca wartość 29 949 108.
    Teoretycznie zmienne temp1 i temp2 nie powinny przyjmować wartości większych od 255, więc wartość maksymalna wyrażenia (temp1 + (temp2*256)) = (255 + (255*256)) = 65535.
    Wniosek z tego taki, że temp1 i/lub temp2 prawdopodobnie przyjmują wartości większe niż powinny przyjmować.
    Możesz to sprawdzić np. konwertując temp1 i temp2 do stringa (IntToStr) i zapisując w memo1. Dla temperatur pokojowych zmienna temp2 (MSB) nie powinna być większa niż 2. Dowiesz się w ten sposób, czy prawidłowo odbierasz bajty. Być może wina leży po stronie mikrokontrolera lub jest problem z komunikacją.

    Druga sprawa:
    Zwróć uwagę na format danych rejestru temperatury w datasheet strona 4.
    Twój sposób łączenia dwóch bajtów raczej nie zda egzaminu w przypadku temperatur ujemnych. Nie znam Delphi, więc nie podam rozwiązania, ale powinieneś to zrobić raczej za pomocą przesunięć bitowych: (MSB) temp2 - 8 bitów w lewo po czym funkcja OR z (LSB) temp1. No i pamiętaj, że w komputerze integer ma 32 bity, więc 1 na pozycji bitu 15 nie spowoduje potraktowania liczby jako ujemnej. Może powinieneś użyć zmiennej 16-bitowej (zdaje się SmallInt?).
  • #5 9603491
    ^Rachel
    Poziom 21  
    Doszedłem w czym był błąd, po prostu źle konwertowałem dane.
    Napisałem taki kod :
    Kod: Delphi
    Zaloguj się, aby zobaczyć kod


    msb2 i lsb1 po sklejeniu dadzą mi część całkowitą temperatury, lsb2 da mi część przecinkową, a msb1 daje mi znak.

    Jednak czasami warto posiedziec dodatkowy dzień nad czymś nim się zaśmieci forum. Ale dziękuję za zainteresowanie, pozdrawiam.
REKLAMA