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

Czujnik temperatury DS18B20 i AT90S2313, bład komunikacji

29 Cze 2006 08:29 3015 28
  • Poziom 10  
    Witam
    Pisze program na AT2313 obsługujący jeden czujnik temp DS18B20 /identyfiakcja oraz suma kontrolna nie są potrzebne/, a następnie wysyłający wynik pomiaru na RS.

    Problem tkwi w magistrali One Wire, nie mogę skomunikować się z czujnikiem. Robiłem już próby z rezystorem podciągającym 0d 3.3k do 4.7k. nie pomogło. Każda komenda/1wreset, 1wwrite/ wysłana do DS18B20 kończy się Err.
    Nie wiem co robię żle
    ------------------------------------------------------------------------------------
    TO JEST FRAGMENT KODU, całośc można podejrzeć w załączniku
    -----------------------------------------------------------------------------------
    Pomiar_temp:
    Do
    Call Odczyt 'wywołanie odzczytu temp
    If Temp(2) = 0 Then 'jesli temp jest dodatnia
    S = 1 'to bit s=1
    Print " + " ; Temp(1) ; " C" 'wyslanie na rs
    Else
    S = 0 'jesli temp ujemna
    Print "- " ; Temp(1) ; " C" 'bit s=0
    End If
    Waitms 250 'odczekanie 250 ms
    Loop
    End
    Return




    Sub Odczyt
    'procedura odczytu temperatury z czujnika
    1wreset 'reset linii DQ
    1wwrite &HCC 'rozpocznij konwersje tempeatury
    Waitms 750 'odczekaj 750 ms /czas na konwersje/
    1wwrite &HCC 'pomin ID
    1wwrite &HBE
    1wreset 'odczyt wynku konwersji

    Temp(1) = 1wread(2) 'zapis warosci do tablicy

    1wreset 'reset magistrali
    If Err = 1 Then ''jesli err=1 to brak ukladu
    Print " brak czujnika"
    Do
    Loop
    End If

    If Temp(2) > 0 Then 'jesli temperatura jest -
    Temp(1) = 256 - Temp(1) 'to odejmujemy wartośc od 256
    End If

    Temp(1) = Temp(1) / 2 'i dzielimy przez 2

    End Sub
  • Poziom 10  
    Może zle podłączyłem DS18B20?

    DQ do portuD.3
    GND do masy
    Vdd do +5V
    DQ podciągnięte rezystorem 4.7k do VDD
  • Pomocny post
    VIP Zasłużony dla elektroda
    Chyba zapomniałeś o wysłaniu polecenia konwersji ;)
    Code:

    1Wwrite &hcc
    1Wwrite &h44  <<<<-----
    WaitMs 250
    WaitMs 250
    WaitMs 250
    1Wreset
    1Wwrite &hcc
    1Wwrite &hbe
  • Poziom 10  
    Pomogło ale połowicznie. Pokazuje mi sie temperatura 0 stopni. Poprzednio było "brak czujnika"

    dzięki
    dalej bede walczył

    Dodano po 48 [sekundy]:

    Może mam uszkodzony czujnik temperatury ?
  • VIP Zasłużony dla elektroda
    A wyslij przez RS od razu wartość odczytaną z DS, np.
    Print temp(1)
    i sprawdż co wychodzi
  • Poziom 10  
    Jak wysle po RS'ie to wychodzi mi cały czas zero stopni

    Ręce człowiekowi opadają
    Naściągałem już kupe programików, każdy albo nie chodzi albo wynik jest 0 stopni.
    Spradziłem połączenia, i wypróbowałem wszystkie konfiguracje dalej to samo. Może coś z zasilaniem, podawane z przetwornicy DC/DC Lm2574N-adj. Układ jest zasilany 12V (ma pracować na akumulatorze samochodowym). Na wyjsciu przetwornicy mam 4.98V procek chodzi, komunikacja jest, LCD chodzi, a DS18B20 nie chce :)
  • Pomocny post
    Poziom 23  
    kod skopiowany z mojego programu. dziala bez problemu. 1wire podpiete jest pod portd.7

    Code:
    1wreset
    
      Bitwait Portd.7 , Set
      1wwrite &HCC
      1wwrite &H44
      Wait 1
      1wreset
      Bitwait Portd.7 , Set
      1wwrite &HCC
      1wwrite &HBE
      Tabl(1) = 1wread()
      Tabl(2) = 1wread()
      Tabl(3) = 1wread()
      Tabl(4) = 1wread()
      Tabl(5) = 1wread()
      Tabl(6) = 1wread()
      Tabl(7) = 1wread()
      Tabl(8) = 1wread()
      Crc = 1wread()
    Moderowany przez Light-I:

    Kod ujęto w tagi [code][/code].

  • Poziom 10  
    pomogło !!!
    ale wskazywana temperatura jest temperatura około 36 stopni i spada.
    Czy czujnik się stabilizuje?

    to i tak jest nieźle ponieważ zaraz po włączeniu było od 27 do 116.

    Czyżbym uszkodził czujnik przez moje zabawy ?
  • Pomocny post
    Poziom 25  
    WItam
    Najlepiej zrób tak:
    linie DQ podłącz do pinu procka i podciagnij ją rezystorkiem 4,7kohm do +5V a mase do masy. Nie podłączaj zasilania czujnika.

    Ja miałem takie problemy własnie gdy wykorzystałem techlogię 2wire taka jak ty. Gdy zmieniłem tak jak Ci napisałem wszytko było już ok.

    Pozdrawiam
    Shevu
  • Poziom 10  
    Witam
    podpiołem się jak pisałeś i
    DS mówi że mam temperaturę -0 stopni celsjusza

    Dodano po 5 [minuty]:

    jesli podlacze w trybe parasite to procek nie widzi czujnika

    Dodano po 5 [minuty]:

    Dziwne jest to, że jak podłączę go tylko do masy, DQ do pinu i do nóżki Vdd przez rezystor, ale nie podłącze zasilania to też widzi zero stopni :)
  • Poziom 25  
    oki wpakuj teraz mój programik :) jest on tez na 1 czujnik z dokladnoscią 0,5 stopni Ctermometr smiga bez problemu. Nie zapomnij pozmieniać portów ;)


    'konfiguracja programowa

    $crystal = 4000000

    Config 1wire = Pinc.1
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Porta.0 , Db5 = Porta.1 , Db6 = Porta.2 , Db7 = Porta.3 , E = Porta.5 , Rs = Porta.4

    Deflcdchar 0 , 238 , 234 , 238 , 224 , 224 , 224 , 224 , 224 'definicja symbolu "stopień"

    Cursor Off

    'zmienne
    Dim T(2) As Byte 'tu przechowamy odczytaną wartość z DS1820
    Dim X As Byte
    Dim A As Byte
    Dim Temp As Single 'wartość temperatury po przekształceniach
    Dim Str_temp As String * 5

    'deklaracje procedur
    Declare Sub Pomiar_temp 'Dokonaj pomiaru temperatury
    Declare Sub Skip_rom 'Wywołaj urządzenie na magistrali
    Declare Sub Wysw_temp 'Konwertuj/wyświetl odczytaną wartość
    'Konwertuj/wyświetl odczytaną wartość
    '-------------------------------------------------------------------------------

    Cls
    Cursor Off
    Lcd " Termometr by"
    Wait 2
    Lowerline
    Lcd " Shevu :)"

    Wait 4

    Cls
    Cursor Off

    Lcd "Temp:"

    '-------------------------------------------------------------------------------
    Do

    1wreset
    If Err = 1 Then 'jesli brak czujnika to
    Cls 'czysc lcd
    Lcd "Brak czujnika" 'wyswietla napis "bark czujnika"
    Waitms 250
    'czekaj 250ms
    Else 'jesli tak nie jest to
    Call Pomiar_temp 'idz do podprogramu pomiar_temp
    Call Wysw_temp 'idz do podprogramu wysw_temp
    End If
    Loop
    'koniec programu

    '-------------------------------------------------------------------------------

    Sub Pomiar_temp 'podprogram pomiar_temp

    1wreset 'resetuj magistrale 1WIRE
    1wwrite &HCC 'opusc identyfikacje układów (Skip ROM)
    1wwrite &H44 'inicjuj konwersje temperatury
    Waitms 250
    Waitms 250
    Waitms 250 'czekaj 750ms
    1wreset 'resetuj magistrale 1WIRE
    1wwrite &HCC 'opusc identyfikacje układów (Skip ROM)
    1wwrite &HBE 'odczytaj zawartość pamieci


    T(1) = 1wread() 'odczytaj z magistrali 1WIRE 1 bajt
    T(2) = 1wread() 'odzcytaj z magistrali 1WIRE 2 bajt
    1wreset
    End Sub
    '-------------------------------------------------------------------------------

    Sub Wysw_temp

    Locate 1 , 7
    If T(2) = 0 Then
    Temp = T(1) / 2
    Else
    X = 256 - T(1)
    Temp = X / 2

    Lcd "-"
    End If

    Str_temp = Fusing(temp , "###.&") ' przekształć do string
    Lcd Str_temp ; Chr(0) ; "C" ; " :) " 'Wyświetl temperaturę
    Lowerline
    Lcd " Shevu"
    Upperline
    End Sub
  • Poziom 10  
    może szukam nie tam gdzie trzeba ?
    Może jest to problem np. z zasilaniem ?
    Mam przetwornicę DC/DC

    Dodano po 13 [sekundy]:

    ale spróbuję

    Dodano po 5 [minuty]:

    skompilowałem Twój programik i wyskoczyło mi
    BRAK CZUJNIKA :), czujnik podłączony normalnie
  • Poziom 25  
    sprawdz czy napewno dobry port podałes sprawdz czy dobrze podciagneles linie DQ i czy ją podciagneles do +5V, mase tez sprawdz

    A wogóle to jaki masz port jako 1wire?
  • Poziom 10  
    wszystko jest OK. CZujnik na VDD ma 4.95V, na DQ (w odniesienu do GND) ma to samo. masy są, nawet zamontowałem osobne zasilanie dla czujnika (lm7805) i dalej to samo. Przez moment wyskoczył mi pomiar, ale tylko raz i to wówczas gdy podłaczyłem mu ososbne zasilanie ale nie połączyłem mas obu zasilaczy.
  • Poziom 25  
    a podłączyłes tak jak ja Ci pisałem ? czy tak jak wczesniej miałes?
  • Poziom 10  
    testowałem obie wersje, z dwoma zasilaniami też i nic.

    Dodano po 2 [minuty]:

    czujnik podłączony do portuA.0 bo podłączyłem go teraz do Atmegi32(żeby sprawdzić), w atmedze mam jeszcze zewn RTC i pamięć EEPROM. Wszystko chodzi oprócz czujnika :)
  • Poziom 25  
    Masz moze schemat tego?
  • Poziom 10  
    podaje całą procedurę


    $regfile "m32def.dat"
    $crystal = 8000000
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.4 , Rs = Portc.5

    Config 1wire = Porta.0

    Declare Sub Odczyt_temp

    Dim Temperatura(2) As Byte

    Deflcdchar 0 , 12 , 18 , 18 , 12 , 32 , 32 , 32 , 32
    '***********************************************************
    Do
    Cursor Off
    Call Odczyt_temp
    Cls
    If Temperatura(2) = 0 Then
    Lcd "temp: " ; Temperatura(1) ; Chr(0) ; "C"
    Else
    Lcd "temp: -" ; Temperatura(1) ; Chr(0) ; "C"
    End If

    Loop
    '************************************************************


    Sub Odczyt_temp

    1wreset
    1wwrite &HCC
    1wwrite &H44
    Waitms 1000
    1wreset
    1wwrite &HCC
    1wwrite &HBE

    Temperatura(1) = 1wread(2)
    1wreset

    If Err = 0 Then
    Cls
    Lcd "brak ukladu"
    Do
    Loop
    End If
    If Temperatura(2) > 0 Then
    Temperatura(1) = 256 - temperatura(1)
    End If
    Temperatura(1) = Temperatura(1) / 2
    End Sub

    Dodano po 40 [sekundy]:

    schemat tego układu ?

    Dodano po 1 [minuty]:

    układ ma dwa moduły:
    1. AT2313 + ds18b20 mierzy i wysyla na RS wynik z pomiarem

    2. odbiera i wyswietla wynik, co ustalony czas (1 do 60 minut) zapisuje pomiar wraz z godziną i datę do eepromu.

    Dodano po 38 [sekundy]:

    w 2 module jest wlasnie atmega32
  • Poziom 25  
    Tak schemat układu. A czy wsadziles moj program w niezmienionej postaci? oczywiście oprocz zmian portów i crystal?
  • Poziom 10  
    ludziska może jakas wstawka asemblerowa coś tu pomoże. Jakby ktoś mógł to byłbym wdzieczny.
    Atmega32, 8Mhz zewnetrzny, portc.0, :)
  • Poziom 39  
    Krzysiek J napisał:
    Atmega32, 8Mhz zewnetrzny, portc.0, :)

    Odczytaj stan młodszego bajtu bezpieczników(fusebits) i podaj jego wartość.

    Piotrek
  • Poziom 10  
    moge w bascomie odczytać cos takiego:

    LOCKBIT 21 : 11 /no memeory lock featurs enabled/

    Dodano po 4 [minuty]:

    Z tego co poczytałem w archiwach ten problem pojawia się dość częst, komunikacja z DS18B20 albo chodzi pod Bascomem albo nie i nie wiem od czego to zależy.
    Mślałem że to zasilanie, sprawdziłem DS pod przetwornicą DC/DC pod LM7805, a nawet kupiłem bateryjkę do niego i nic. Mam drugi czujnik z nim też to samo, pod atmegą też nie chce chodzić.
  • Poziom 39  
    Krzysiek J napisał:
    ...LOCKBIT 21 : 11 /no memeory lock featurs enabled/

    Hmmm...
    Skoro nie wiesz co to są fusebity(bezpieczniki) , to napewno nie zmieniałeś ich stanu i jestem niemal pewny , że Twoja ATMega32 chodzi na 1MHz.
    Więc załaduj do uC taki test:
    Code:

    $regfile="m32def.dat"
    $crystal=1000000

    'konfiguracja LCD
    'konfiguracja 1wire

    Do
       Cls
       1wreset
       Lcd Err;
       Wait 1
    Loop

    Napisz , co się wyświetla na LCD.

    Piotrek
  • Poziom 10  
    sorki źle zrozumiałem, Fusebity są ustawione na :
    CKSEL3...1 na 1111.

    Podałem ci ustawieniana 2313

    Dodano po 3 [minuty]:

    CKSEL=1111 SUT=00
  • Poziom 10  
    Atmege mam ustawioną do pracy na zewn. oscylatorze 8MHz CKSEL3...1 na 1111.
    Sprawdzałem Twoją propozycję, ale jak ustawiłem kwarc na 1Mhz ($crystal), to mi się wszystko rozjechało. Bawiłem sie zasilaniem DS'a i czasami które trzeba odczekać po wysłaniu komendy ConvertT 44H, czasy zwiększałem i zmniejszałem ale bez skutku :(
  • Poziom 10  
    Po dogłębnej analizie problemu pozozstał mi jescze jeden pomysł, zauważyłem to przypadkiem. Być może jest to wina kwarcu, poniewż kiedy moje urządzenie nagrzało się od słońca to kwarc w ogóle nie wystartował. Transmisja w w One Wire jest dynamiczna, więc sprubuje wymienić kwarc i kondensatory na bardziej dokładne.
  • Poziom 22  
    Jestem początkujący ale waitms 1000 mi strasznie nie pasuje:

    Code:
    1wreset 
    
    1wwrite &HCC
    1wwrite &H44
    Waitms 1000
    1wreset
    1wwrite &HCC
    1wwrite &HBE


    mozesz miec wartosc max 255 przeczytaj w helpie :)

    Pozdrawiam

    Dodano po 7 [minuty]:

    pamietam ze przez taki wlasnie bląd program przerywał mi pętle główną
  • Poziom 21  
    jesli chodzi o to waitms <255 to wydaje mi sie darrrrek ze nie masz racji;) nie moze wyskoczyc z pentli

    a powracjajac do tego czujnika dallasa to tez mam podobny problem wogule nie ma odwolania do czujnika nie mam pojecia co moze byc nie tak zew kwarc 8MHz $crystal = 8000000 :)
  • Poziom 26  
    witam kolegów.

    ja do jako program wyjsciowy do DS'a stosuje coś takiego jak poniżej.
    jeszcze niegdy mnie nie zawiódł, na początku wysyła bity konfigóracyjne które niebardzo pamiętam co robią ale to mozna pominąc gdyż są to ustawienia domyślne DS'a wysyłam tak na wszelki wypadek :)
    Code:

    Const Skip_rom = &HCC
    Const Convert = &H44
    Const Read_sp = &HBE
    Const Write_sp = &H4E
    Const Copy_sp = &H48
    Const Recall_ee = &HB8
    Const Search_rom = &HF0
    Const Read_rom = &H33
    Const Match_rom = &H55
    Const Alarm = &HEC
    Config Lcd = 16 * 2

    Dim Scrachpad(8) As Byte
    Dim Tmp As Integer
    Dim Wynik As Single

    Cls
    Lcd "Temperature sensor"
    Wait 1
    Cls
    Config 1wire = Portb.7
    Waitms 100

    1wreset
    1wwrite Skip_rom
    1wwrite Write_sp
    1wwrite 0
    1wwrite 0
    1wwrite &H7F
    Do


    1wreset
    1wwrite Skip_rom
    1wwrite Convert
    Waitms 800

    1wreset
    1wwrite Skip_rom
    1wwrite Read_sp

    Scrachpad(1) = 1wread()
    Scrachpad(2) = 1wread()
    Tmp = Scrachpad(2) * 256
    Tmp = Tmp + Scrachpad(1)
    Wynik = Tmp
    Wynik = Wynik / 16

    Cls
    Lcd Wynik

    Wait 1
    Loop

    tak ja już zostało napisane stabilność czestotliwości jest bardzo ważna.
    co do podłączenia to ja zawsze daje 3-wired czyli masa, zasilanie przez filtr R-C (100ohm+10uF) i DQ podciagane do plusa przez 4,7k
    jeśli kolega musi mieć 2 przewody to Vcc czujnika należy podłaczyć do masy.