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

Jak dostosować kod Bascom dla czujnika DS18B20 zamiast DS1820?

Lukis 14 Lis 2007 20:43 3229 4
  • #1 4481544
    Lukis
    Poziom 11  
    Posty: 48
    Piszę program do prostego sterownika pieca, w książce "Programowanie mikrokontrolerów avr w j. Bascom" mam opisana obsługę czujnika DS1820, w sklepie elektronicznym w moim mieście mieli tylko DS18B20, myślałem że nie będą się może różnić za wiele, mogłem zajrzeć do noty katalogowej ale już za późno. Przeglądałem noty katalogowe tych dwóch układów, z tego co się na razie dowiedziałem to różnią się sposobem przetwarzania temperatury na sygnał cyfrowy. Próbowałem przerobić jakoś ten program ale nie bardzo mi to wychodziło, może ktoś kto się bardziej na tym zna poradzi sobie bez problemu ze zmianą kodu, bo mi sie to na razie nie udaje.
    Poniżej zamieszczam ten kod który mam z książki:
    
    $regfile = "m8def.dat"
    $crystal = 8000000
    
    
    Config Lcd = 24 * 2
    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
    
    Config 1wire = Portb.0
    
    Declare Sub Odczyt_temp
    
    Dim Temperatura(2) As Byte
    
    Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32
    
    Do
       Call Odczyt_temp
       Cls
       If Temperatura(2) = 0 Then
       Lcd "Temp: " ; Temperatura(1) ; Chr(0) ; "C"
       Else
       Lcd "Temp: -" ; Temperatura(1) ; Chr(0) ; "C"
       End If
    Loop
    End
    
    Sub Odczyt_temp
    
       1wreset
       1wwrite &HCC
       1wwrite &H44
       Waitms 750
       1wreset
       1wwrite &HCC
       1wwrite &HBE
    
       Temperatura(1) = 1wread(2)
    
       1wreset
       If Err = 1 Then
          Cls
          Lcd "Brak ukladu"
          Do
          Loop
          End If
          If Temperatura(2) > 0 Then
    
             Temperatura(1) = 256 - Temperatura(1)
          End If
          Temperatura(1) = Temperatura(1) / 2
    End Sub
    


    Czujnik DS18B20 z tym programem działa niepoprawnie tzn:
    - pokazuje temperaturę ujemną,
    - temperatura jest za "duża" (-60 stopni C w tem. domowej),
    - podczas nagrzewania tem. rośnie tzn minus jest coraz mniejszy
    - podczas przekraczania 0 stopni zamiast wskoczyć plus pojawia się -127

    Będę wdzięczny za pomoc bo jak na razie nie udało mi sie tak zmodyfikować programu aby działał poprawnie.
  • #2 4481639
    JOLLY
    Poziom 15  
    Posty: 198
    Pomógł: 5
    Ocena: 8
    Z DS18B20 robisz tak:

    
    
    Deflcdchar 0 , 32 , 28 , 20 , 28 , 32 , 7 , 4 , 7
    Dim I1 As Integer , T1 As String * 6
    Dim Dsid1(8) As Byte
    
    Dsid1(1) = 1wsearchfirst()
    
     1wreset
       1wwrite &H55
       1wverify Dsid1(1)
       1wwrite &HBE
       I1 = 1wread(2)
     
       1wreset
       1wwrite &HCC
       1wwrite &H44
    
     Waitms 750
    
       I1 = I1 * 10
       I1 = I1 / 16
       T1 = Str(i1)
       T1 = Format(t1 , " 0.0")
    
    Lcd ; T1 ; Chr(0) ; "C"
    
       


    Powinno działać.
    I cały kod:

    
    
    $regfile = "m8def.dat"
    
    $crystal = 8000000
          '
    Config Pind.0 = Input
    Config Pind.1 = Input
    Config Pind.3 = Input
    
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portc.3 , Db6 = Portc.2 , Db7 = Portc.1 , E = Portb.1 , Rs = Portc.0       'konfiguracja linii
    
    Config 1wire = Portb.0
    Config Sda = Portc.4
    Config Scl = Portc.5
    Config I2cdelay = 10
    I2cinit
    
    Set Portd.0
    Set Portd.1
    S1 Alias Portd.0
    S2 Alias Portd.1
    S3 Alias Portd.3
    
    
    Declare Sub Ustawh
    Declare Sub Ustawm
    Config Debounce = 20
    
    
    
    Deflcdchar 0 , 32 , 28 , 20 , 28 , 32 , 7 , 4 , 7
    Dim I1 As Integer , T1 As String * 6
    Dim I2 As Integer , T2 As String * 6
    Dim Dsid1(8) As Byte
    Dim Dsid2(8) As Byte
    Dim M As Byte
    Dim S As Byte
    Dim H As Byte
    Dim D As Byte
    Dim Mon As Byte
    
    Dsid1(1) = 1wsearchfirst()
    Dsid2(1) = 1wsearchnext()
    
    
    Cursor Off Noblink
    Cls
    
    Do
      '1wire
     1wreset
       1wwrite &H55
       1wverify Dsid1(1)
       1wwrite &HBE
       I1 = 1wread(2)
       '---------------------------------
       1wreset
       1wwrite &H55
       1wverify Dsid2(1)
       1wwrite &HBE
       I2 = 1wread(2)
       '---------------------------------
       1wreset
       1wwrite &HCC
       1wwrite &H44
    
     Waitms 750
    
       I1 = I1 * 10
       I1 = I1 / 16
       T1 = Str(i1)
       T1 = Format(t1 , " 0.0")
    
       I2 = I2 * 10
       I2 = I2 / 16
       T2 = Str(i2)
       T2 = Format(t2 , " 0.0")
    
       'i2c
    
       I2cstart
       I2cwbyte 160
       I2cwbyte 0
       I2cwbyte 8
       I2cstop
       I2cstart
       I2cwbyte 160
       I2cwbyte 2
       I2cstart
       I2cwbyte 161
       I2crbyte S , Ack
       I2crbyte M , Ack
       I2crbyte H , Ack
       I2crbyte D , Ack
       I2crbyte Mon , Nack
       I2cstop
    
    
    H = Makedec(h) : M = Makedec(m) : S = Makedec(s)
    
     If H < 10 Then
       Lcd "0" ; H ; ":"
       Else
       Lcd H ; ":"
     End If
     Locate 1 , 4
       If M < 10 Then
       Lcd "0" ; M ; ":"
       Else
       Lcd M ; ":"
     End If
     Locate 1 , 7
       If S < 10 Then
          Lcd "0" ; S ;
          Else
          Lcd ; S ;
     End If
    Locate 1 , 11
    Lcd ; T1 ; Chr(0) ; "C"
    Locate 2 , 1
    Lcd Bcd(d) ; "/" ; Bcd(mon)
    Locate 2 , 11
    Lcd ; T2 ; Chr(0) ; "C"
    
    
    
    Home
    
    Waitms 180
    
    Debounce Pind.0 , 0 , Ustawh , Sub
    
    Debounce Pind.1 , 0 , Ustawm , Sub
    
    Loop
    End                                                         'end program
    
    Ustawh:
    H = H + 1
    If H > 23 Then
       H = 0
    End If
    M = Makebcd(m)
    H = Makebcd(h)
    
    I2cstart
    I2cwbyte 160
    I2cwbyte 2
    I2cwbyte S
    I2cwbyte M
    I2cwbyte H
    I2cstop
    Return
    
    Ustawm:
    S = 0
    M = M + 1
    If M > 59 Then
       M = 0
    End If
    M = Makebcd(m)
    
    I2cstart
    I2cwbyte 160
    I2cwbyte 2
    I2cwbyte S
    I2cwbyte M
    I2cstop
    Return
    
  • #3 4492034
    Lukis
    Poziom 11  
    Posty: 48
    Mógłby mi ktoś przysłać screena jak ma wyglądać ustawienie fuse bitów w atmega8? Bo coś mam chyba namieszane bo porty nie reagują, tzn nie mogę odczytać czy jest 0 czy 1 na danej nóżce. Program mam dobrze napisany bo nawet słowo w słowo z książki próbowałem i nic.
  • #4 4493068
    JOLLY
    Poziom 15  
    Posty: 198
    Pomógł: 5
    Ocena: 8
    ustaw na podstawie innej atmegi jeśli posiadasz. Jeśli nie polecam temat przyklejony o fuse bitach. Niestety nie pomogę ci, fusy ustawiam w bascomie, co nawiasem mówiąc jest proste i zrozumiałe. I nie polecam grzebanie w fusach jeśli nie wiesz dokładnie co od czego jest.
REKLAMA