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

[bascom][ds18b20] Problem z odczytem temperatury

rav1989 13 Sie 2009 16:38 3425 0
  • #1 6889274
    rav1989
    Poziom 11  
    Witam

    Wczoraj zakupiłem sobie czujnik ds18b20 miał być ds1820 o czym dowiedziałem się dopiero w domu po nieudanej probie odczytu temperatury. Kod który użyłem pochodził z książki M. Wiązani. (niżej go zamieszczam). i tak po połączeniu wszystkiego wg. schematu dostałem odczyt temperatury -52 st. C co jest absurdem bo powinno być ok. 20 - 21 st. C i tak zacząłem szukać na forum jak by odczytać temp. z tego czujnika i znalazłem kod przerobiłem oryginalny i otrzymałem prawdo podobnie prawidłowy wynik 21.00 st. C niestety podczas próby z suszarką do włosów (chciałem sprawdzić czy da radę mierzyć wysokie temp.) stało się coś dziwnego otóż po dojściu do 35 st. C skala zmieniła się na ujemna i tak oto temp. zaczęła spadać... to też chciałem się zapytać co mogło być spowodowane nagłą zmianą skali? kod oryginalny z książki i przerobiony prze zemnie zamieszczam niżej :) oraz proszę o wskazanie błędu w mojej wersji :)

    Oryginalny:
    
    'Program  obsługi jednego układu DS1820 dołączonego
    'do magistrali 1-Wire
    
    $regfile = "m8def.dat"                                      'informuje kompilator o pliku
          'dyrektyw mikrokontrolera
    $crystal = 8000000                                          'informuje kompilator
          'o częstotliwości oscylatora
          'taktującego mikrokontroler
    Config Lcd = 16 * 2                                         'konfiguracja typu wyświetlacza
          'LCD
    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5       'konfiguracja linii
          'mikrokontrolera‚ do których
          'dołączono wyświetlacz
          'LCD
    Config 1wire = Portb.0                                      'konfiguracja linii magistrali
          '1-Wire
    Declare Sub Odcz_temp                                       'procedura odczytu temperatury
          'z układu DS1820
    Dim Temperatura(2) As Byte                                  'tablica dwóch zmiennych typu
          'Byte do pamiętania wartości
          'temperatury
    'definicja znaku stopnia
    Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32
    
    Do                                                          'początek pętli programu
     Call Odcz_temp                                             'wywołanie procedury pomiaru
          'temperatury
     Cls                                                        'czyszczenie ekranu LCD
     If Temperatura(2) = 0 Then                                 'jeśli wartość Temperatura(2)=
          '=0, to temperatura dodatnia
          'wyświetla temperatury dodatnie
      Lcd "Temp: " ; Temperatura(1) ; Chr(0) ; "C"
     Else                                                       'w przeciwnym razie
          'wyświetla temperatury ujemne
      Lcd "Temp: -" ; Temperatura(1) ; Chr(0) ; "C"
     End If
    Loop                                                        'koniec pętli Do...Loop
    End                                                         'koniec programu
    
    Sub Odcz_temp                                               'definicja procedury pomiaru
          'temperatury
     1wreset                                                    'reset magistrali 1-Wire
     1wwrite &HCC                                               'opuszczenie zapisu numeru ID
     1wwrite &H44                                               'start pomiaru temperatury
     Waitms 750                                                 'opóźnienie na czas pomiaru
     1wreset                                                    'reset magistrali 1-Wire
     1wwrite &HCC                                               'opuszczenie zapisu numeru ID
     1wwrite &HBE                                               'komenda odczytu zmierzonej
          'temperatury
     Temperatura(1) = 1wread(2)                                 'odczyt zmierzonej temperatury
          'do tablicy Temperatura
     1wreset                                                    'reset magistrali 1-Wire
     If Err = 1 Then                                            'jeśli układ dołączony do
          'magistrali nie odpowiada, to
      Cls                                                       'czyszczenie LCD
      Lcd "Brak ukladu"                                         'wyświetlenie komunikatu o braku
          'dołączonego układu
      Do                                                        'nieskończona pętla w celu
          'wstrzymania działania programu
      Loop
     End If
     If Temperatura(2) > 0 Then                                 'jeśli zmienna Temperatura(2)
          '> 0, to temperatura ujemna
          'przeliczenie temperatury
          'ujemnej
      Temperatura(1) = 256 - Temperatura(1)
     End If                                                     'koniec warunku
     Temperatura(1) = Temperatura(1) / 2
          'dalsze przeliczenie odczytanej
          'temperatury dodatniej jak
          'i ujemnej
    End Sub 
    


    Przerobiony (z błędem):
    'Program  obsługi jednego układu DS1820 dołączonego
    'do magistrali 1-Wire przerobiony przez rav1989
    
    informuje kompilator o pliku dyrektyw mikrokontrolera
    $regfile = "m8def.dat"                                     
    
    'informuje kompilator o częstotliwości oscylatora taktującego mikrokontroler
    $crystal = 8000000                                         
    
    'konfiguracja typu wyświetlacza LCD   
    Config Lcd = 16 * 1a                                    
                                                  
    'brak kursora
    Cursor Off 
    
    'konfiguracja linii mikrokontrolera do których dołączono wyświetlacz LCD   
    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5       
    
    'konfiguracja linii magistrali 1-Wire
    Config 1wire = Portb.0                                     
        
    'procedura odczytu temperatury z układu DS1820
    Declare Sub Odcz_temp                                    
         
    'definicje
    Dim Temperatura(2) As Byte
    Dim Odczyt As Single
    Dim Temp As String * 5
    
    'definicja znaku stopnia
    Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32
    
    Do                                                          'początek pętli programu
     Call Odcz_temp                                             'wywołanie procedury pomiaru temperatury  
                                                                                            
     Cls                                                        'czyszczenie ekranu LCD
     If Temperatura(2) = 1 Then                                 'jeśli wartość Temperatura(2)=
          '=1, to temperatura dodatnia
          'wyświetla temperatury dodatnie
      Lcd "Temp: " ; Temp ; Chr(0) ; "C"
     Else                                                       'w przeciwnym razie
          'wyświetla temperatury ujemne
      Lcd "Temp: -" ; Temp ; Chr(0) ; "C"
     End If
    Loop                                                        'koniec pętli Do...Loop
    End                                                         'koniec programu
    
    Sub Odcz_temp                                               'definicja procedury pomiaru
          'temperatury
     1wreset                                                    'reset magistrali 1-Wire
     1wwrite &HCC                                               'opuszczenie zapisu numeru ID
     1wwrite &H44                                               'start pomiaru temperatury
     Waitms 750                                                 'opóźnienie na czas pomiaru
     1wreset                                                    'reset magistrali 1-Wire
     1wwrite &HCC                                               'opuszczenie zapisu numeru ID
     1wwrite &HBE                                               'komenda odczytu zmierzonej
          'temperatury
     Temperatura(1) = 1wread(2)                                 'odczyt zmierzonej temperatury
          'do tablicy Temperatura
     1wreset                                                    'reset magistrali 1-Wire
     If Err = 1 Then                                            'jeśli układ dołączony do
          'magistrali nie odpowiada, to
      Cls                                                       'czyszczenie LCD
      Lcd "Brak ukladu"                                         'wyświetlenie komunikatu o braku
          'dołączonego układu
      Do                                                        'nieskończona pętla w celu
          'wstrzymania działania programu
      Loop
     End If
     If Temperatura(2) < 1 Then                                 'jeśli zmienna Temperatura(2)
          '> 0, to temperatura ujemna
          'przeliczenie temperatury
          'ujemnej
      Temperatura(1) = 256 - Temperatura(1)
     End If                                                     'koniec warunku
     Odczyt = Temperatura(1) / 8      'dalsze przeliczenie odczytanej
          'temperatury dodatniej jak
          'i ujemnej
     Temp = Fusing(odczyt , "##.##") 'formatowanie do postaci 00.00
    
    End Sub


    Pozdrawiam
    Rav

    Dodano po 2 [godziny] 12 [minuty]:

    Już sobie poradziłem :) wklejam prawidłowy (moim zdaniem) kod:

    
    'Program  obsługi jednego układu DS18B20 dołączonego
    'do magistrali 1-Wire przerobiony przez rav1989
    
    
    $regfile = "m8def.dat"
    
    'informuje kompilator o częstotliwości oscylatora taktującego mikrokontroler
    $crystal = 8000000
    
    'konfiguracja typu wyświetlacza LCD
    Config Lcd = 16 * 1a
    
    'brak kursora
    Cursor Off
    
    'konfiguracja linii mikrokontrolera do których dołączono wyświetlacz LCD
    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
    
    'konfiguracja linii magistrali 1-Wire
    Config 1wire = Portb.0
    
    'procedura odczytu temperatury z układu DS1820
    Declare Sub Odcz_temp
    
    'definicje
    Dim Lsb As Byte
    Dim Msb As Byte
    Dim Tempstr As String * 5
    Dim Temp As Single
    Dim Tempa As Integer
    Dim Minus As Bit
    
    Dim Bukl As Bit
    
    'definicja znaku stopnia
    Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32
    
    Do
     Call Odcz_temp                                             'wywołanie procedury pomiaru temperatury
     Cls
    
        If Bukl = 0 Then
    
           If Minus = 0 Then
               'wyświetla temperatury dodatnie
               Lcd "Temp: " ; Tempstr ; Chr(0) ; "C"
           Else
               'wyświetla temperatury ujemne
               Lcd "Temp: -" ; Tempstr ; Chr(0) ; "C"
           End If
    
       Else
           Lcd "Brak ukladu"
       End If
    
    Loop                                                        'koniec pętli Do...Loop
    End                                                         'koniec programu
    
    Sub Odcz_temp                                               'definicja procedury pomiaru temperatury
       1wreset                                                  'reset magistrali 1-Wire
       1wwrite &HCC                                             'opuszczenie zapisu numeru ID
       1wwrite &H44                                             'start pomiaru temperatury
       Waitms 750                                               'opóźnienie na czas pomiaru
       1wreset                                                  'reset magistrali 1-Wire
       1wwrite &HCC                                             'opuszczenie zapisu numeru ID
       1wwrite &HBE                                             'komenda odczytu zmierzonej
    
       Lsb = 1wread():
       Msb = 1wread():
    
       1wreset
    
       Reset Bukl
       Reset Minus
    
          If Err = 0 Then
             Tempa = Msb * 256
             Tempa = Tempa + Lsb
    
             If Msb.7 = 0 Then
                Temp = Tempa / 16
             Else
                Set Minus
                Tempa = Not Tempa
                Tempa = Tempa + 1
                Temp = Tempa / 16
             End If
    
             Tempstr = Fusing(temp , "###.##")                  'formatowanie do postaci 000.00
          Else
             Set Bukl
          End If
    End Sub
    
REKLAMA