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

Jak uruchomić czujnik DS18B20? Problem z wyświetlaniem danych na LEDach

alexiel 11 Lut 2004 14:50 2669 10
  • #1 500922
    alexiel
    Poziom 15  
    Posty: 211
    Pomógł: 1
    Błagam was pomóżcie . Nie moge tego cholerstwa uruchomić. Może ktoś mi uratuje dupsko. Wykrywa czujnik skorzystałem z gotowego programu który byłna ledach i jakieś głupoty wyświetla. Prosze wszystkich życzliwych o pomoc
  • #2 500940
    Father
    Poziom 26  
    Posty: 681
    Pomógł: 88
    Ocena: 13
    Potrzebuję więcej informacji: jaki mikrokontroler, w czym napisany program itp.
  • #3 500944
    alexiel
    Poziom 15  
    Posty: 211
    Pomógł: 1
    Procek to At89S8252 napisane w Bascomie.
    Korzystałem z tego .
    Dim Disp4 As Byte
    Dim T As Integer
    Dim T1 As Integer
    Dim Bd(9) As Byte
    Dim Tmp1 As Integer
    Dim Tmp2 As Integer
    Dim Tmp3 As Integer

    Declare Sub Showmetemp
    Declare Sub Read1820

    Anoda1 Alias P3.7
    Anoda2 Alias P3.5
    Anoda3 Alias P3.4
    Anoda4 Alias P3.3
    '*********************************************************************************************************
    Main: 'petla glowna
    Do
    Showmetemp 'pokazuje temperature
    Wait 3 'co 3 sek
    Loop
    End
    '*********************************************************************************************************
    Sub Showmetemp
    Disable Interrupts 'wylaczenie przerwan
    1wwrite &HCC
    1wwrite &H44
    Enable Interrupts 'uruchomienie przerwan
    Wait 1 'czeka sekunde
    Read1820 'odczyt z Dallasa
    If Err = 1 Then 'jezeli Dallas sie nie zglosi to
    Disp1 = 10 'pierwszy wygaszony
    Disp2 = 12 'E
    Disp3 = 13 'r
    Disp4 = 13 'r
    Waitms 255 'czeka
    Else
    D2 = T / 100 'przerobka temperatury
    Disp2 = Abs(d2) 'do postaci trawionej
    Tmp1 = D2 * 100 'przez 4 wyswietlacze LED
    Tmp2 = T - Tmp1
    D3 = Tmp2 / 10
    Disp3 = Abs(d3)
    Tmp1 = D3 * 10
    Tmp3 = Tmp2 - Tmp1
    D4 = Tmp2 - Tmp1
    Disp4 = Abs(d4)
    End If

    If T < 0 Then 'jezeli temperatura ujemna to
    Disp1 = 11 'na pierwszym wyswietlaczu minus
    Else
    Disp1 = 10 'w innym przypadku wygas pierwszy
    End If
    End Sub
    '*********************************************************************************************************
    Sub Read1820 'standardowa procedura odczytu Dallasa
    Disable Interrupts
    1wreset
    1wwrite &HCC
    1wwrite &HBE
    Bd(1) = 1wread(9)
    Enable Interrupts
    1wreset
    Tmp1 = Bd(1) And 1
    If Tmp1 = 1 Then Decr Bd(1)
    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
    End Sub
  • #4 500980
    Father
    Poziom 26  
    Posty: 681
    Pomógł: 88
    Ocena: 13
    Tak na szybko to mogę podpowiedzieć, że niektórym pomogło ustawienie dłuższego czasu konwersji "Wait 1 'czeka sekunde" w Sub Showmetemp
  • #5 501753
    radek.kaba
    Poziom 15  
    Posty: 120
    Pomógł: 1
    Najpierw powinieneś sprawdzić co odczytuje w pierwszych dwóch komórkach - w twojej tablicy BD(1) i Bd(2), tam jest temperatura z rozdzielczością 0,5st.C. Bd(1) młodszy bajt, Bd(2) starszy bajt, jeżeli jet to wartość 00AAh czyli 85,0 st.C - jest to wartość wpisana przez DSa po załączeniu zasilania - to prawdopodobie używasz zasilania pasożytniczego i ds nie ma energi za wykonanie pomiaru (czas 1s jest wystarczający i nie należy go zwiększać).
    zalecenia:
    1) po komendzie "konwercji" :
    1wwrite &HCC
    1wwrite &H44
    nalęży zewrzeć na co najniej 15us linie danych do zasilania - najprościej za ponocą tranzystora PNP np. BC557 - (B - do pinu uC, E - Ucc, C - do linii danych)

    2) można także zpróboiwać zniejszyć rezystor podpinający linie danych do zasilania do 1,5K tak działa na niektorych procesorach (niestety nigdy tego nie robiłem na AVR).

    Jeżeli temperatura odczytana z dwu pierwszych bajtów będzie poprawna (inna niż 85,0stC) to możesz się bawić w przeliczanie temperatury z większą rpzdzieczością (z uwzględnieniem "precyzyjnych rejestrów Bd(6) i Bd(7).
  • #6 501944
    alexiel
    Poziom 15  
    Posty: 211
    Pomógł: 1
    Dzięki za odpowiedzi .Do tej pory robiłem na DS1821 i nie było problemu. Ten czujnik mam podłączony 3przewodami Dq Vss i Vdd oddzielnie .chodzi mi orozdzielczość 0.5 stopnia ponieważ mam do wykonania w pracy regulator na tych czujnikach. Jakby ktoś miał jakieś pomysły to z góry dziękuje
  • #7 502039
    alexiel
    Poziom 15  
    Posty: 211
    Pomógł: 1
    Ludzie może mi odpowiedzieć jak sie zczytuje tą temperaturę chodzi mi o młodszy i starszy bajt. Jest coś takiego jak Read scratchpad BEH i jak tą komendą odzytać te dwa bajty. tam jest 8 bajtów obok bajtów temp są dwie wartości 50H i 05H czy to są adresy zpod których się zczytuje tą temperature
  • #8 502233
    euromatic
    Poziom 21  
    Posty: 422
    Pomógł: 17
    Ocena: 14
    Jak tytuł postu wskazuje używasz czujnika DS18B20 ,a używasz procedur do odczytu DS1820....
    To wyjaśnia twoje problemy. Te czujniki różnią się nieznacznie sposobem wyliczania temperatury.
    Pozdrawiam
  • #9 503258
    radek.kaba
    Poziom 15  
    Posty: 120
    Pomógł: 1
    Sorry zmyliłeś mnie tym koden na 1820(18s20).
    DS18B20 w pierwszych dwu bajtach temperatura zapisana jest na 12bitah (11 + bit znaku), a w 1820 na dziewięciu (8+1 znaku).

    50h i 05h to 0550h (0000 0101 0101 0000binarnie)
    jeżeli przesuniesz 4 bity w prawo otrzymasz 0000 0000 0101 0101 czyli 0055h czyli 85stC (gotowe stopnie).
    A w mlodszym niblu mlodszego bajtu masz wartość po przecinku, ale w w 1/16 stopnia, skoro używasz BASCOMa nie powinieneś mieć problemu z uzyskaniem rozdielczości 0,1 stC :
    maksymalna wartość to 1111b 0Fh czyli 15
    X=15
    1)x= x*10 = 150
    2)x=x/16 = 9 - tak obetnie BASCOM
    i masz gotową wartość dziesiątych stopnia.

    W DS18B20 jest jeszcze bajt konfiguracji w twojej tablicy ds(5), aby mieć maksymalną rozdzielczość 1/61 (0,0625stC) ten baj musisz ustawić na 01111111b tak jest po włączeniu zasilania , aha ! przy 12-bitowej rozdielczości czas konwersji (pomiaru) trwa 750ms i na tyle czasu musisz dać spokój DSowi.
    Pamiętaj, że zapisując i odczutując scratchpad mu wysyłać lub odbierać wszystkie 9 bajtów.
    A najlepiej zapoznać się z orginalną dokumentacją :

    http://para.maxim-ic.com/compare.asp?Fam=Temp...438,119439,119440,119441,119442,119443,119444
  • #10 503283
    radek.kaba
    Poziom 15  
    Posty: 120
    Pomógł: 1
    ERRATA:

    rozdielczość 1/16 a nie 1/61 stopnia.

    Tak to jest jak się jedną ręką smaruje program a drugą posta :-)
  • #11 503488
    alexiel
    Poziom 15  
    Posty: 211
    Pomógł: 1
    Dzieki wszystkim za pomoc wreszcie uruchomiłem to diabelskie ustrojstwo...
    Pozdrawiam

Podsumowanie tematu

✨ Dyskusja dotyczy problemów z uruchomieniem i poprawnym wyświetlaniem danych temperatury z czujnika DS18B20 na diodach LED, sterowanego mikrokontrolerem At89S8252 i programowanego w Bascomie. Użytkownik korzystał z gotowego programu przeznaczonego dla czujnika DS1820, co powodowało błędne odczyty. Wskazano, że DS18B20 różni się od DS1820 m.in. rozdzielczością pomiaru (12-bitowa vs. 9-bitowa) oraz czasem konwersji (750 ms dla DS18B20). Zalecano sprawdzenie wartości w pierwszych dwóch bajtach scratchpada (BD(1) i BD(2)) oraz zwrócenie uwagi na poprawne zasilanie czujnika – w przypadku zasilania pasożytniczego konieczne jest podanie dodatkowego zasilania na linię danych, np. przez tranzystor PNP. Podkreślono, że dla DS18B20 należy ustawić odpowiedni bajt konfiguracji dla maksymalnej rozdzielczości i zapewnić odpowiedni czas oczekiwania na konwersję. Po zastosowaniu tych wskazówek użytkownik potwierdził poprawne uruchomienie czujnika i wyświetlanie temperatury z rozdzielczością 0,5°C. Omówiono także sposób odczytu temperatury z młodszego i starszego bajtu oraz interpretację wartości binarnych w scratchpadzie.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA