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

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

hubertfab 25 Lis 2009 19:07 2893 4
REKLAMA
  • #1 7308091
    hubertfab
    Poziom 21  
    Witam !

    Napisałem taki program:
    $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
  • REKLAMA
  • REKLAMA
  • #3 7308275
    dawid512
    Poziom 32  
    Czy przypadkiem zmienna I nie zwraca ci temperatury ujemnej gdy ona występuje? Znak jest zawarty w drugim bajcie => patrz datasheet.
  • REKLAMA
  • #4 7398785
    peter507
    Poziom 16  
    
     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 7399888
    ewsd75
    Poziom 13  
    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
REKLAMA