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

Jak odczytać temperaturę z DS18B20 na ATmega16 w Bascom?

pawelj 05 Lip 2007 23:26 2923 5
REKLAMA
  • #1 4053871
    pawelj
    Poziom 15  
    Posty: 228
    Ocena: 34
    Witam
    Zaczynam trenować mikrokontrolery i programowanie. Próbowałem w asm ale jakoś ciężko - próbuje teraz w bascomie - i też ciężko niestety :(

    znalazłem jakiś przykład programu w bascom ale coś mi nie hula.
    
    $crystal = 16000000
    '$regfile = "m16.dat"
    
    Config Portc = Output
    
    Config 1wire = Porta.1
    Dim Odczyt(2) As Byte
    Declare Sub Odcz_temp
    
    Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2
       Config Lcd = 16 * 2
    
       Cursor Off
    
    
     Cls
       Locate 1 , 1
       Lcd "test"
       Wait 1
    
       Do
       Call Odcz_temp
       Cls
       Lcd "temp= " ; Odczyt(1) ; "C"
       Loop
       End
    
       Sub Odcz_temp
    1wreset
    1wwrite &HCC
    1wwrite &H44
    Waitms 750
    1wreset
    1wwrite &HCC
    1wwrite &HBE
    Waitms 750
    Odczyt(1) = 1wread(2)
    1wreset
    If Err = 1 Then
    Cls
    Lcd "brak ukladu"
    Waitms 750
    End If
    Odczyt(1) = Odczyt(1) / 2                                   'obliczanie temperatury
    End Sub
    
    



    Mam płytkę uniwersalną. na jakimiś orginalnym programie wszystko jest ok -więc znaczy, że elementy są sprawne.

    Ale mój powyższy program daje dość dziwne efekty. Coś wyświetla - ale temperatura jest bardzo zawyżona. Zresztą zmienia się w dziwnym zakresie. Po włączeniu pokazało 60 st. Teraz pokazuje 6 st. Wygląda, że albo mi źle tą temperaturę przelicza, albo odczytuję za dokładnie (setne zamiast pełnych stopni?).Po przytrzymaniu kilka sekund w palcach ukłądu pokazuje 106,108,112, potem spada. Obecnie pokazuje 72.

    Co ja mam tam nie tak?

    Czy mógłby ktoś wyprostować mój program?
    a przy okazji..
    Szukam w necie (po naszemu) jakiegoś mądrego wyjaśnienia działania 1wire w bascom i nie mogę się doszukać czegoś sensownego.

    Ma ktoś może jakieś linki?

    pawełJ
  • REKLAMA
  • #2 4054784
    redart
    Poziom 23  
    Posty: 529
    Pomógł: 51
    Ocena: 30
    Ja używam takiej procedurki do obliczania temperatury:

    Dim T As Integer
    
    T = Makeint(odczyt(1) , odczyt(2))
    If T <= 2000 Then
       T = T / 16
    Else
       T = 65536 - T
       T = T / 16
       T = 0 - T
    End If


    Działa zawsze i bez problemów, no chyba że jest babol w podłączeniu DS'a...
    Pzdr.

    PS:
    Obszerny artykuł o obsłudze DS'a pod Bascomem wrzuciłem na pv - na Twoją skrzynkę. Niestety nie nadaje się do publikacji na forum z oczywistych względów :wink: .
  • REKLAMA
  • #3 4157739
    ewsd75
    Poziom 13  
    Posty: 90
    Ocena: 20
    To jest tylko wycinek programu całość programu pochodzi z książki Autor: Marcin Wiązania " Programowanie mikrokontrolerów AVR w Bascom"
    Ja zmieniłem przeliczenie temperatury z DS1820 na DS18B20

    Dim T As Byte
    Dim TLsb as Byte
    Dim TMsb as Byte

    Odczytałem dwa bajty

    TLsb = odczyt(1)
    TMsb = odczyt(2)

    Dodałem do swojego programu

    T=TMsb + TLsb

    I podzieliłem


    T=T/6


    Próbowałem przez 16 i przez 10 i przez 5 ale wyniki są najlepsze przy podziale przez 6

    Swoją DS - kę sprawdzałem z podłączonym czujnikiem LM35 i różnica w temperaturach wynosi 1 stopień czas badabia 12 godzin odległość pomiędzy czujnikami 5 cm
  • REKLAMA
  • #4 4157845
    PioTherm
    Poziom 16  
    Posty: 134
    Pomógł: 11
    Ocena: 19
    Hejka,

    Układ DS18B20 jest konfigurowalny, a domyślnie odczyt temperatury jest chyba z rozdizelczością do 4 miejsc po przecinku (patrz dokumentacja nie pamiętam już). Ja swój układ konfiguruję np z dokładnością do jednego miejsca po przecinku z rozdzielczością 0.5 stopnia:

    1wreset
    'wybieram id układu
    1wwrite &H4e
    1wwrite 255
    1wwrite 255
    1wwrite &B00011111
    1wreset

    W dokumentacji są dokładnie opisane wagi poszczególnych bitów dla dwóch bajtów zwracanych przez czujnik. Jest tam równiez opisany sposób konfiguracji czujnika.

    Pozdro
  • REKLAMA
  • #5 4159712
    pixel7
    Poziom 24  
    Posty: 656
    Pomógł: 53
    Ocena: 160
    spróbuj tego:

    Temp:

    Deflcdchar 1 , 12 , 18 , 18 , 12 , 32 , 32 , 32 , 32
    Dim H As String * 5
    Dim Odczyt As Integer
    Dim T As Single


    1wreset
    1wwrite &HCC
    1wwrite &H44
    Waitms 250
    Waitms 250
    1wreset
    1wwrite &HCC
    1wwrite &HBE
    Odczyt = 1wread(2)
    T = Odczyt - 16
    T = T * 10
    T = T \ 16
    T = T \ 10
    Locate 1 , 1
    H = Fusing(t , "#.#")
    Lcd H ; Chr(1) ; "C"
    Return
  • #6 4362645
    gregoorr
    Poziom 18  
    Posty: 229
    Pomógł: 19
    Ocena: 34
    pawelj napisał:
    Witam
    Zaczynam trenować mikrokontrolery i programowanie. Próbowałem w asm ale jakoś ciężko - próbuje teraz w bascomie - i też ciężko niestety :(

    znalazłem jakiś przykład programu w bascom ale coś mi nie hula.
    pawełJ


    Ten Twój program nie jest pod 18b20. Podawane są różne sposoby przeliczania temperatury, sam jestem ciekawy który jest poprawny i poprawnie przelicza temperaturę. DS 18B20 jest programowany i można odczytywać temperaturę z dokładnością 0,5 0,25 0,125 i 0,0625 stopnia. Jest to 9,10,11 lub 12 bitów. Jest to opisane w pdf-ie, niestety po angielsku i nie wszystko rozumie. Mam nadzieję że kiedyś znajdzie się osoba, która to wyłoży w sposób zrozumiały na forum. Ja programuję w bascomie i jakoś sobie radzę. Program który podałeś jest dla DS1820, w przypadku DS 18B20 sprawa jest niestety bardziej skomplikowana z przeliczeniem.
REKLAMA