Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[Bascom] Pomiar DS18B20 - wyświetla zero

yogi009 30 Dec 2011 15:14 2676 0
  • #1
    yogi009
    Level 43  
    Witam Kolegów, zaczynam naukę programowania w środowisku Bascom, na warsztacie mam Attiny2313 i DS18B20, chciałem sprawdzić jak działa odczyt temperatury (wyświetlanie na LCD opanowałem wczoraj, pin'ologia LCD niezmieniona). DS18B20 podłączyłem następująco: 1 - Gnd, 2 - do pin'u wejściowego oraz przez R=4.7k do +5V, 3 - +5V. Całość jest zasilana przez programator USB ISP z portu USB komputera (stacjonarnego, napięcie zmierzone na Vcc to ok. 4.8V). Oto kod (lekko skróciłem jakiś przykład z tego forum, do jednego czujnika, bo cały soft nie mieścił się w tym procku), zmienione są pin'y podpięte do LCD (Attiny2313 nie ma portu C):

    $regfile = "attiny2313.dat"
    $Crystal=8000000
    
    ' DS18B20 został wpięty z podlaczeniem Vdd do +5V, DQ do wejścia PortB.0 
    ' (DQ podciagniete przez R=4.7k do +5V), GND do masy
    
    'Deklaracja portów od wyświetlacza LCD (działa z innymi programami szkoleniowymi)
    Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , Db7 = Portd.5 , E = Portd.1 , Rs = Portd.0
    Config Lcd = 16 * 2
    Cursor Off
    
    '**** Termometr ****
    Config 1wire = Portb.0
    Dim I1 As Integer , Ss As String * 6
    'Dim I2 As Integer
    Dim Dsid1(8) As Byte
    'Dim Dsid2(8) As Byte                                        'deklaracja zmiennej do odczytu kodów ID
    Dim W As Byte
    Dim B As Byte                                               'deklaracja zmiennej do odczytu ilośc czujników
    W = 1wirecount()
    Cls
    Locate 1 , 1
    Lcd W
    Wait 1
    Cls
    Dsid1(1) = 1wsearchfirst()                                  'Znajdź kolejny czujnik podpięty do portu
    'Dsid2(1) = 1wsearchnext()                                   'Znajdź kolejny czujnik podpięty do portu
    
    '*******************Odczyt numerów ID czujników temperatury*********************
    
    If Dsid1(8) = Crc8(dsid1(1) , 7) Then
     Cls
     Lcd "  Czujnik 1 OK  "
     Waitms 100
    End If
    
    Cls
    
    Deflcdchar 0 , 8 , 20 , 11 , 4 , 4 , 4 , 3 , 32             'znak stopnia Celsjusza
    
    Do
    
       1wreset
       1wwrite &H55
       1wverify Dsid1(1)                                        'wysyłamy adres pierwszego czujnika
       1wwrite &HBE
       I1 = 1wread(2)
    '--------konwersja temp dla wszystkich dsow
       1wreset
       1wwrite &HCC
       1wwrite &H44
    
       Waitms 750
    
       I1 = I1 * 10
       I1 = I1 / 16
       Ss = Str(i1)
       Ss = Format(ss , " 0.0")                                 'Pozycja wyświetlania nazwy i temperatury (1.1 -> 1 linia 1 kolumna, 2.10 -> 2 linia 10 kolumna itd)
       Locate 2 , 1
       Lcd "Temp: " ; Ss ; Chr(0)
    
    Loop


    Tu są ustawienia fuse-biótw (hex wrzucam przez AVR STudio, z Bascom'a jeszcze nie potrafię, coś w ustawieniach programatora nie gra).

    [Bascom] Pomiar DS18B20 - wyświetla zero

    Efekt jest taki, najpierw wyświetla zero w pierwszym znaku górnej linii LCD, potem przez chwilę "Czujnik 1 OK", a potem "Temp: 0.0°C". Próbowałem podpinać Vcc czujnika do GND, wtedy nie działa wcale. Jeśli nie ma czujnika, mam komunikat "Brak czujnika". Używałem dwóch czujników (ale od jednego dostawcy). Układ jest zmontowany na płytce stykowej, działa ISP, działa LCD, mam tylko kłopot z tym DS18B20.

    Docelowo chciałem zrobić jednoczujnikowy termostat ustawiany w zakresie 30-95°C, a już optymalnie użyłbym okrojonego kodu z Attiny13 do termostatu pilnującego zadanej na stałe w kodzie wartości temperatury (bez guzików, LCD, itd., tylko dwie diody: grzanie i gotowość, no i wyjście na optotriak i triak oczywiście).

    Gdyby ktoś z Kolegów zechciał mi w starym roku nieco rozjaśnić moją jakże skromną wiedzę, będę zobowiązany :-)

    Pozdrawiam i życzę udanego Sylwestra i Szczęśliwego Nowego Roku !

    ====== Edit ======

    Szukam dalej i z takim kodem wyświetla mi cały czas temperaturę 25.5 stopnia Celsjusza.

    $regfile = "attiny2313.dat"
    $crystal = 4000000
    
    ' DS18B20 został wpięty z podlaczeniem Vdd do +5V, DQ do wejścia PortB.0 (DQ podciagniete przez R=4.7k do +5V)
    
    'Deklaracja portów od wyświetlacza LCD
    Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , Db7 = Portd.5 , E = Portd.1 , Rs = Portd.0
    Config Lcd = 16 * 2
    
    '**** Termometr **** NIE DZIAŁA, wyświetla cały czas 25.5 C
    
    Config Portb = Output
    Config Portd = Output
    
    Portb = 127
    
    Dim Odczyt(2) As Byte
    Dim T As Integer
    Dim Liczba As Byte
    Dim L As String * 6
    
    Portb.0 = 1
    Portb.1 = 0
    
    Deflcdchar 0 , 8 , 20 , 11 , 4 , 4 , 4 , 3 , 32             'znak stopnia Celsjusza
    
    Config 1wire = Portb.0
    
    '*******************Odczyt numerów ID czujników temperatury*********************
    Liczba = 0
    
    Cursor Off
    Cls
    Lcd "Czujnik v.07"
    
    Do
       1wreset : 1wwrite &HCC : 1wwrite &HBE                    'polecenie odczytu DS18x20
       Odczyt(1) = 1wread(2)                                    'odczytaj dwa pierwsze bajty - temperaturę
       T = Odczyt(2)                                            '          starszy bajt temperatury
       Shift T , Left , 8                                       'przesuń w lewo o 8 miejsc
       T = T + Odczyt(1)                                        'w zmiennej Integer jest dziwna "ułamkowa" wartość
       Shift T , Right , 4                                      'zamiast dzielić przez 16 przesuń w prawo
    
       1wreset                                                  '   dopiero teraz daj polecenie konwersji:
       1wwrite &HCC                                             'polecenie SKIP ROM, bo pojedyncza kostka
       1wwrite &H44                                             '   dokonaj konwersji - zmierz temperaturę
                                                                'po cyklu pracy poczekaj
       Liczba = T
    
       L = Str(liczba)
       L = Format(l , " 0.0")
    
       Locate 2 , 1
       Lcd "Temp: " ; L ; Chr(0)
    
    Loop


    A następny kod (chyba błędny jest odczyt, bo DS18B20 powinien mieć odczyt w dwóch bajtach) daje niezmieniający się wynik -0.1 stopnia:

    $regfile = "attiny2313.dat"
    $crystal = 8000000
    
    ' Wyswietla "Temp:-0.1 C" - NIE DZIAŁA
    
    Config Lcdbus = 4
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Pd.2 , Db5 = Pd.3 , Db6 = Pd.4 , Db7 = Pd.5 , E = Pd.1 , Rs = Pd.0
    
    
    Config 1wire = Portb.0                                      ' termometr ds18b20
    Dim I As Integer                                            'zmienne do odczytu temp.
    Dim S As Single
    Dim T As String * 4
    
    
    'Bardzo ladny znak stopnia - to skopiowac do swoich projektow
    
    Deflcdchar 0 , 6 , 9 , 6 , 32 , 32 , 32 , 32 , 32           ' znak stopnia
    
    Cursor Off
    Cls
    
                                                       'pomiar temp. na termometrze ds18b20
    Do
    
       1wreset
       1wwrite &HCC
       1wwrite &H44
       Waitms 750
    
       1wreset
       1wwrite &HCC
       1wwrite &HBE
    
       I = 1wread(2)
       S = I / 16
       T = Fusing(s , "##.#")
    
       Locate 1 , 1
       Lcd "Temp:" ; T ; Chr(0) ; "C"
    
    Loop


    Wyświetlacz pokazuje też "-0.0625oC" po zapodaniu takiego kodu:
    
    $regfile = "attiny2313.dat"
    $crystal = 8000000
    
    ' Wyswietla "Temp:-0.0625oC" - NIE DZIAŁA
    
    'Config Lcdbus = 4
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Pd.2 , Db5 = Pd.3 , Db6 = Pd.4 , Db7 = Pd.5 , E = Pd.1 , Rs = Pd.0
    
    Config 1wire = Portb.0                                      ' + jumper J2 B-C
    
    Dim Odczyt(2) As Byte , A As Byte , Licznik As Byte , T As Integer , T1 As Single
    
    Do
      1wreset                                                   'reset
      1wwrite &HCC                                              'jedna kostka, więc wykorzystujemy rozkaz SKIP ROM
      1wwrite &H44                                              'dokonaj konwersji
      Waitms 750                                                'przeczekaj czas konwersji
      1wreset                                                   'reset
      1wwrite &HCC                                              'rozkaz adresowy SKIP ROM
      1wwrite &HBE                                              'rozkaz funkcyjny - polecenie odczytu DS18x20
      Odczyt(1) = 1wread(2)                                     'odczytaj dwa pierwsze bajty
      T = Odczyt(2)                                             'przepisz starszy bajt do zmiennej typu Integer
      Shift T , Left , 8                                        'przesuń ten bajt w lewo na wyższe pozycje
      T = T + Odczyt(1)                                         'przepisz - dodaj młodszy bajt
    'teraz w zmiennej T typu Integer jest dziwna "ułamkowa" wartość temperatury
      T1 = T / 16                                               'wyraź w stopniach Celsjusza, wynik wpisz do zmiennej Single
    '  T1 = T / 2      'dla układów DS18S20 i DS1820
      Cls : Lcd "Temp=" ; T1 ; "oC"                             'wyświetl wynik ze z  zmiennej Single
    Loop : End