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

Dlaczego DS18B20 pokazuje 0.0°C? Kod nie działa poprawnie

darrrrek 23 Paź 2006 18:33 1353 5
  • #1 3145870
    darrrrek
    Poziom 22  
    Posty: 733
    Pomógł: 4
    Ocena: 98
    Witam !

    Przegladlem juz milion kodow obslugujacych dwa termometry DS18B20, jednak zaden nie chce mi prawidlowo zadzialac...sklecilem z kilku kodow cos takiego:

    Config 1wire = P2.5

    Dim Dat(9) As Byte
    Dim Ad1(8) As Byte , Ad2(8) As Byte
    Dim T As Single , T1 As Single
    Dim Tmp As String * 6
    cls
    
    Ad1(1) = 1wsearchfirst()
    'Ad2(1) = 1wsearchnext()
    
    1wreset
    1wwrite &HCC
    1wwrite &H44
    Wait 1
    1wreset
    1wwrite &H55
    1wwrite Ad1(1) , 8
    1wwrite &HBE
    
    Dat(1) = 1wread(9)
    1wreset
    
    
    
    T = Makeint(dat(1) , Dat(2))
    
    T = T * 10
    T = T / 16
    
    Locate 1 , 1
    Lcd T
    End


    Gdzie jest blad ze temperatura jest rowna caly czas 0.0 C ???
    Jak widać w kodzie narazie chce tylko z jednego zczytac jak sie uda to biore sie za drugi:)

    Pozdrawiam
  • #2 3145980
    Electix
    Poziom 21  
    Posty: 462
    Pomógł: 46
    Ocena: 6
    Siemka!

    1: Sprawdź z tym poleceniem
    
    Config 1wire = PORTB.5
    1wreset              
    

    Ty przytaczasz to polecenie w trochę inny sposób.

    2: Sprawdź czy poprawnie podłączyłeś układ czujnika, czy nie pomyliłeś końcówek i czy masz podłączony do linii DQ portu 1-Wire rezystor podciągający np: 4,7KΩ

    3: W kodzie który przytaczasz usuń tę linijkę z mnożeniem przez 10 bo ona jest zbędna no i po co ciągniesz z kości cały scratchpad skoro nie robisz sprawdzenia sumy kontrolnej CRC? Zamiast zmiennej tablicowej Dat załóż zmienną o tej samej nazwie ale INTEGER i poleceniem 1wread(2) bezpośrednio wczytasz interesującą Cię wartość i nie będziesz sie musiał zabawiać w jakieś podmiany bajtów. Wtedy tą wartość podziel przez 16 i zapisz w zmiennej single i kwestja sformatowania tego wyniku i wyświetlenia...

    Popróbuj zastosować się do moich wskazówek, jak sobie nie poradzisz spróbujemy sklecić jakiś gotowy kod dla Ciebie :)

    Powodzenia!!
  • #3 3146021
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    darrrrek napisał:

    ...Gdzie jest blad ze temperatura jest rowna caly czas 0.0 C ???

    A dla czego nie sprawdzisz w programie , czy procek "widzi" DS-a :?:
    Czy Crystal dobrze zadeklarowany :?:
    Czy Config 1wire zgadza się ze stanem faktycznym :?:
    Pull-up pomiędzy DQ a VCC jest :?:
    Co z zasilaniem DS-a :?:
    Jaki "szybki/wolny" masz rezonator :?:
    ...
    Wróżki są na urlopie macierzyńskim ;)

    Piotrek
  • #4 3146025
    darrrrek
    Poziom 22  
    Posty: 733
    Pomógł: 4
    Ocena: 98
    zapomnialem dodac ze pisze to na AT89S8252 a nie AVR'a :) jezeli mam jeden czujnik podpiety i odczytuje temp z niego nie pobierajac numeru seryjnego czujnika to dziala bez problemu....problem sie dopiero pojawia jak wysylam komendy do danego czujnika.

    Dodano po 6 [minuty]:

    kwarc 16MHz, Config 1wire napewno jest ok bo na jednym czujniku dziala:) jak wpisze zeby wyszukalo ile jest czujnikow to widzi dwa bez problemu
  • #5 3146052
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    A co z zasilaniem DS-a :?:
    Opisz dokładnie jak jest podłączony , czyli gdzie VCC,DQ,GND.

    Piotrek
  • #6 3146118
    darrrrek
    Poziom 22  
    Posty: 733
    Pomógł: 4
    Ocena: 98
    VCC do +5V, DQ do P2.5, oraz rezystorem (4k7) do +5V, GND do masy. Gdy podłanczam 2 czujniki łącze je rownolegle DQ obojga czujnikow na jednej lini p2.5

    Dodano po 1 [godziny] 6 [minuty]:

    Witam juz rozwiazalem problem :)

    tak krecilem az sie udalo :) w sumie sam nie wiem co bylo nie tak.
    Dla osób ktore mają podobne problemy daje kod ktory na 1000% dziala

    Deflcdchar 1 , 4 , 10 , 4 , 32 , 32 , 32 , 32 , 32
    Dim T1 As Single
    Dim T2 As Single
    Dim B1 As Byte , B2 As Byte
    Dim Tmp As String * 6
    Dim Adr(8) As Byte , Adr1(8) As Byte
    Dim Znak As String * 1
    Dim I As Byte
    
    Cursor Off
    
    Adr(1) = &H28
    Adr(2) = &HBA
    Adr(3) = &H0C
    Adr(4) = &HE0
    
    Adr(5) = &H00
    Adr(6) = &H00
    Adr(7) = &H00
    Adr(8) = &HBE
    
    Adr1(1) = &H28
    Adr1(2) = &HD5
    Adr1(3) = &H99
    Adr1(4) = &HE0
    
    Adr1(5) = &H00
    Adr1(6) = &H00
    Adr1(7) = &H00
    Adr1(8) = &H3C
    
    Config 1wire = P2.5
    Cls
    
    Do
    1wreset
    1wwrite &HCC
    1wwrite &H44
    
    Wait 1
    
    For I = 1 To 2
    
    1wreset
    1wwrite &H55
    
    Select Case I
       Case 1 : 1wwrite Adr(1) , 8
       Case 2 : 1wwrite Adr1(1) , 8
    End Select
    
    1wwrite &HBE
    B1 = 1wread()
    B2 = 1wread()
    1wreset
    
    
    If B2 >= 248 Then
    B1 = 255 - B1
    B2 = 255 - B2
    Znak = "-"
    Else
    Znak = "+"
    End If
    T1 = B1 / 16
    T2 = B2 * 16
    T1 = T1 + T2
    
    Tmp = Fusing(t1 , ###.&)
    
    Locate I , 1
    Lcd Znak ; Tmp ; Chr(1) ; "C"
    Wait 1
    Next I
    Loop
    
    
    Przy okazji zauwazylem ze jeden z czujnikow zaniza temp o 5.6 stopnia...hehe
    
    Pozdrawiam
REKLAMA