Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[ATmega8][BASCOM][DS18B20] Odczyt temperatury poniżej zera.

hubertfab 25 Nov 2009 19:07 2668 4
  • #1
    hubertfab
    Level 21  
    Witam !

    Napisałem taki program:
    Code:
    $regfile = "m8def.dat"
    
    $crystal = 8000000

    Config Portd = Output : Portd = 255
    Config Portb = Output : Portb = 255

    K1 Alias Portd.0
    K2 Alias Portd.1
    K3 Alias Portd.2
    K4 Alias Portd.3
    K5 Alias Portd.4
    K6 Alias Portd.5
    K7 Alias Portd.6
    K8 Alias Portd.7

    Config 1wire = Portc.5

    Dim Nr_kol As Byte , A As Byte , B As Byte , Znak As Bit
    Dim X As Byte , P As Byte , I As Integer


    Config Timer0 = Timer , Prescale = 256
    On Timer0 Multi

    Load Timer0 , 50
    Enable Interrupts
    Enable Timer0

    Do

    1wreset
    1wwrite &HCC
    1wwrite &H44
    Wait 2
    1wreset
    1wwrite &HCC
    1wwrite &HBE
    I = 1wread(2)
    I = I / 16

    If I > 99 Then I = 99
    If I < 0 Then I = 0



    Loop





    Multi:
    A = 0
    B = 0

    X = I

    If X > 9 Then
    Do
    X = X - 10
    Incr A
    Loop Until X < 10
    End If

    If X <> 0 Then
    Do
    X = X - 1
    Incr B
    Loop Until X =< 0
    End If

    Load Timer0 , 50

    Portd = 255

    Select Case Nr_kol
    Case 2:
    K1 = 0
    Portb = Lookup(a , 1kol)
    Case 3:
    K2 = 0
    Portb = Lookup(a , 2kol)
    Case 4:
    K3 = 0
    Portb = Lookup(a , 3kol)
    Case 5:
    K5 = 0
    Portb = Lookup(b , 1kol)
    Case 6:
    K6 = 0
    Portb = Lookup(b , 2kol)
    Case 7:
    K7 = 0
    Portb = Lookup(b , 3kol)

    End Select

    Incr Nr_kol
    If Nr_kol > 7 Then Nr_kol = 0

    Return


    1kol:
    Data &B11100000 , &B11111111 , &B11101000 , &B11101010 , &B11100011 ,
    Data &B11100010 , &B11100000 , &B11100111 , &B11100000 , &B11100010


    2kol:
    Data &B11101110 , &B11110111 , &B11101010 , &B11101010 , &B11111011 ,
    Data &B11101010 , &B11101010 , &B11101111 , &B11101010 , &B11101010

    3kol:
    Data &B11100000 , &B11100000 , &B11100010 , &B11100000 , &B11100000 ,
    Data &B11101000 , &B11101000 , &B11100000 , &B11100000 , &B11100000


    Steruje on matrycą led o organizacji punktów 5 wierszy oraz 8 kolumn.

    Mój problem polega na tym, że nie wiem jak przerobić powyższy kod tak aby odczytywał ujemne temperatury.
    Chodzi o to, żeby: np. Jak jest -15° to zmienna "znak" przyjmuje wartość 0 a zmienna "I" przyjmuje wartość 15. Z wyświetleniem sobie poradzę.

    PS: Jeśli ktoś zauważy jakiś błąd w programie proszę napisać... :D
  • #3
    dawid512
    Level 32  
    Czy przypadkiem zmienna I nie zwraca ci temperatury ujemnej gdy ona występuje? Znak jest zawarty w drugim bajcie => patrz datasheet.
  • #4
    peter507
    Level 16  
    Code:

     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 / 16
      Temp = Fusing(t1 , "#.#")



    Najprostszy jaki może być. Układ sam odczytuje ujemną temperaturę. W tym kodzie działa.
  • #5
    ewsd75
    Level 12  
    Witam
    Do odczytu minusowych temperatur stosuję taki kod:
    1wreset
    1wwrite &HCC
    1wwrite &H44
    Wait 1
    1wreset
    1wwrite &HCC
    1wwrite &HBE

    Temp(1) = 1wread()
    Temp(2) = 1wread()
    1wreset
    If Temp(2) >= 248 Then
    Temp(1) = Temp(1) - 255
    Temp(2) = Temp(2) - 255
    Msb_zk = "-"
    Else
    Msb_zk = "+"
    End If
    Tempp1 = Temp(1) / 16
    Tempp2 = Temp(2) * 16
    Lsb_tempp1 = Tempp1 + Tempp2