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

Odczyt temperatury z DS18B20 – wyjaśnienie kroków programu i konwersji danych

rufuse 07 Mar 2007 22:09 1743 10
  • #1 3654990
    rufuse
    Poziom 15  
    Posty: 192
    Pomógł: 7
    Ocena: 4
    Witam wszystkich
    przeczytałem wszystkie tematy związane z tym czujnikiem a i tak do końca nie wiem jak sie go odczytuje chcial bym by ktos na podstawie tego krotkiego programiku mogl mi wyjasnic co i jak
    Do
    Wait 1 //czekanie 1s
    1wreset //inicjalizacja transmisji
    1wwrite &HCC // wiem ze tak musi byc ale nie wiem do końca co to oznacza
    1wwrite &HBE //jak wyzej
    Odczyt(1) = 1wread(2) //tutaj nasuwa mi sie pytanie czy w tym miejscu jest odczyt 8 bitów
    T = Makeint(odczyt(1) , Odczyt(2)) //łączenie mlodszych i starszych bitów to znaczy ze dallas wysyła dwa razy po 4 bity??
    Tspr = T // od tego momentu juz nie rozumiem co i jak / czemu jest T jest akurat *10 potem dzielony na / 16 jesli był by ktoś skłonny mi to wytłumaczyc / był bym bardzo wdzieczny
    T = Abs(t)
    T = T * 10
    T = T / 16
    T = T / 10
    1wreset
    1wwrite &HCC
    1wwrite &H44
    Locate 1 , 1
    Lcd T ; "C"
    Loop

    po wgraniu tego programiku wyswietlacz wskazuje mi 85 albo 127 :(
    Wiem ze to jest bardzo proste ale najpier trzeba to zrozumiec.
  • #2 3655116
    redart
    Poziom 23  
    Posty: 529
    Pomógł: 51
    Ocena: 30
    Przykład z komentarzami:

    1wire_1 Alias P3.0
    Dim T As Word
    
    Sub 1wire1
       1wreset 1wire_1                     ' reset magistrali 1wire
       1wwrite &HCC 1wire_1            ' zaadresowanie DS'a - skip rom
       1wwrite &H44 1wire_1             ' polecenie dokonania konwersji
       Wait 1                          ' dajemy czas na konwersję (wystarczy 750ms)
       1wreset 1wire_1                     ' reset
       1wwrite &HCC 1wire_1            ' adres
       1wwrite &HBE 1wire_1             ' odczyt z DS'a
       Bd(1) = 1wread(9 , 1wire_1)    ' odczytujemy dwa pierwsze bajty
       1wreset 1wire_1                     ' i resetujemy magistralę (nie konieczne)
       Call Calc18b20                       ' skaczemy do procedury przeliczania
       Return
    End Sub
    
    Sub Calc18b20
       T = Makeint(bd(1) , Bd(2))      ' składamy dwa bajty w słowo 16 bitowe
       If T <= 2000 Then                  ' temperatura dodatnia
          T = T / 16                           ' przeliczamy do ludzkiej postaci
       Else                                       ' temperatura ujemna
          T = 65536 - T                      ' przeliczamy
          T = T / 16
          T = 0 - T
       End If
       Return
    End Sub


    Jeśli chodzi o rozróżnianie temp ujemnej i dodatniej to wystarczy sprawdzać najstarszy bit w starszym bajcie (lub liczbie 16bitowej) czyli b15.
    W twoim programie jest na początku oczekiwanie 1sec, ale po co?

    Pzdr.
  • #3 3655986
    rufuse
    Poziom 15  
    Posty: 192
    Pomógł: 7
    Ocena: 4
    Program ktory dalem powyzej znalazlem na forum te komentarze sam dalem tyle co wiedzialem z tego programu dlatego tam jest wait 1 sam sie troche nad tym glowilem bo wiekszosc osob twierdzi ze od 500ms do 750ms wystarczy. A redart mogłbyś mi wyjasnić to przeliczanie na ludzka postac??
    Nie moge tego skapowac.
    A jeszcze skoro ta linijka Bd(1) = 1wread(9 , 1wire_1) daje nan sczytanie dwa pierwsze bajty to skad ci sie wzielo potem nagle Bd(2)
  • #4 3656075
    szeri88
    Poziom 14  
    Posty: 163
    Pomógł: 11
    Ocena: 2
    Może to Ci pomoże w zrozumieniu:

       1wreset
       1wwrite &HCC
       1wwrite &H44
       Waitms 750
       1wreset
       1wwrite &HCC
       1wwrite &HBE
       T(1) = 1wread(2)
       Shift T(1) , Right , 4
       Shift T(2) , Left , 4
       Temp = T(1) + T(2)
  • #5 3656164
    rufuse
    Poziom 15  
    Posty: 192
    Pomógł: 7
    Ocena: 4
    szeri88 no ok ja to wiem wlasnie do tego momentu co napisales ale w komórce Temp masz teraz liczbe zapisana na 16 bitach i jak to teraz przerobic na ludzka postać bo samo Makedec(temp) nic mi nie da.

    Z tego programiku co napisał szeri88 to moj DS pokazuje 85 a po odłączeniu go 4095 i teraz to jakos musze przerobic.
  • #6 3658269
    gregoorr
    Poziom 18  
    Posty: 232
    Pomógł: 19
    Ocena: 34
    Ja robię tak:


    Dim Odczyt As Integer 'do czytania DS-a
    Dim T As Single

    Rem * * Odczyt Dsa * *
    1wreset
    1wwrite &HCC
    1wwrite &H44
    Wait 1
    1wreset
    1wwrite &HCC
    1wwrite &HBE
    Odczyt = 1wread(2)
    T = Odczyt
    T = T * 10
    T = T \ 16
    T = T \ 10
    Locate 1 , 1
    Lcd "Temp:" ; Fusing(t , "#.#") ; Chr(1) ; " "

    i mam odczyt z dokładnością do 0,1 stopnia.
  • #7 3658672
    szeri88
    Poziom 14  
    Posty: 163
    Pomógł: 11
    Ocena: 2
    Jeżeli pokazuje wartość 85 to problem spoczywa prawdopodobnie na szynie danych. Jak wykonałeś połączenie?
  • #8 3659420
    Michał_z1
    Poziom 16  
    Posty: 190
    Pomógł: 13
    Ocena: 2
    witam.
    wartość 85oC to jest wartość początkowa fabrycznie zapisaną w DSie, po włączeniu zasilania i odczytaniu danych z DSa bez dokonania wcześniejszej konwersji otrzymasz właśnie 85oC, i dana ta może być utrzymana jeżeli nie działa ci szyna, lub nie poprawnie wysyłasz polecenia, sprawdz parametr ERR, jeżeli wywali ci ERR=1 to oznacza błędy w działaniu szyny lub brak elementu na szynie, w innym przypadku (ERR=0) oznacza działanie poprawne ale problem może być po stronie przeliczania danych lub treści wysłanych poleceń.
    pozdrawiam.
  • #9 3659516
    golabeknew
    Poziom 12  
    Posty: 13
    U mnie dziala tak:


    1wire_1 Alias P3.0
    Dim T As Word

    Sub 1wire1
    1wreset 1wire_1 ' reset magistrali 1wire
    1wwrite &HCC 1wire_1 ' zaadresowanie DS'a - skip rom
    1wwrite &H44 1wire_1 ' polecenie dokonania konwersji
    Wait 1 ' dajemy czas na konwersję (wystarczy 750ms)
    1wreset 1wire_1 ' reset
    1wwrite &HCC 1wire_1 ' adres
    1wwrite &HBE 1wire_1 ' odczyt z DS'a
    Bd(1) = 1wread(9 , 1wire_1) ' odczytujemy dwa pierwsze bajty
    1wreset 1wire_1 ' i resetujemy magistralę (nie konieczne)
    Call Calc18b20 ' skaczemy do procedury przeliczania
    Return
    End Sub

    Sub Calc18b20
    T = Makeint(bd(1) , Bd(2)) ' składamy dwa bajty w słowo 16 bitowe
    If T <= 2000 Then ' temperatura dodatnia
    T = T / 16 ' przeliczamy do ludzkiej postaci
    Else ' temperatura ujemna
    T = 65536 - T ' przeliczamy
    T = T / 16
    T = 0 - T
    End If
    Return
    End Sub
  • #10 3659858
    rufuse
    Poziom 15  
    Posty: 192
    Pomógł: 7
    Ocena: 4
    NO okazalo sie bledne polaczenie ale teraz pytanie takie dlaczego jest tak If T <= 2000 Then ' temperatura dodatnia
    T = T / 16 ' przeliczamy do ludzkiej postaci
    Else ' temperatura ujemna
    T = 65536 - T ' przeliczamy
    T = T / 16
    T = 0 - T
    End If
    Return
    End Sub

    dlaczego akura jest warunek <= 2000 a nie jakas inna liczba
    Dlaczego T/16 a nie naprzyklad przez inna liczbe
    dlaczego T = 65536 - T co to za liczba 65536
    dalczego znowu T = T / 16
    przepraszam za tyle dlaczego ale chcial bym dokladnie sie dowiedziec co i jak. Podejzewam ze dla innych bedzie to przydatne.
  • #11 3660068
    szeri88
    Poziom 14  
    Posty: 163
    Pomógł: 11
    Ocena: 2
    Musisz zajrzeć do noty katalogowej. Na 4. stronie masz piękne przykłady. Pierwszy wysyłany bajt to ostatnie 8 bitów z tabeli, drugi bajt to pierwsze 8 bitów z tabeli. Więc te dwa bajty musimy podzielć na 4 "porcje". Najpierw zajmiemy się odczytem temperatury, bez miejsc po przecinku:
    Shift T(1) , Right , 4
    Shift T(2) , Left , 4
    Temp = T(1) + T(2)

    Instrukcja ta spowoduje, że pierwsze 4 bity zostaną przesunięte w prawo o 4 miejsca, więc w rezultacie otrzymamy wartość 0000XXXX. Następny bajt przesuniemy w lewo o 4 miejsca i otrzymamy wartość XXXX0000. Teraz po zsumowaniu tych dwóch wartości otrzymujemy wynik. Mam nadzieję, że coś zrozumiałeś. Teraz myślę, że sam sobie dorobisz resztę.

    Pozdrawiam

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy odczytu temperatury z czujnika DS18B20 za pomocą magistrali 1-Wire oraz interpretacji danych surowych. Omówiono sekwencję poleceń: reset magistrali (1wreset), adresowanie czujnika (1wwrite &HCC - Skip ROM), wyzwolenie konwersji temperatury (1wwrite &H44), oczekiwanie na zakończenie konwersji (około 750 ms do 1 s), ponowny reset i odczyt danych (1wwrite &HBE, 1wread). Wyjaśniono, że odczyt odbywa się poprzez pobranie dwóch bajtów (16 bitów), które łączone są funkcją Makeint w jedną wartość. Wartość ta jest interpretowana jako liczba całkowita, gdzie dzielenie przez 16 (przesunięcie o 4 bity) konwertuje surowe dane na temperaturę w stopniach Celsjusza z rozdzielczością 0,0625°C. Warunek T
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA