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

[mega8][BASCOM] Błędny odczyt z DS18b20

mkpl 03 Lut 2012 14:29 2003 3
  • #1 10489076
    mkpl
    Poziom 37  
    Witam

    Prosił bym o zweryfikowanie kodu. Wydaje mi się ok ale nie chcę od razu uśmiercać DS'a.

    DS daje mi odczyt 4095.94 (nawet po odłączeniu nóżki od masy, po odłączeniu zasilania lub nogi danych pokazuje 0).

    
    $regfile = "m8def.dat"
    $crystal = 16000000
    
    
    
    Config Portb = 255
    Portb = 255
    Config Portc = 255
    Portc = 255
    Config Portd = 255
    Portd = 255
    
    
    
    
    Config 1wire = Pinc.0
    
    Config Lcdpin = Pin , Rs = Portd.7 , E = Portd.6 , Db4 = Portd.5 , Db5 = Portd.4 , Db6 = Portd.3 , Db7 = Portd.2
    Config Lcdbus = 4
    Config Lcd = 16 * 2
    Cls
    Cursor Off Noblink
    
    
    Enable Interrupts
    '///////////////////////////////////////////////
    
    '***********************************************
    'Zmienne
    '***********************************************
    Dim Lsb As Byte
    Dim Msb As Byte
    Dim Tempa As Single
    Dim Tekst1 As String * 10
    
    '///////////////////////////////////////////////
    
    Lcd "test DS18B20"
    Print "tester DS18b20"
    Wait 1
    
    
    
    Do
      1wreset
    
      1wwrite &HCC
      1wwrite &H44
      Waitms 750
      Waitms 750
    
      1wreset
    
      1wwrite &H55
      1wwrite &HBE
    
      Lsb = 1wread():
      Msb = 1wread():
    
      Tempa = Msb * 256
      Tempa = Tempa + Lsb
      Tempa = Tempa / 16
      Tekst1 = Fusing(tempa , "#.##")
    
    
    
      Cls
      Lcd "DS18B20= " ; Tekst1
    
      Print "Temperatura: " ; Tekst1
    
    Loop
    End
    
  • #2 10489253
    maximus22_kr
    Poziom 18  
    Ja to od dawna używam takiego kodu:

    
    Dim I as Integer
    Dim Ss1 as string*5
    
    1wreset
       1wwrite &H55
       1wverify Dsid1(1)
       1wwrite &HBE
       I1 = 1wread(2) 
    
     1wreset
       1wwrite &HCC
       1wwrite &H44
     Waitms 750 
    
     I1 = I1 * 10
       I1 = I1 / 16
       Ss1 = Str(i1)
       Ss1 = Format(ss1 , " 0.0")
    
    
  • #3 10489896
    mkpl
    Poziom 37  
    Odpaliłem i idziała :)

    Problem w tym, że pokazuje coś nie tak. Temperatura dodatnia błąd na plus około 2 stopień. Zamiast 22 pokazuje 24.3 a przy ujemnej (zwykły termometr) pokazuje -13 zamiast - 18

    Do
      1wreset
    
      1wwrite &HCC
      1wwrite &H44
      Waitms 250
      Waitms 250
    
      1wreset
    
      1wwrite &HCC
    
      1wwrite &HBE
    
      Lsb = 1wread():
      Msb = 1wread():
    
      Tempa = Msb * 256
    Tempa = Tempa + Lsb
    
    If Msb.7 = 0 Then
       Temp = Tempa / 16
    Else
      Tempa = Not Tempa
      Tempa = Tempa +1
      Temp = Tempa / 16
      Temp = -1 * Temp
    End If
      Tekst1 = Fusing(temp , "#.##")
    
  • #4 10490511
    arktik1
    Poziom 27  
    Przede wszystkim DS na konwersje potrzebuje ok 750ms, ty zastosowałeś 500.
    Po co stosujesz 2x Waitms?
    Do pomiaru temperatury potrzebne jest stabilne zasilanie 5V.
    Robiłem ostatnio termometr do szklarni i wahania napięcia spowodowane zaświecaniem kilku LED, powodowało różnicę odczytu ok 1,5 stopnia.
REKLAMA