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

[bascom] 1Wire - czujnik temp. DS18B20

xamrex 09 Lis 2010 22:00 6030 12
  • #1 8723902
    xamrex
    Poziom 28  
    Witam,
    Na tej stronie znalazłem opis jak podłączyć czujnik DS18B20 do wyświetlacza LCD
    http://www.portalnaukowy.edu.pl/termometr_cyfr.htm

    Oto kod:
    'Jednopunktowy termometr z czujnikiem DS18B20
    'www.portalnaukowy.edu.pl
    'Program na podstawie kursu z ksiażki "Mikrokontrolery dla Poczatkujacych" Pana Piotra Góreckiego
    
    $crystal = 4000000						'deklaracja częstotliwosci pracy kwarcu
    
    $regfile "attiny2313.dat"					'model procesora dla którego jest ten program
    Deflcdchar 1 , 14 , 17 , 17 , 14 , 32 , 32 , 32 , 32        ' definicja znaki stopnia
    
    
    Config 1wire = Portd.5                                      ' konfiguracja portu PD.5 jako wescia magistrali 1-wire
    
    Dim Odczyt(2) As Byte , A As Byte , Licznik As Byte , T As Integer , T1 As Single , Napis As String * 5
    'Deklaracja wszystkich zmiennych potrzebnych do pracy programu
    
    Do
      1wreset                                                   'reset
      1wwrite &HCC                                              'jedna kostka, więc wykorzystujemy rozkaz SKIP ROM
      1wwrite &H44                                              'dokonaj konwersji
      Waitms 750                                                'przeczekaj czas konwersji
      1wreset                                                   'reset
      1wwrite &HCC                                              'rozkaz adresowy SKIP ROM
      1wwrite &HBE                                              'rozkaz funkcyjny - polecenie odczytu DS18x20
      Odczyt(1) = 1wread(2)                                     'odczytaj dwa pierwsze bajty
      T = Odczyt(2)                                             'przepisz starszy bajt do zmiennej typu Integer
      Shift T , Left , 8                                        'przesuń ten bajt w lewo na wyższe pozycje
      T = T + Odczyt(1)                                         'przepisz - dodaj młodszy bajt
    
      T1 = T * 0.0625                                               'wyraz w stopniach Celsjusza, wynik wpisz do zmiennej Single
    
    Napis = Fusing(t1 , "#.#")
      Cls : Cursor Off : Lcd "* Temperatura *"
      Lowerline
      Lcd "Wynik: " ; Napis ; " " ; Chr(1) ; "C"                'wyswietl wynik ze zmiennej Single
    Loop : End
    
    'Powodzenia


    No i wszystko działa.
    Chciałbym jednak "zrozumieć" w jaki sposób przeszedł sygnał z tego czujnika na wyświetlacz LCD.

    Zastanawia mnie ta linijka:
    Odczyt(1) = 1wread(2)
    Dlaczego odczytywane z czujnika są 2 pierwsze bity?

    Teraz postanowiłem sobie po sprawdzać/ po testować co "w pamięci" ma nasz czujnik.
    Na początek zrobiłem dałem taki kod:

    Lcd 1wread(2) 

    I wynik otrzymałem 5 Chociaż nie wiem co on oznacza? Może mógłby mi ktoś wytłumaczyć.

    Gdy wpisałem
    Lcd 1wread(1) 

    I wynik otrzymałem 44 Też nie wiem co on może oznaczać..

    Bardzo proszę o wytłumaczenie co oznaczają liczby, które dostałem po wykonaniu polecenia 1wread(1) oraz 1wread(2)

    Pozdrawiam

    // Wydaje mi się, że pierwszy bajt, to w nim jest zapisana temperatura
    a drugi to czy ona jest dodatnia czy ujemna,
    Ale Ja dostałem wartość 5 a powinno być chyba 0 lub 1, więc czegoś tu nie rozumiem :(
  • #2 8723945
    ShEvU_elektro
    Poziom 25  
    Dlaczego nie spojrzysz do noty katalogowej? Tam jest wszystko ładnie opisane :)
  • #3 8723950
    semper fidelis
    Poziom 13  
    Już tłumacze tylko pierwsze mam też prośbę mogłby kolega zmienić $crystal na 8Mhz oraz w procku to ustawić i sprawdzić czy działa?

    Cytat:
    Zastanawia mnie ta linijka:
    Odczyt(1) = 1wread(2)
    Dlaczego odczytywane z czujnika są 2 pierwsze bity?


    Nie bity tylko bajty kolego.

    A co one oznaczają to musi sobie kolega ściągnać datasheet do ds18b20 i tam jest napisane co oznaczają te 2 bajty dla różnych temperatur.

    Generalnie sprawa polega na tym ze temperatura w termometrze jest zapisywana na 2 bajtach i nie odczytuje się jej bezpośrednio tylko trzeba zrobić dekoder.

    Po studiowaniu pdfa na pewno się rozjaśni jak nie to można pytać dalej.

    Pozdrawiam
  • #4 8723962
    xamrex
    Poziom 28  
    Oglądałem, note ale ja tego nie do końca rozumiem:
    [bascom] 1Wire - czujnik temp. DS18B20

    Z tego co wyczytałem, to temperaturę powinienem dostać w postaci dwójkowej..

    A ja dostaję liczbę 44 Więc troche mnie to dziwi..

    Dodano po 56 [sekundy]:

    semper fidelis napisał:
    Już tłumacze tylko pierwsze mam też prośbę mogłby kolega zmienić $crystal na 8Mhz oraz w procku to ustawić i sprawdzić czy działa?


    Nie, temperatura pokazuje się błędna..
    Mógłbyś wytłumaczyć dlaczego?
  • #5 8724038
    semper fidelis
    Poziom 13  
    Sam bym chciał wiedzieć czemu: https://www.elektroda.pl/rtvforum/topic1816291.html

    Też jestem początkujący, ale trzeba też włożyć trochę wysiłku...

    Polecam ksiażkę M.Wiązania, Programowanie miktrokontrolerów avr w języku Bascom.

    A temperature dostajesz dziesietną bo żeby dostać binarną należy wpisać

    Lcd Bin(i tutaj to co chcesz wyświetlić)

    A ten pdf jest nie do końca Twój ds18B20 ma troszkę inne bity z temperatura. W tym co kolega podał tabelka 3. Trzeba rzucić okiem na angielskiego datasheeta i już będzie jasne.
  • #6 8724050
    xamrex
    Poziom 28  
    Znalazłem jeszcze taki kod:
    https://www.elektroda.pl/rtvforum/topic1020241.html#5177158
    Uproszczony do maksimum.
    
     I = 1wread(2)
       S = I / 16
       T = Fusing(s , "##.#")
    
       Locate 1 , 1
       Lcd "Temp:" ; T ; Chr(0) ; "C" 
    


    Program pobiera wynik, dzieli przez 16 i wyświetla na LCD..
    Tylko czemu dzieli akurat przez 16 a nie przez 17, czy 18?
  • Pomocny post
    #7 8724137
    semper fidelis
    Poziom 13  
    Dzielenie przez 16 to to samo co przesuwanie bajtu w prawo o 4. Czyli jest to wywalenie jakby 4 najmłodszych bitów, czyli odczyt temp będzie z dokładnością do 0,5 stopnia. Zajrzyj do notki.

    5 najstarszych bitów to znak czy dodatnia czy ujemna, a 4 najmłodsze oznaczają miejsca po przecinku. Rozumiem ze zmiana z systemu binarnego na dziesiętny jest znana?

    http://pdfserv.maxim-ic.com/en/ds/DS18B20.pdf strona 4.
  • #8 8724572
    xury
    Specjalista automatyka domowa
    Kolego xamrex podałeś kod, w którym masz opisaną linijkę po linijce, a Ty jeszcze chcesz wyjaśnień ?
    Poza tym na czujniki Dallasa jest przykładów na tym forum rzekłbym dziesiątki a może i setki. Proponuję też zajrzeć na stronę mirlej'a Jest tam wszytko opisane najprostszym językiem do zrozumienia (wg mnie).
    A jeszcze jedno - nic nie "przechodzi" z czujnika na LCD. Opis tego co robi poszczególna Bascomowa funkcja masz w helpie. Nawet tym starszym pana Zbyszka w naszym ojczystym języku.
  • #9 8724785
    xamrex
    Poziom 28  
    semper fidelis napisał:
    Dzielenie przez 16 to to samo co przesuwanie bajtu w prawo o 4. Czyli jest to wywalenie jakby 4 najmłodszych bitów, czyli odczyt temp będzie z dokładnością do 0,5 stopnia. Zajrzyj do notki.

    5 najstarszych bitów to znak czy dodatnia czy ujemna, a 4 najmłodsze oznaczają miejsca po przecinku. Rozumiem ze zmiana z systemu binarnego na dziesiętny jest znana?

    http://pdfserv.maxim-ic.com/en/ds/DS18B20.pdf strona 4.


    Już zaczyna mi się to wszystko wyjaśniać,
    tylko dziwi mnie zapis

    I = 1wread(2)
    Jeśli z bajta można odczytać temperature czy jest dodatnia czy ujemna (jest to przecież 5 pierwszych bitów)

    To te polecenie:
    I = 1wread(1) 
    co wyświetla?
    Lcd Bin(I)?
  • #10 8725387
    semper fidelis
    Poziom 13  
    Czytaj pdf strona 3...w notce naprawdę jest wszystko co potrzeba. Oraz możesz sobie helpa do Bascoma w języku ojczystym pobrać i sprawdzać co poszczególne komendy robią i jak funkcjonują.
  • #11 8725519
    xamrex
    Poziom 28  
    No nie potrafię tego zrozumieć..
    Zrobiłem coś takiego:
    
     I = 1wread(2) 
     S = I / 16    
    Locate 1 , 1
       Lcd Hex(i)
       Locate 2 , 1
       Lcd Hex(s)
    


    I mam wynik w pierwszej linijce na wyświetlaczu:
    00000133
    i w drugiej linijce
    41998000

    No ale przecież 133/16 to nie jest 41998000!
    Więc skąd to jest?
  • #12 8726046
    semper fidelis
    Poziom 13  
    Cytat:
    No ale przecież 133/16 to nie jest 41998000!


    Bo to po pierwsze nie jest dzielenie w systemie 16stkowym tylko dziesiętnym w programie.
    Poza tym brakuje koledze funkcji fusing(), a jak podzielimy 133 w hexie czyli 307 w dziesiętnym systemie przez 16 to otrzymamy 19stopni i mniemam że taka temperatura jest ustawiona.
    A druga linijka jest zła ze względu na brak funkcji fusing() bo dokładne podzielenie 307 na 16 daje 19,1875 i bez zaokrąglenia ta liczba przeliczana jest na hexa.
  • #13 8726918
    xamrex
    Poziom 28  
    To jaką komendę muszę zastosować, aby na wyświetlaczu pojawiła mi się temperatura w formacie takim jak ten np.
    0000 0111 1101 0000

    [bascom] 1Wire - czujnik temp. DS18B20
REKLAMA