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

Odczyt ID z ds18b20 - bascom

zbynio-87 05 Lis 2010 21:19 3612 3
REKLAMA
  • #1 8707186
    zbynio-87
    Poziom 11  
    Witam serdecznie.
    Mam taki problem, otóż:
    Zaprojektowałem sterownik do pieca c.o. i kolektorów. Do pomiaru temperatury zastosowałem 3 x DS18B20 na magistrali 1Wire. Program napisany w języku BASCOM. Jeżeli jest taki przypadek, że nastąpi przerwa w torze transmisji jednego z czujników np.DS1 (nóżka Data) to mikroprocesor nadpisuje wartość temperatury z innego czujnika, np.DS2. Szukałem już wszędzie, lecz nigdzie nie znalazłem odpowiedzi jak rozwiązać ten problem. Proszę o jakieś wskazówki, najlepiej praktyczne rozwiązania.
    
    ...
    Cls
    'ilość podpiętych czujnikow temperatury
    W = 1wirecount()
    Lcd "Ilosc czujnikow temp"
    Locate 2 , 9
    Lcd "-" ; W ; "-"
    Wait 2
    Cls
    
    'odczyt ID czujników temperatury
    Dsic1(1) = 1wsearchfirst()
    If Dsic1(8) = Crc8(dsic1(1) , 7) Then
     Locate 1 , 1
     Lcd "CRC OK Czujnik 1 ID"
     Id_ds1 = Dsic1(8)
     E_id_ds1 = Id_ds1
     Wait 1
     Locate 1 , 1
     For A = 1 To 8
     Lcd Hex(dsic1(a))
     Next
    End If
    Wait 1
    
    Dsic2(1) = 1wsearchnext()
    If Dsic2(8) = Crc8(dsic2(1) , 7) Then
     Locate 2 , 1
     Lcd "CRC OK Czujnik 2 ID"
     Id_ds2 = Dsic2(8)
     E_id_ds2 = Id_ds2
     Wait 1
     Locate 2 , 1
     For B = 1 To 8
     Lcd Hex(dsic2(b))
     Next
    End If
    Wait 1
    
    Dsic3(1) = 1wsearchnext()
    If Dsic3(8) = Crc8(dsic3(1) , 7) Then
     Locate 1 , 1
     Lcd "CRC OK Czujnik 3 ID"
     Id_ds3 = Dsic3(8)
     e_id_ds3 = Id_ds3
     Wait 1
     Locate 1 , 1
     For C = 1 To 8
     Lcd Hex(dsic3(c))
     Next
    End If
    Wait 1
    
    1wreset
    1wwrite &HCC
    1wwrite &H44
    
    ...
    
    1wreset
       1wwrite &H55
       1wverify Dsic1(1)
       1wwrite &HBE
       Tp = 1wread(2)
       Tp = Tp * 10
       Tp = Tp / 16
       S1 = Str(tp)
       S1 = Format(s1 , " 0.0")
       Locate 1 , 1
       Lcd "Piec " ; S1 ; Chr(0) ;
    
       1wreset
       1wwrite &H55
       1wverify Dsic2(1)
       1wwrite &HBE
       Tb = 1wread(2)
       Tb = Tb * 10
       Tb = Tb / 16
       S2 = Str(tb)
       S2 = Format(s2 , " 0.0")
       Locate 1 , 11
       Lcd Chr(1) ; "Boj " ; S2 ; Chr(0) ;
    
       1wreset
       1wwrite &H55
       1wverify Dsic3(1)
       1wwrite &HBE
       Tk = 1wread(2)
       Tk = Tk * 10
       Tk = Tk / 16
       S3 = Str(tk)
       S3 = Format(s3 , " 0.0")
       Locate 2 , 11
       Lcd Chr(1) ; "Kol " ; S3 ; Chr(0) ;
      
    'konwersja temp dla wszystkich dsow
       1wreset
       1wwrite &HCC
       1wwrite &H44
    
  • REKLAMA
  • #2 8707633
    hotdog
    Poziom 26  
    Nie znam bascoma, ale po tym co piszesz problem masz natury błędnego podejścia.

    Jak zabierzesz jeden czujnik to oczywiste jest, że urządzenie przy 1wire search zwróci czujniki w innej kolej kolejności. Np jak zabrałeś czujnik zwracany jako pierwszy (z "najmniejszym" numer seryjnym) to drugi czujnik stanie się pierwszym.

    Masz 2 wyjścia:
    - zapmiętać numery seryjne czujników w eepromie i w procedurach odczytu dla pierwszego czujnika odczytać temperaturę nie z pierwszego znalezionego czujnika, tylko z czujnika o konkretnym numerze seryjnym. Tu wada, że po uszkodzeniu jakiegoś czujnika będziesz musiał je na nowo zaprogramować.
    - podłączyć każdy czujnik do innego pinu procka. Nie wiem czy bascom na takie coś pozwala, ale ja w C często stosuje takie podejście. Wtedy wiesz że zawsze czujnik podłączony do portu pierwszego jest np od solara. Wady: konieczny kabel od urządzenia do każdego czujnika, oraz więcej pinów uC wykorzystujesz.
  • REKLAMA
  • #3 8709906
    xury
    Specjalista automatyka domowa
    Z zapamiętaniem numeru w eeprom to dobry sposób. Jeśli do damy do tego procedurę porównania numeru z eeprom z odczytanym z czujnika to nie trzeba będzie nic robić, kiedy zmienimy czujnik.
    Oczywiście po zmianie czujnika może się zmienić kolejność więc i to trzeba przewidzieć w programie i np. zamieniać miejscami dane w zmiennych z numerami.
  • #4 8714238
    zbynio-87
    Poziom 11  
    ...rozwiązałem problem w taki sposób. W menu dopisałem pozycję:

    "Konfiguracja czujników temperatury": "1)Konfiguracja DS1-temp. piec"; "2)Konfiguracja DS2-temp. bojler"; "3)konfiguracja DS3-temp.kolektor".

    Jeżeli podłączę jeden czujnik to mogę przypisać jego numer do np. pomiaru temperatury pieca, zapisuję go w Eepromie Avr'a i wychodzę do podmenu, następnie podłączam inny czujnik i przypisuję jego adres do pomiaru np. temperatury pieca, itd,itp. Ten sposób jest o tyle dobry, że w czasie serwisowania, bądź uszkodzonego DS'a można w bardzo prosty sposób przypisać nowy czujnik do pomiaru temperatury jakiegoś konkretnego elementu:)
REKLAMA