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

[tiny2313][bascom] wyswietlanie danych z ds18b20

madart 14 Sty 2009 18:02 1620 9
REKLAMA
  • #1 5998499
    madart
    Poziom 26  
    Mam z tym taki mały problemik :)
    Otóż wcześniej stosowałem przeliczanie z dodanym T = makebcd(t) po T = T /10 i temperatura była zawyżana ale wyświetlana dobrze na wyświetlaczach. Gdy osunąłem ten wpis temperatura jest rzeczywista, ale powyżej 20st tylko liczba po przecinku jest wyświetlana ok, natomiast dziesiątki zostają 1 a jedności wariują. Coś pominąłem ?

    $regfile = "attiny2313.DAT"
    $crystal = 8000000
    
    Config Portd = Output
    'Config Porta = Output
    Config Portb = Output
    
    Config Timer0 = Timer , Prescale = 256
    
    On Timer0 Mult_wysw
    
    Dim A As Byte
    Dim B As Byte
    Dim C As Byte
    Dim D As Byte
    Dim E As Byte
    Dim F As Byte
    
    Dim Nr_wysw As Byte
    
    W1 Alias Portd.5
    W2 Alias Portd.4
    W3 Alias Portd.3
    W4 Alias Portd.2
    W5 Alias Portd.1
    W6 Alias Portd.0
    
    Declare Sub Odcz
    
    Config 1wire = Portd.6
    Dim Odczyt(2) As Byte
    Dim Adres5(8) As Byte
    Dim Adres6(8) As Byte
    Dim M As Byte
    Dim T As Integer , Przecinek As Integer
    
    Dim T2 As Integer
    
    1wreset
    Adres5(1) = 1wsearchfirst()
    Adres6(1) = 1wsearchnext()
    
    Enable Interrupts
    Enable Timer0
    Load Timer0 , 94
    Rem * * * * * * * * * * * * * * * * * * *
    Rem * * * * * * * * * * * * * * * * * * *
    Rem * * * * * * * * * * * * * * * * * * *
    Rem * * * * * * * * * * * * * * * * * * *
    Do
    
    Disable Interrupts
    1wreset
       1wwrite &H55
       1wwrite Adres5(1) , 8
       1wwrite &HBE
       Odczyt(1) = 1wread(2)
    Enable Interrupts
    Gosub Odcz
    
    
    Disable Interrupts
    1wreset
       1wwrite &H55
       1wwrite Adres5(1) , 8
       1wwrite &H44
    Enable Interrupts
    
    Waitms 750
    
    A = T
    B = T2
    C = Przecinek
    
    Disable Interrupts
    1wreset
       1wwrite &H55
       1wwrite Adres6(1) , 8
       1wwrite &HBE
       Odczyt(1) = 1wread(2)
    Enable Interrupts
    Gosub Odcz
    
    
    Disable Interrupts
    1wreset
       1wwrite &H55
       1wwrite Adres6(1) , 8
       1wwrite &H44
    Enable Interrupts
    
    Waitms 750
    
    D = T
    E = T2
    F = Przecinek
    
    
    Loop
    End
    Rem * * * * * * * * * * * * * * * * * * *
    Rem * * * * * * * * * * * * * * * * * * *
    Rem * * * * * * * * * * * * * * * * * * *
    Rem * * * * * * * * * * * * * * * * * * *
    Rem * * * * * * * * * * * * * * * * * * *
    Rem * * * * * * * * * * * * * * * * * * *
    Sub Odcz:
    
       T = Makeint(odczyt(1) , Odczyt(2))
       T = T * 10
       T = T / 16
       Przecinek = T Mod 10
       T = T / 10
    
       T2 = T And &B00001111
       Shift T , Right , 4
    
    Return
    End Sub
    Rem * * * * * * * * * * * * * * * * * * *
    Rem * * * * * * * * * * * * * * * * * * *
    Rem * * * * * * * * * * * * * * * * * * *
    Rem * * * * * * * * * * * * * * * * * * *
    Mult_wysw:
    
    Load Timer0 , 50
    Set W1
    Set W2
    Set W3
    Set W4
    Set W5
    Set W6
    'Set Porta.1
    
    Select Case Nr_wysw
    
    Case 0:
    Portb = Lookup(a , Kody7seg )
    Reset W1
    
    Case 1:
    Portb = Lookup(b , Kody7seg )
    Reset W2
    'Reset Porta.1
    
    Case 2:
    Portb = Lookup(c , Kody7seg )
    Reset W3
    
    
    Case 3:
    Portb = Lookup(d , Kody7seg )
    Reset W4
    
    Case 4:
    Portb = Lookup(e , Kody7seg )
    Reset W5
    'Reset Porta.1
    
    Case 5:
    Portb = Lookup(f , Kody7seg )
    Reset W6
    
    
    End Select
    
    
    Incr Nr_wysw
    If Nr_wysw = 6 Then
    Nr_wysw = 0
    End If
    Return
    
    
    Kody7seg:
    Data 63 , 6 , 91 , 79 , 102 , 109 , 125 , 7 , 255 , 239 , 64
    
  • REKLAMA
  • #2 5998710
    zumek
    Poziom 39  
    madart napisał:
    ... Coś pominąłem ?

    Tak, zapomniałeś "pomyśleć" :P

    Zastanów się nad tymi obliczeniami.
    
       T2 = T And &B00001111
       Shift T , Right , 4
    
  • #3 5999264
    madart
    Poziom 26  
    Faktycznie to nie będzie tak działać :)
    Próbuje to rozwiązać, na razie bezskutecznie, więc wszelkie rady jak wysłupać jedności liczby w kodzie binarnym mile widziane :D
  • REKLAMA
  • #4 5999354
    zumek
    Poziom 39  
    madart napisał:
    Faktycznie to nie będzie tak działać :)
    Próbuje to rozwiązać, na razie bezskutecznie, więc wszelkie rady jak wysłupać jedności liczby w kodzie binarnym mile widziane :D

    Zrób dokładnie tak samo, jak 2 linijki wcześniej.
  • REKLAMA
  • #5 5999405
    madart
    Poziom 26  
    Właśnie na to wpadłem, T2 = T mod 10 , z tym, że na wyświetlaczu wyskakują krzaki :( . A rodzaj zmiennej ma znaczenie w tym przypadku? Bo kombinuje i z byte i integer.
  • #6 5999710
    zumek
    Poziom 39  
    madart napisał:
    A rodzaj zmiennej ma znaczenie w tym przypadku? Bo kombinuje i z byte i integer.

    Zdecydowanie ma , a także znak liczby.Jeżeli spodziewasz sie pomiaru temperatur ujemnych, to całe Twoje obliczenia temperatury i podzielenia je na "cyfry" , biorą w łeb :|
    Radzę poeksperymentować w symulatorze - można nieźle się z(a)dziwić :)
  • #7 5999818
    madart
    Poziom 26  
    Chciałbym żeby był pomiar do tych -10 ale chyba go sobie narazie odpuszcze. Ale dosyć dziwna jest ta sytuacja, tak jakby T nie było takie jak ma być :] , jedynie przecinek wychodzi ok :)
  • REKLAMA
  • #9 6005340
    madart
    Poziom 26  
    Dzięki za linki, jutro zobaczę jak się te termometry sprawują, i jak działa i2c przy kablu 1,5m :) .
    Może się uda :)
REKLAMA