Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Atmega8535 bascom problem z DS18B20 + RC5 + PWM

PiotrKA1 20 Kwi 2007 20:53 2129 3
  • #1 20 Kwi 2007 20:53
    PiotrKA1
    Poziom 10  

    Proszę o wyjaśnienie przyczyny przekłamań odczytu temperatury z czujnika DS18B20, program poniżej. Najczęściej układ "kłamie" że jest 55 lub 127,5 °C Dodam że wykorzystuję odbiornik RC5 i PWM do sterowania podświetleniem LCD. Czy przekłamania mogą się brać z tego że kilka komend korzysta z tych samych timerów lub przerwań timerów? jak to obejść
    z góry dziękuję za pomoc


    Config Pinc.5 = Input ' 1wire
    Config Pinc.4 = Input ' RC5
    Config Pind.5 = Output ' wyjscie PWM
    Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 1
    Config Com1 = , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8,

    Config 1wire = Portc.5
    Config Rc5 = Pinc.4
    Config Pinc.5 = Input
    Config Pinc.4 = Input

    Config Adc = Single , Prescaler = Auto
    On Adc Adc_isr Nosave
    Enable Adc
    Enable Interrupts

    Deflcdchar 1 , 4 , 10 , 4 , 32 , 32 , 32 , 32 , 32 'znak stopnia

    Dim W As Word , Channel As Byte , Dpwm As Single , W1 As Single , Dpwm1 As Integer , Dpwm2 As Single
    Dim Wolt As Single
    Dim Ss1 As String * 12
    Dim Ss2 As String * 8
    Dim K As Byte
    Dim Rozkaz As Byte
    Dim Adres As Byte
    Dim B1 As Byte , B2 As Byte , R As Byte
    Dim T1 As Single
    Dim Tmp As String * 6
    Dim Znak As String * 1

    Declare Sub 1wr
    Declare Sub Pomtemp

    Channel = 7
    K = 0
    Compare1a = 700
    'Compare1b = 600

    Do

    '''''''''''''''''''''' ADC '''''''''''''''''''''''''''''''''''''''''''''''''''''
    Channel = 7
    Start Adc
    Idle
    Stop Adc
    Locate 1 , 1
    Ss1 = Fusing(wolt , "#.##") ' formatowanie zapisu doformatu x.xx
    Ss2 = Fusing(dpwm , "#.##")
    Lcd "U=" ; Ss1
    Locate 1 , 8
    Lcd Ss2
    Locate 2 , 1
    Lcd Rozkaz
    Locate 2 , 5
    Lcd Znak ; Tmp ; Chr(1) ; "C "
    ' Waitms 250

    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

    '''''''''''''''''''''' RC5 '''''''''''''''''''''''''''''''''''''''''''''''''''
    Getrc5(adres , Rozkaz)
    If Rozkaz <> 255 Then
    Print Rozkaz
    End If

    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

    ''''''''''''''''''''' Pomiar temperatury '''''''''''''''''''''''''''''''''''''''

    Gosub 1wr
    Gosub Pomtemp


    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

    Loop
    End

    Adc_isr:
    push r24
    in r24,sreg
    push r24
    push r25
    W = Getadc(channel)
    pop r25
    pop r24
    !Out Sreg , R24
    pop r24 '
    W = Getadc(channel)
    Wolt = W * 0.0049
    W1 = W / 100
    Dpwm = Dpwm * 0.99
    Dpwm = Dpwm + W1
    Dpwm2 = Dpwm
    Dpwm2 = Dpwm2 + 50
    Dpwm1 = Int(dpwm2)
    Pwm1a = Dpwm1
    Cls
    Return

    '/////////////////////////////////////////////////////////////////////

    Sub Pomtemp
    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(1) 'odczyt z termometru
    1wr 'podprogram 1wr
    T1 = B1 / 2
    Tmp = Fusing(t1 , "#.#" )

    End Sub


    '/////////////////////////////////////////////////////////////////////


    Sub 1wr
    'podprogram resetujacy magistrale
    1wreset

    End Sub 1wr

    0 3
  • #2 20 Kwi 2007 21:43
    scal12
    Poziom 19  

    jesli sie nie myle to żle obliczasz temperature dla DS18B20 dla DS1820 było by ok,a dla DS18B20 to chyba trzeba najpierw podzielic przez 10 a potem pomnożyć przez 16,może specjalisci sie wypowiedza na ten temat.Pozdrawiam

    0
  • #3 21 Kwi 2007 20:47
    PiotrKA1
    Poziom 10  

    Czujnik temperatury faktycznie jest typu 1820. ale odczyt jest dobrze zrobiony od strony programowej. Zauważyłem że przy taktowaniu z wewnętrznego oscylatora 8MHZ prawidłowo odczytuje temperaturę ale nie działa RC5, przy zewnętrznym kwarcu działa poprwawnie RC5 ale niepoprawnie odczyt z Dallasa
    w czym tkwi problem? zewnętrzny kwarc ma 6MHZ

    0
  • #4 23 Kwi 2007 13:57
    ziolek
    Poziom 14  

    Witam !

    DS18B20 jest fabrycznie ustawiony na rozdzielczość 0,0625 stopnia co wymaga czasu pomiaru min 750 ms, Zaś w programie jest 500 ms.

    Próbowałem u siebie DS18b20 na atmega 16, kwarc 16MHz. Korzystałem z przykładu z książki pana M.W. Niestety pokazywał błędną temp gdyż to jest przykład na DS1820.

    Więc napisałem sobie wszystko w asemblerze i działa świetnie z dokładnością do 0.1 stopnia.

    Wystarczy przeglądnoć dane katalogowe:

    DS18B20
    W MSB 4 starsze bity mówią o znaku zaś cztery młodsze to część starsza bajtu temp. W LSB cztery starsze bity to młodsza część temperatury, zaś cztery młodsze bity to część po przecinku (rozdzielczość 0.0625 stopnia). DS przesyła najpierw LSB a potem MSB zaczynając zawsze od najmniej znaczącego bitu. No i dane są w kodzie U2.

    Może się myle bo nie pisze w bascomie ale w programie odbierany jest jedynie jeden bajt temperatury. Potrzebne są dwa.


    DS1820
    Tutaj starszy bajt to znak. Młodszy to temperatura z rozdzielczością 0.5 stopnia. Ostatni bit to wartość po przecinku. Też kod U2.

    Często w programie dzielimy przez dwa aby przesunąć bity w prawo i pozbyć się wartości po przecinku.


    Więc ważne czy to DS18b20 czy DS1820

    Więc ważne który to układ. Wg mnie poniższy program jeśli to jest DS1820 obliczał będzie prawidłowo temp +. Ujemną zaś zacznie od 127 i zacznie zmniejszać w dół, gdyż nie zamieniony został kod U2 na bin.

    Nie mam dużego doświadczenia więc mogę się mylić w pewnych kwestiach.

    0