Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

2 x DS18B20 i atmega.

Prodig 24 Paź 2006 21:14 6049 16
  • #1 24 Paź 2006 21:14
    Prodig
    Poziom 20  

    Witam!

    Podłączyłem 2 czujniki temperatury DS18B20 do atmega8 i nawet umiem z nich odczytać temperatury. Problem jednak w tym, że nie wiem co zrobić, żeby było wiadomo który czujnik jest który. Dla przykładu, czujniki dołączone są do linii 1wire, jeden jest za oknem a drugi w pokoju. Na LCD wyświetlam jednocześnie dwie temperatury. Jak zrobić, żeby było wiadomo, że np. lewy pomiar na wyświetlaczu wskazuje zawsze pomiar zza okna a nie z mieszkania?

    Pozdrawiam.

    0 16
  • #2 24 Paź 2006 22:05
    zumek
    Poziom 39  

    Są przynajmniej 3 mozliwości.
    1)Podłączyć na różnych pinach.
    2)Pojedynczo odczytać ID i odpowiednio przyporządkować.
    3)Ruszyć głową i napisać program konfiguracyjny.

    Piotrek

    0
  • #3 24 Paź 2006 23:37
    vedy1
    Poziom 15  

    Tak jak już napisał spec od mikrokontrolerów:
    1 linia - zapisujesz w pamięci eeprom lub flash po kolei ID każdego DS18xx i potem robisz Match Rom i dalej komendy.
    2 linie- nie ma problemu robisz Skip Rom i dalsze komendy, każdego masz na osobnej linii więc wiesz z którego zczytujesz informacje a wysyłasz do obydwu i np robisz staly czas kowersji temperatury..

    0
  • #4 25 Paź 2006 09:00
    Prodig
    Poziom 20  

    Wszystko jasne, jednak gdy ma być to urządzenie, do którego mają być podłączane czujniki za pomocą wtyczek przez kogoś innego, mają to być wymienne czujniki i w dodatku ma być kilka takich urządzeń to chyba mija się z celem zapisywanie ID w pamięci.

    Zrobiłem wersję z podpinaniem dallasów do różnych pinów - no i działa, jednak martwi mnie to, że muszę dla każdego z nich osobne kable wyprowadzać.

    0
  • #5 25 Paź 2006 13:55
    Electix
    Poziom 20  

    Siemka!

    To jest dobry temat, właśnie też skonstruowałem urządzenie z kostkami 1-Wire i mam podobny problem do rozwiązania. Tylko oprócz czujników temperatury mam klucze adresowane DS2405. I chcę tak jak kolega rozdzielić trzy czujniki temperatury, jeden zewnętrzny i dwa wewnętrzne i do każdego wewnętrznego przydzielić po jednym kluczu DS2405.

    Na pewno trzeba zapamiętać adresy kostek np w EEPROM, które przy każdym resecie będą weryfikowane w celu aktualizacji w razie zmian. Jeżeli chodzi o kwestję poszczególnych kostek przydzielonych do konkretnych funkcji to myślałem że przy każdym resecie i wykryciu zmian w podpiętych urządzeniach wykonawczych włączy się podprogram konfigurujący który pozwoli użytkownikowi na przydzielenie poszczególnych czujników czy kluczy do poszczególnych zadań.

    Jedyną niedogodnością w tym rozwiązaniu będzie potrzeba podpinania każdego z układów pojedyńczo w celu odczytania jego adresu i przydzielenia mu funkcji.

    Jeżeli ktoś ma jakieś fajniejsze rozwiązanie to bardzo chętnie posłucham :)

    Pozdrawiam!! :)

    0
  • #6 25 Paź 2006 15:07
    ipj
    Poziom 11  

    Przedstawiam działający kod na atmega32. Można go adaptować na większą liczbę czujników. Mam dwa podłączone i działa bez problemu. Kod nie jest zoptymalizowany.

    'Odczytanie Id czujników
    Sub Termometr_id
    Ilosc_czujnikow = 1wirecount()
    Cls
    Lcd " test term "
    Lowerline
    Lcd " wcisnij prg"
    Wait 1
    Upperline
    Prg = Prgp
    If Prg = 0 Then
    1wreset
    Ilosc_czujnikow = 1wirecount()
    Cls
    Lcd " " ; "znaleziono: " ; Ilosc_czujnikow; 'Sprawdza liczbę czujników
    Wait 3
    Adres_zap_eeprom = 480 '1 komórka zapisu ID 1 baytu 1 czujnika
    Czujnik1(1) = 1wsearchfirst()
    For I = 1 To 8 'odczyt id 1 czujnika i zapisanie do pamięci
    Dane_zap_eeprom = Czujnik1(i)
    Zapis_eeprom
    Adres_zap_eeprom = Adres_zap_eeprom + 1
    Next
    Do 'Sprawdzanie czy jest drugi czujnik
    Czujnik1(1) = 1wsearchnext()
    If Err = 0 Then
    Adres_zap_eeprom = 496 'odczyt id 2 czujnika i zapisanie do pamięci
    For I = 1 To 8
    Dane_zap_eeprom = Czujnik1(i)
    Zapis_eeprom
    Adres_zap_eeprom = Adres_zap_eeprom + 1
    Next
    End If
    Loop Until Err = 1
    End If
    End Sub

    '---------------------------Odczyt temperatury
    Sub Termometr
    1wreset
    1wverify Czujnik(1)
    If Err = 1 Then
    Cls
    Lcd "brak czujn nr:" ; Numer_czujnika
    Wait 1
    Cls
    Lcd Czujnik(1) ; ":" ; Czujnik(2) ; ":" ; Czujnik(3) ; ":" ; Czujnik(4) '
    Lowerline
    Lcd Czujnik(5) ; ":" ; Czujnik(6) ; ":" ; Czujnik(7) ; ":" ; Czujnik(8)
    Upperline
    Wait 3
    Termometr_id 'test czujników temperatury
    End If
    1wreset
    1wwrite &HCC
    1wwrite &H44 'start poiaru temperatury
    1wreset
    1wwrite &H55 'Będzie odpowiadało tylko urządzenie , którego numer zaraz podam !
    1wwrite Czujnik(1) , 8 'Podaję Numer Urządzenia , Które Zapytam , A Reszta Milczy Aż Pojawi Się Reset.
    1wwrite &HBE 'Poproszę zawartość scratchpad'a
    Bd(1) = 1wread(9)
    1wreset
    Tmp1 = Bd(1) And 1
    If Tmp1 = 1 Then
    Decr Bd(1)
    End If
    T = Makeint(bd(1) , Bd(2))
    T = T * 50
    T = T - 25
    T1 = Bd(8) - Bd(7)
    T1 = T1 * 100
    T1 = T1 / Bd(8)
    T = T + T1
    T = T / 10
    T2 = T / 10
    T3 = T2 * 10 '
    T3 = T - T3
    End Sub
    ''''''''''''''''''''''termometr1
    Sub Termometr1
    Adres_odcz_eeprom = 480
    For I = 1 To 8 'Odczytujemy ID 1 czujnika z pamięci eeprom
    Readeeprom Czujnik_temp , Adres_odcz_eeprom
    Czujnik(i) = Czujnik_temp
    Adres_odcz_eeprom = Adres_odcz_eeprom + 1
    Next
    Numer_czujnika = 1
    Termometr
    T12 = T2
    T13 = T3
    End Sub
    ''''''''''''''''''''''termometr2
    Sub Termometr2
    Adres_odcz_eeprom = 496
    For I = 1 To 8 'Odczytujemy ID 2 czujnika z pamięci eeprom
    Readeeprom Dane_odcz_eeprom , Adres_odcz_eeprom 'Odczyt_eeprom
    Czujnik(i) = Dane_odcz_eeprom
    Adres_odcz_eeprom = Adres_odcz_eeprom + 1
    Next
    Numer_czujnika = 2
    Termometr
    T22 = T2
    T23 = T3
    End Sub

    0
  • #7 26 Paź 2006 09:17
    Prodig
    Poziom 20  

    Stwierdziłem, że najbardziej uniwersalnym sposobem będzie przyłączenie każdego czujnika do osobnego pinu w porcie. Następnie program będzie przełączać linię 1wire pomiędzy te piny i odczytywać kolejno z czujników dane.

    Oto kod (część fragmentów kodu pochodzi z innych postów na elektroda.pl):

    Code:

    Dim Dsid1(8) As Byte
    Dim Dsid2(8) As Byte

    Dim T1 As Single
    Dim T2 As Single
    Dim B1 As Byte , B2 As Byte , B3 As Byte , B4 As Byte , R As Byte
    Dim Tmp1 As String * 6
    Dim Tmp2 As String * 6
    Dim Znak1 As String * 1
    Dim Znak2 As String * 1
    R = &HFF

    Declare Sub 1wr

    Do
      Config 1wire = Pinb.1
       1wreset
       1wwrite &HCC
       1wwrite &H44
       1wreset
       1wwrite &HCC
       1wwrite &HBE
       B1 = 1wread()
       B2 = 1wread()

       If B1 >= 248 Then
          B1 = R - B1
          B2 = R - B2
          Znak1 = "-"
       Else
          Znak1 = "+"
       End If
       T1 = B1 / 16
       T2 = B2 * 16
       T1 = T1 + T2

       Tmp1 = Fusing(t1 , "###.&")

      Config 1wire = Pinb.2
       1wreset
       1wwrite &HCC
       1wwrite &H44
       1wreset
       1wwrite &HCC
       1wwrite &HBE
       B3 = 1wread()
       B4 = 1wread()

       If B3 >= 248 Then
          B3 = R - B3
          B4 = R - B4
          Znak2 = "-"
       Else
          Znak2 = "+"
       End If
       T1 = B3 / 16
       T2 = B4 * 16
       T1 = T1 + T2

       Tmp2 = Fusing(t1 , "###.&")

    Cls
    Lcd Znak1 ; Tmp1 ; "C " ; Znak2 ; Tmp2 ; "C"

    Loop

    0
  • #8 26 Paź 2006 14:51
    zumek
    Poziom 39  

    Prodig napisał:
    Stwierdziłem, że najbardziej uniwersalnym sposobem będzie przyłączenie każdego czujnika do osobnego pinu w porcie.

    I bardzo dobrze :D
    Prodig napisał:

    Następnie program będzie przełączać linię 1wire pomiędzy te piny i odczytywać kolejno z czujników dane.

    No no , nie czytało się manuala od Bascoma.
    Tak jak napisałeś powyżej , to nie zadziała , bo Config 1wire jest NOT REUSABLE :( . Zajrzyj do manuala i sprawdź , jak użyć kilku magistral 1wire.
    Podpowiedź: 1wreset PORT,PIN

    Piotrek

    0
  • #9 26 Paź 2006 15:15
    Prodig
    Poziom 20  

    zumek napisał:

    Tak jak napisałeś powyżej , to nie zadziała , bo Config 1wire jest NOT REUSABLE :( . Zajrzyj do manuala i sprawdź , jak użyć kilku magistral 1wire.
    Podpowiedź: 1wreset PORT,PIN
    Piotrek


    Ale tak zrobiłem i działa idealnie :D
    Może masz starszego BASCOMA AVR. Ten mój jest 1.11.8.2.

    Pozdrawiam.

    0
  • #10 26 Paź 2006 16:28
    mgradzki
    Poziom 16  

    Ma może ktoś działającą obsługę tych czujników w c ??
    Nie chce mi się wnikać w Bascoma, a gdzie nie spojrzę to jest w Bascomie :(
    I gdzie taki czujnik w Warszawie nabyć ??

    Pozdrawiam

    0
  • #11 26 Paź 2006 16:58
    Electix
    Poziom 20  

    Siemka!

    Wszystko super, tylko przełączać czujniki pomiędzy pinami można jak się ma tych pinów w nadmiarze... :P Ja mam tylko jeden do dyspozycji 1-Wire i koniec. Obsługa (w BASCOM AVR) 2 czujników DS18B20 i 2 kluczy DS2405 zajęła mi ponad 80% pamięci programu ATmega8 a muszę obsłużyć jeszcze RTS poprzez I²C, klawiaturę i dołożyć kilka innych funkcji na co już nie ma miejsca, zatem w/w rozwiązania są dobre, ale nie zawsze wystarczające. Spróbuję wygenerować jakiś kod w ASM i jednak rozwikłać problem obsługi wielu układów 1-Wire na jednej linii mikrokontrolera.

    Pozdrawiam !!

    0
  • #12 26 Paź 2006 20:07
    Prodig
    Poziom 20  

    mgradzki napisał:

    I gdzie taki czujnik w Warszawie nabyć ??


    Czujniki bez problemu dostaniesz w Katowicach. polecam ten sklep: http://www.nikomp.pl
    Można zamówić z tego sklepu przez internet. Są one tam bardzo tanie.

    0
  • #13 26 Paź 2006 20:42
    robgold
    Poziom 14  

    Nikomp, Seguro, Tme, Allegro (tutaj chyba najtaniej) ;)

    0
  • #14 26 Paź 2006 20:45
    zumek
    Poziom 39  

    Prodig napisał:
    ...Ale tak zrobiłem i działa idealnie :D
    Może masz starszego BASCOMA AVR. Ten mój jest 1.11.8.2.
    Pozdrawiam.

    Kurczaki pieczone :!: - masz rację :!:
    I daj tu człowieku wiarę dokumentacji , w której stoi jak byk , że 1wire nie jest rekonfigurowalne , a tu masz :D

    Piotrek

    0
  • #15 26 Paź 2006 20:53
    robgold
    Poziom 14  

    hm ..tylko jaki sens ma rekonfigurowac magistrale jak mozna jzu w poleceniach wpisac ktory pin do czego :)

    0
  • #16 26 Paź 2006 21:31
    zumek
    Poziom 39  

    robgold napisał:
    hm ..tylko jaki sens ma rekonfigurowac magistrale jak mozna jzu w poleceniach wpisac ktory pin do czego :)

    W zasadzie żaden , ale ciekawostką może być to , że kod wygenerowany dla ...
    Code:

    Config 1wire = Pinb.1
    1wreset
    B1 = 1wread(1)

    ... jest identyczny jak dla poniższego kodu
    Code:

    1wreset Pinb,1
    B1=1wread(1,Pinb,1)

    Czemu dokumentacja o tym nie wspomina - doprawdy nie rozumiem :(

    Piotrek

    0
  • #17 26 Paź 2006 21:37
    robgold
    Poziom 14  

    Byc moze na wczesnym etapie Bascoma byly jakies roznice albo w bascom 8051 sa. Przyanm sie ze w swoim prjekcie tez uzylem 1wread(1,pin) bo wedulg helpa config jest nierekonfigurowalny "w locie" :)

    0