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

Czujnik temperatury DS18B20 i AT90S2313, bład komunikacji

Krzysiek J 29 Cze 2006 08:29 3267 28
REKLAMA
  • #1 2773583
    Krzysiek J
    Poziom 11  
    Posty: 32
    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
    Załączniki:
    • ds18b20.doc (26 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • #2 2773763
    Krzysiek J
    Poziom 11  
    Posty: 32
    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
    #3 2773847
    crazy_phisic
    VIP Zasłużony dla elektroda
    Posty: 2244
    Pomógł: 278
    Ocena: 130
    Chyba zapomniałeś o wysłaniu polecenia konwersji ;)
    
    1Wwrite &hcc
    1Wwrite &h44  <<<<-----
    WaitMs 250
    WaitMs 250
    WaitMs 250
    1Wreset
    1Wwrite &hcc
    1Wwrite &hbe
    
  • #4 2773919
    Krzysiek J
    Poziom 11  
    Posty: 32
    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 ?
  • #5 2773940
    crazy_phisic
    VIP Zasłużony dla elektroda
    Posty: 2244
    Pomógł: 278
    Ocena: 130
    A wyslij przez RS od razu wartość odczytaną z DS, np.
    Print temp(1)
    i sprawdż co wychodzi
  • #6 2774139
    Krzysiek J
    Poziom 11  
    Posty: 32
    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
    #7 2775364
    Press
    Poziom 24  
    Posty: 566
    Pomógł: 69
    Ocena: 40
    kod skopiowany z mojego programu. dziala bez problemu. 1wire podpiete jest pod portd.7

    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].

  • REKLAMA
  • #8 2775661
    Krzysiek J
    Poziom 11  
    Posty: 32
    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
    #9 2776442
    ShEvU_elektro
    Poziom 25  
    Posty: 995
    Pomógł: 26
    Ocena: 22
    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
  • #10 2780637
    Krzysiek J
    Poziom 11  
    Posty: 32
    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 :)
  • #11 2780675
    ShEvU_elektro
    Poziom 25  
    Posty: 995
    Pomógł: 26
    Ocena: 22
    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
  • REKLAMA
  • #12 2780695
    Krzysiek J
    Poziom 11  
    Posty: 32
    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
  • #13 2780718
    ShEvU_elektro
    Poziom 25  
    Posty: 995
    Pomógł: 26
    Ocena: 22
    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?
  • #14 2780750
    Krzysiek J
    Poziom 11  
    Posty: 32
    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.
  • #15 2780760
    ShEvU_elektro
    Poziom 25  
    Posty: 995
    Pomógł: 26
    Ocena: 22
    a podłączyłes tak jak ja Ci pisałem ? czy tak jak wczesniej miałes?
  • #16 2780771
    Krzysiek J
    Poziom 11  
    Posty: 32
    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 :)
  • REKLAMA
  • #17 2780780
    ShEvU_elektro
    Poziom 25  
    Posty: 995
    Pomógł: 26
    Ocena: 22
    Masz moze schemat tego?
  • #18 2780786
    Krzysiek J
    Poziom 11  
    Posty: 32
    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
  • #19 2780802
    ShEvU_elektro
    Poziom 25  
    Posty: 995
    Pomógł: 26
    Ocena: 22
    Tak schemat układu. A czy wsadziles moj program w niezmienionej postaci? oczywiście oprocz zmian portów i crystal?
  • #20 2782284
    Krzysiek J
    Poziom 11  
    Posty: 32
    ludziska może jakas wstawka asemblerowa coś tu pomoże. Jakby ktoś mógł to byłbym wdzieczny.
    Atmega32, 8Mhz zewnetrzny, portc.0, :)
  • #21 2782699
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Krzysiek J napisał:
    Atmega32, 8Mhz zewnetrzny, portc.0, :)

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

    Piotrek
  • #22 2783601
    Krzysiek J
    Poziom 11  
    Posty: 32
    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ć.
  • #23 2783886
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    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:
    
    $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
  • #24 2783915
    Krzysiek J
    Poziom 11  
    Posty: 32
    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
  • #25 2785434
    Krzysiek J
    Poziom 11  
    Posty: 32
    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 :(
  • #26 2789274
    Krzysiek J
    Poziom 11  
    Posty: 32
    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.
  • #27 2790932
    darrrrek
    Poziom 22  
    Posty: 733
    Pomógł: 4
    Ocena: 98
    Jestem początkujący ale waitms 1000 mi strasznie nie pasuje:

    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ą
  • #28 2925927
    grabek_radek
    Poziom 21  
    Posty: 579
    Pomógł: 2
    Ocena: 37
    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 :)
  • #29 2926065
    hunterhouse
    Poziom 26  
    Posty: 893
    Pomógł: 84
    Ocena: 3
    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 :)
    
    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.

Podsumowanie tematu

✨ Dyskusja dotyczy problemów z komunikacją magistrali One Wire między mikrokontrolerem AT90S2313 (oraz ATmega32) a czujnikiem temperatury DS18B20. Użytkownik zgłaszał błędy w komunikacji, brak odczytów lub stałe wartości 0°C, mimo poprawnego podłączenia i stosowania rezystora podciągającego 4,7 kΩ. Wskazywano na konieczność wysłania komendy konwersji temperatury (0x44) po resecie magistrali oraz prawidłowego odczytu danych. Problemy mogły wynikać z błędów w kodzie, złego doboru portów, nieprawidłowego taktowania mikrokontrolera (fusebity, częstotliwość kwarcu), a także zasilania czujnika. Zalecano podłączenie linii DQ do pinu mikrokontrolera z rezystorem podciągającym do +5V, a zasilanie czujnika w trybie parasitic power wykluczono jako stabilne. Wskazano, że czas oczekiwania na konwersję nie powinien przekraczać limitów funkcji Waitms. Użytkownik testował różne programy, w tym przykładowy kod działający na 1-wire, lecz problem utrzymywał się. Sugerowano wymianę kwarcu i kondensatorów na bardziej precyzyjne oraz sprawdzenie poprawności konfiguracji fusebitów i taktowania. Ostatecznie problem mógł mieć źródło w niestabilnym taktowaniu lub błędach w implementacji protokołu One Wire, a także w zasilaniu i połączeniach sprzętowych.
Wygenerowane przez model językowy.
REKLAMA