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

Ds 18b20 temperatury ujemne

Adrian1978 14 Lut 2021 12:34 642 7
REKLAMA
  • #1 19255236
    Adrian1978
    Poziom 11  
    Witajcie, chciałbym lekko odgrzać kotleta i poprosić o wskazanie błędu przy próbie wyliczenia temperatur ujemnych. Odczytuję czujnik DS18B20 w maleńkim ATTINY13 (zmienne float właściwie odpadają) i co około sekundę wysyłam wynik poprzez UART. Dla temperatur dodatnich - dzięki uprzejmości p. Podkalickiego i jego "odchudzonej" biblioteki DS18B20 działa to fajnie ale przy ujemnych mam jakiś kłopot z szybkim przeliczaniem temperatury ujemnej - ciut to głupieje. Mógłby któryś z kolegów wskazać co ja tu zchrzaniłem ? odpytywanie czujnika zwraca wartość uint16_t, gdzie np. 2465 oznacza temperaturę 24,65 st.C. Jednak czujnik w ujemnym zakresie wywala wynik w kodzie U2 (?).
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #2 19255493
    BlueDraco
    Specjalista - Mikrokontrolery
    Zajrzyj w jeden z co najmniej stu wątków na ten temat na tym forum. Wszystko zostało opisane dziesiątki razy.
  • REKLAMA
  • #3 19255524
    Adrian1978
    Poziom 11  
    Dziękuję, jednak z racji okrojonej pamięci chciałbym użyć bibliotek p. Łukasza, bo jeszcze udaje mi się tam upchnąć inne składniki softu, obsługa piękna i prosta, a tu na forum temat poruszany często dla innych procków i w dość rozbudowany sposób. Póki co nie znalazłem nic mega uproszczonego :( może jeszcze na odpowiedni temat nie trafiłem (https://www.elektroda.pl/rtvforum/topic634744.html - ale to nie do końca to)
  • REKLAMA
  • #4 19255861
    BlueDraco
    Specjalista - Mikrokontrolery
    To nie ma związku z typem procesora - dane z DS18B20 i sposób ich obróbki są zawsze takie same.
    Kodo powyżej jest przekombinowany i błędny. Poprawnych przykładów znajdziesz na tym forum sporo - wystarczy poszukać.
  • #5 19257153
    gmp
    Poziom 19  
    Adrian1978 napisał:
    Dziękuję, jednak z racji okrojonej pamięci chciałbym użyć bibliotek p. Łukasza, bo jeszcze udaje mi się tam upchnąć inne składniki softu, obsługa piękna i prosta, a tu na forum temat poruszany często dla innych procków i w dość rozbudowany sposób. Póki co nie znalazłem nic mega uproszczonego :( może jeszcze na odpowiedni temat nie trafiłem (https://www.elektroda.pl/rtvforum/topic634744.html - ale to nie do końca to)


    Prosty bład:
    uint16_t t;
    t = DS18B20_read(); //do zmiennej t wpisz odczyt z czujnika DS18B20
    [....]
    uint8_t ujemna = ~t+1;

    Ciężko upchnąć 16 bitów w 8.
  • #6 19257293
    ex-or
    Poziom 28  
    Adrian1978 napisał:
    chciałbym użyć bibliotek p. Łukasza,

    Wciągnij sobie nową wersję z obsługą liczb ujemnych (autor najwyraźniej czyta elkę bo kilka godzin temu poprawił liba ;-)).
  • REKLAMA
  • #7 19257418
    BlueDraco
    Specjalista - Mikrokontrolery
    prosty błąd:

    uint16_t t;

    powinno być
    int16_t t;
    - bo odczyt z DS jest liczbą ze znakiem w kodzie U2.

    if (t < 0)
    {
    znak = '-';
    t = -t; // zamiast tajemniczej negacji z dodaniem jedynki, która robi to samo, ale za to magiczniej
    }

    A dalej poszukaj, leniuszku - jeszcze dwa kroki.
  • #8 19257539
    Adrian1978
    Poziom 11  
    Dziękuję Wam - za przytyki również :) już sprawdzam.

    Wczoraj ruszyło, po zmodyfikowaniu funkcji odpytywania czujnika (odpytuję DS-a i wsadzam w zmienną zwracaną tylko MSB i LSB a dopiero w pętli głównej sprawdzam znak i dokonuję przeliczeń osobno dla dodatnich i ujemnych) - wygląda na to że wstępnie działa, ale Wasze uwagi bardzo słuszne - dziękuję raz jeszcze. Deklarację zmiennej uint8_t oraz int16_t przeoczyłem.

    Pozdrawiam serdecznie :)
REKLAMA