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

ATMEGA 2560 BASCOM 64 czujniki DS18B20

ewsd75 17 Gru 2009 07:37 3077 7
REKLAMA
  • #1 7399889
    ewsd75
    Poziom 13  
    Witam
    Chciałem zbudować termometr z 64 czujnikami DS18B20, na układzie Atmega 2560. Konfiguruje sobie każde wyprowadzenie portu po kolei jako 1-wire. Do 44 czujnika temperatury są odczytywane, jeśli wprowadzę 45 czujnik w programie to po przejściu pętli do czujnika T1 otrzymuję wartość 0 stopni na każdym z czujników, jeśli mam 44 czujniki to wszystko działa.

    Podłączyłem czujniki też od 45 do 64 z pominięciem czujników od 1 do 44 ( zablokowana część programu ). W takiej sytuacji czujniki są również odczytywane. Czyli połączenie z czujnikami jest i są one odczytywane. Czy może ktoś podłączał tak dużą liczbę czujników do Atmegi.
    Poniżej fragment kodu programu.

    Kod:
     
    $regfile = "m2560def.dat"
    $crystal = 2000000
    $baud1 = 9600
    Open "Com2:" For Binary As #1
    Dim Temp(2) As Byte
    Dim Tempp1 As Byte
    Dim Tempp2 As Byte
    Dim Lsb_tempp1 As Byte
    Dim Xx As Byte
    Dim Msb_zk As String * 1
    declare sub Odczyt_temp
    Xx = 1
    Do
    
    Call Odczyt_temp
    Wait 1
    
    Loop
    End
    
    Sub Odczyt_temp
    
    If Xx = 1 Then 
    Config 1wire = Porta.7
    end if 
    1wreset
      1wwrite &HCC
      1wwrite &H44
      Wait 1
      1wreset
      1wwrite &HCC
      1wwrite &HBE
    
      Temp(1) = 1wread()
      Temp(2) = 1wread()
      1wreset
      If Temp(2) >= 248 Then
         Temp(1) = Temp(1) - 255
         Temp(2) = Temp(2) - 255
         Msb_zk = "-"
      Else
         Msb_zk = "+"
      End If
      Tempp1 = Temp(1) / 16
      Tempp2 = Temp(2) * 16
      Lsb_tempp1 = Tempp1 + Tempp2
      Print #1 , "<T" ; Xx ;  "; " ; Lsb_tempp1 ; ">"
    Incr Xx
    If Xx = 2 Then 
    Config 1wire = Porta.6
    end if 
    1wreset
      1wwrite &HCC
      1wwrite &H44
      Wait 1
      1wreset
      1wwrite &HCC
      1wwrite &HBE
    
      Temp(1) = 1wread()
      Temp(2) = 1wread()
      1wreset
      If Temp(2) >= 248 Then
         Temp(1) = Temp(1) - 255
         Temp(2) = Temp(2) - 255
         Msb_zk = "-"
      Else
         Msb_zk = "+"
      End If
      Tempp1 = Temp(1) / 16
      Tempp2 = Temp(2) * 16
      Lsb_tempp1 = Tempp1 + Tempp2
      Print #1 , "<T" ; Xx ;  "; " ; Lsb_tempp1 ; ">"
    Incr Xx
    
    TU JEST POWIELONY KOD 64 RAZY
    
    If Xx=64 then
     Xx=1
    End if
    
    End sub
  • REKLAMA
  • #2 7400507
    Logan
    Poziom 30  
    Czemu kolega nie łączy czujników równolegle ?
  • REKLAMA
  • #3 7400519
    ewsd75
    Poziom 13  
    Chcę pominąć odczytywanie adresów na każdym z czujników. Wydaje mi się że tak będzie prościej obsługiwać ten termometr.
  • REKLAMA
  • #4 7401511
    11111olo
    Poziom 42  
    A nie prościej napisać ten program tak?

    
    Do
    Config 1wire = Porta.7
    Gosub Odczyt
    Config 1wire = Porta.6
    Gosub Odczyt
    
    ...
    
    xx=1
    Loop
    
    Odczyt:
    1wreset
    1wwrite &HCC
    1wwrite &H44
    Wait 1
    1wreset
    1wwrite &HCC
    1wwrite &HBE
    
    Temp(1) = 1wread()
    Temp(2) = 1wread()
    1wreset
    If Temp(2) >= 248 Then
    Temp(1) = Temp(1) - 255
    Temp(2) = Temp(2) - 255
    Msb_zk = "-"
    Else
    Msb_zk = "+"
    End If
    Tempp1 = Temp(1) / 16
    Tempp2 = Temp(2) * 16
    Lsb_tempp1 = Tempp1 + Tempp2
    Print #1 , "<T" ; Xx ; "; " ; Lsb_tempp1 ; ">"
    Incr Xx 
    Retun
  • #5 7401642
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #6 7474119
    Pawel1812
    Poziom 26  
    Z braku sukcesów w programowaniu funkcji search_rom 1Wire rozwiązałem problem następująco:

    1) użytkownik podłącza jeden czujnik pod 1Wire, program wykonuje funkcję read_rom, użytkownik ustala numer czujnika który aktualnie podłączył.
    2) program zapisuje tak odczytany ROM do pamięci EEPROM procesora
    3) z każdym czujnikiem użytkownik podstępuje dokładnie w ten sposób programując go
    4) użytkownik podłącza wszystkie czujniki

    Ponieważ moje urządzenie będzie w komplecie z czujnikami, tę funkcję trzeba wykonać tylko przy awarii czujnika, i tylko dla jednego, nowego czujnika.

    Oczywiście wszystkie czujniki są połączone równolegle do jednej linii. Ponieważ mój projekt ma 3 czujniki rozwiązanie myślę że jest bardzo dobre i proste z programistycznego punktu widzenia bazując na gotowym i działającym kodzie z elektrody
  • #7 7474403
    gothye
    Poziom 33  
    hmm ,mi wpadł inny pomysł a można by go zrobić na M8 czy M16 ,a mianowicie połączyć 4051 w kaskady dzieki czemu wystarczy kilka pinów uC do tylu czujników ,w tygodniu przetestuje pomysł....

    Ps .nic nie stoi na przeszkodzie aby dopisać linie programu (np. jeden pin uC ,sprawdzany przy starcie programu ) która będzie programowała ID czujników i zapisywała do EEPROM ;)
  • #8 7476345
    ewsd75
    Poziom 13  
    Witam Kolegów w Nowym Roku.
    Dziękuję za zainteresowanie tematem. Temat jest nadal aktualny ale rozwiązanie mojego problemu już nastąpiło, znalazłem go sam :D.
    Okazała się, że Bascom ma pewne ograniczenia i jest to wina Bascoma, że nie pozwala on na użycie tak wiele razy instrukcji odczytu czujnika na 1- Wire. Maksymalnie w Bascom można obsłużyć 44 czujniki DS18B20 podłączone do różnych wyprowadzeń.
    Dlatego ograniczyłem system do 44 czujników.
REKLAMA