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

Odczyt temperatury z DS18B20 na ATMEGA8 w Bascom AVR – kod do 1-wire

Mariusz Wiśniewski 19 Gru 2006 10:45 8499 6
REKLAMA
  • #1 3347794
    Mariusz Wiśniewski
    Poziom 14  
    Posty: 167
    Pomógł: 4
    Ocena: 13
    Witam,

    mam problem ze zrozumieniem obsługi transmisji 1-wire w Bascom'ie. Chciałbym obsłużyć jeden układ DS18B20 przez mikrokontroler ATMEGA8. Zależy mi na programie odczytującym wartość temperatury i zapisaniu tej wartości w postaci liczby dziesiętnej jako zmienna. Jeżli ktoś ma chwilę czasu to bardzo proszę o umieszczeniu kompletnego kodu, wtedy po analizie zrozumiem wreszcie jak obsługwać tą magistralę. Narazie wystarczy mi odczytać wynik jako liczbę całkowitą.

    Bardzo Proszę o pomoc

    Pozdrawiam
  • REKLAMA
  • Pomocny post
    #2 3347846
    john_t
    Poziom 29  
    Posty: 1070
    Pomógł: 127
    Ocena: 89
    Opis magistrali 1Wire masz w helpie. Poniżej kod na obsługę dallasa DS18B20.

    Config 1wire = P1.0 'konfiguracja magistrali 1wire
    Config Lcd = 16 * 1a 'konfiguracja wyswietlacza
    Deflcdchar 1 , 4 , 10 , 4 , 32 , 32 , 32 , 32 , 32 'znak stopnia
    Dim T1 As Single
    Dim T2 As Single
    Dim B1 As Byte , B2 As Byte , R As Byte
    Dim Tmp As String * 6
    Dim Znak As String * 1
    R = &HFF
    Declare Sub 1wr 'podprogram resetujacy magistrale 1w
    Cursor Off
    Cls

    Do
    1wr 'podprogram 1wr
    1wwrite &HCC 'komenda skip ROM
    1wwrite &H44 'komenda convert T
    Waitms 250
    Waitms 250
    1wr 'podprogram 1wr
    1wwrite &HCC 'komenda skip ROM
    1wwrite &HBE 'komenda read

    B1 = 1wread() 'odczyt z termometru
    B2 = 1wread()

    1wr 'podprogram 1wr

    If B2 >= 248 Then 'w przypadku temperatur ujemnych
    B1 = R - B1 'Od 255 Odejmujemy B1
    B2 = R - B2 'od 255 odejmujemy B2
    Znak = "-"
    Else
    Znak = "+"
    End If
    T1 = B1 / 16 'Przesuniecie w pawo o 4 bajty
    T2 = B2 * 16 'przesuniecie w lewo o 4 bajty
    T1 = T1 + T2

    Tmp = Fusing(t1 , ###.&&)
    Cls
    Lcd Znak ; Tmp ; Chr(1) ; "C "

    Waitms 250
    Waitms 250
    Waitms 250
    Waitms 50
    Loop

    Sub 1wr 'podprogram resetujacy magistrale
    1wreset
    End Sub
  • REKLAMA
  • #3 3348005
    Mariusz Wiśniewski
    Poziom 14  
    Posty: 167
    Pomógł: 4
    Ocena: 13
    Dzięki za program, udało mi się odczytać 2 bajty. Niestety nie posiadam wyświetlacza alfanumerycznego i korzystam z 4 wyświetlaczy sterowanych multipleksowo, więc mam problem z rozszyfrowaniem znaczenia bitów. Z moich obserwacji pierwszy bajt ma duży wpływ na temperaturę, ale nie pokazuje on chyba prawidłowej temperatury w kodzie dzisiętnym... Na drugim bajcie jest wartość 1, po podgrzaniu wystąpiła 2. Czy informacje o temperaturze wychodzą w kodzie binarnym? Na 3. stronie jest tabela, jak z niej odczytać informacje?
  • #4 3348187
    john_t
    Poziom 29  
    Posty: 1070
    Pomógł: 127
    Ocena: 89
    Mariusz Wiśniewski napisał:
    Dzięki za program, udało mi się odczytać 2 bajty. Niestety nie posiadam wyświetlacza alfanumerycznego i korzystam z 4 wyświetlaczy sterowanych multipleksowo, więc mam problem z rozszyfrowaniem znaczenia bitów. Z moich obserwacji pierwszy bajt ma duży wpływ na temperaturę, ale nie pokazuje on chyba prawidłowej temperatury w kodzie dzisiętnym... Na drugim bajcie jest wartość 1, po podgrzaniu wystąpiła 2. Czy informacje o temperaturze wychodzą w kodzie binarnym? Na 3. stronie jest tabela, jak z niej odczytać informacje?


    Cała transmisja danych w Wire jest oczywiście w kodzie binarnym.
    Dallas DS18B20 wysyłą 9 bajtów danych z czego dane o temperaturze znajdują sie tylko w dwóch pierwszych. W środku tabeli zgrupowano te dwa bajty i tak np:
    dla 125°C to: 0000 0111 1101 0000
    Informacja że to 125 znajduje się od 4 do 10-go bitu (licząc od tyłu oczywiście) tak więc liczba binarna 111 1101 = 125. Na prawo (młodsze bity to informacja o tym co po przecinku (w tytm przypadku 0000).
    A teraz sam sobie zobacz starsze bity (na lewo tej sekwencji) oznaczane jako bity "S" (czytaj dalej PDF'a) co stanowi o tym że temperatura jest ujemna...
  • REKLAMA
  • #5 3349214
    robgold
    Poziom 23  
    Posty: 724
    Pomógł: 10
    Ocena: 290
    scal sobie te dwa bajty w jedna zmienna.
    
    T = Makeint(mbt , Sbt)
    T = T * 10
    T = T / 16
    

    Oczywiscie zmienna T jest typu integer
    W tym momencie masz liczbe 3 cyfrowa z ulamkiem ale bez kropki. Czyli 24,5 stC jest zapisane jako 245 Wystarczy odpowiednio powycinac cyferki do multipleksu wlaczyc kropke na wysiwetlaczach i gotowe.
  • REKLAMA
  • #6 3350802
    Mariusz Wiśniewski
    Poziom 14  
    Posty: 167
    Pomógł: 4
    Ocena: 13
    Dzięki Panowie za pomoc, udało mi się opanować tę transmisję. Teraz mam pytanie trochę z innej beczki - chodzi o podział liczby 3 cyforwej na 3 pojedyncze cyfry. Napisałem program, który spełnia moje oczekiwania, ale myślę, że jest na to prostszy sposób, proszę, naprowadźcie mnie.

    Pozdrawiam

    Dim X As Byte
    Dim A As Byte
    Dim B(2) As Byte
    Dim C As Byte
    
    X = 123
    
    A = X / 100
    B(1) = X / 10
    B(2) = A * 10
    B(1) = B(1) - B(2)
    C = B(1) + B(2)
    C = C * 10
    C = X - C
    
    Print "S " ; "D " ; "J"
    Lowerline
    Print A ; " " ; B(1) ; " " ; C
    
    End
  • #7 3350943
    robgold
    Poziom 23  
    Posty: 724
    Pomógł: 10
    Ocena: 290
    Ja sobie z tym radze tak:
    
    Z1 = T / 100
    Z = Z1
    
    X1 = T Mod 10
    X = X1
    
    Y1 = T Mod 100
    Y = Y1
    
    Y = Y - X
    Y = Y / 10
    
    


    zmienne x1,y1,z1 sa typu integer
    T to odczytana temperatura z dallasa
    x,y,z to zmienne typu byte.

Podsumowanie tematu

✨ Dyskusja dotyczy implementacji odczytu temperatury z czujnika DS18B20 za pomocą mikrokontrolera ATMEGA8 w środowisku Bascom AVR, wykorzystując magistralę 1-wire. Przedstawiono przykładowy kod obsługi 1-wire, który umożliwia inicjację magistrali, wysłanie komend do DS18B20 oraz odczyt dwóch bajtów danych temperatury. Omówiono sposób interpretacji danych binarnych przesyłanych przez DS18B20, gdzie temperatura jest zakodowana w dwóch pierwszych bajtach, z uwzględnieniem bitów odpowiadających części całkowitej i ułamkowej oraz znaku temperatury (dodatnia/ujemna). Zaproponowano metodę scalania dwóch bajtów w jedną zmienną typu integer i przeliczenia jej na wartość temperatury w stopniach Celsjusza z dokładnością do dziesiątych części stopnia. W dalszej części omówiono sposoby rozdzielenia trzycyfrowej liczby temperatury na pojedyncze cyfry, co jest przydatne przy wyświetlaniu na multipleksowanych wyświetlaczach 7-segmentowych. Zaprezentowano różne metody dzielenia i operacji modulo w Bascom AVR, ułatwiające ekstrakcję setek, dziesiątek i jedności z wartości temperatury.
Wygenerowane przez model językowy.
REKLAMA