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

ds18b20 wynik w jednej zmiennej

05 Kwi 2007 14:14 1887 2
  • Poziom 12  
    Tworzę sterownik który będzie operował na 4szt DS18b20
    Program jest pisany w bascom
    Czy w bascomie można zadeklarować tablicę dwu wymiarową
    Tablica (4)(8)
    Dla czego przy odczycie danych muszę ponownie resetować magistralę i podawać numer seryjny układu. Podobno po wysłaniu za pierwszym razem numeru układu inne milczą a wskazany nadsłuchuję
    1wreset
    1wwrite &H55
    1wwrite Adres(index ) , 8
    1wwrite &H44
    Waitms 750
    1wreset ‘Chodzi mi o te powtórne resetowanie itp.
    1wwrite &H55
    1wwrite Adres(index) , 8
    1wwrite &HBE

    Rd(1) = 1wread(2)
    Rdp = Rd(2)
    Shift Rdp , Left , 8
    Rdp = Rdp + Rd(1)
    T(ktory) = Rdp / 16

    Czy jest możliwe najpierw wysłanie do wszystkich czujników polecenia mierzenia temperatury a po odczekaniu jednego czasu po kolei odczytanie temperatur tak ja to próbowałem zrobić w przykładzie.

    Czy mógł by ktoś podać mi optymalny kod do konwersji temperatury dla DS18B20. Większość jakie znalazłem na forum to takie które przechowują temperaturę mierzoną w 2 danych byte i trzeciej jaki ma znak temperatura. Jest to owszem dobry sposób do wyświetlenia ale w przypadku gdy chcę zmierzoną temperaturę podawać porównaniu jest to nie eleganckie.
    Chciał bym mieć zmierzoną temperaturę w zmiennej ze znakiem i jednym miejscem dziesiętnym oraz brak nie wyświetlania minusa dla temperatury do -1

    $regfile = "m8def.dat"
    $crystal = 8000000


    Config Lcd = 16 * 2 'konfiguracja typu wyświetlacza 'LCD
    Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portd.4 , E = Portd.3 , Rs = Portc.1
    Config 1wire = Pind.1


    Const Test = 1


    Dim Iloscczuj As Byte 'Ilosc wykrytych czujników
    Dim Ktory As Byte 'Ktory czujnik będzie odczytywany
    Dim Index As Byte 'Index do tablicy z adresami czujników

    Declare Sub Oblindex 'Funkcja do obliczania indeksu w tablicy adresu dla danego czujnika





    Dim Adres(24) As Byte


    Iloscczuj = 1wirecount() 'wykrywanie ilości czujników

    Lcd "Wykryto : " ; Iloscczuj
    Wait 4

    Adres(1) = 1wsearchfirst()


    Dim I As Byte
    For I = 9 To 24 Step 8
    Adres(i) = 1wsearchnext()
    Next I
    Cls
    Lcd "Podaje Adresy"

    For I = 1 To 24 Step 8

    Cls '... i wyświetlamy ten adres skladający się z ośmiu bajtów
    Lcd Adres(i) ; " " ; Adres(i + 1) ; " " ; Adres(i + 2) ; " " ; Adres(i + 3)
    Lowerline
    Lcd Adres(i + 4) ; " " ; Adres(i + 5) ; " " ; Adres(i + 6) ; " " ; Adres(i + 7)
    Cursor Off
    Wait 3
    Next I


    Declare Sub 18b20

    Declare Sub 18b20_g
    Declare Sub 18b20_d

    Dim Rd(2) As Byte ' zmienna tablicowa do odczytu wyniku przetwarzania
    Dim Rdp As Integer ' zmienna integer do ułożenia odczytanych danych
    Dim T(3) As Single ' obliczona temperatura


    Cls


    Do
    #if Test
    Ktory = 1
    Call Oblindex
    Call 18b20
    Ktory = 2
    Call Oblindex
    Call 18b20
    Ktory = 3
    Call Oblindex
    Call 18b20
    #else

    For Ktory = 1 To 3
    Call Oblindex
    Waitms 100

    Next Ktory

    Waitms 750

    For Ktory = 1 To 3
    Call Oblindex

    Call 18b20_d
    Next Ktory

    #endif


    Cls
    Lcd "Temp : " ; T(1)
    Locate 2 , 1
    Lcd T(2) ; " " ; T(3)

    Loop

    Sub 18b20
    1wreset
    1wwrite &H55
    1wwrite Adres(index ) , 8
    1wwrite &H44
    Waitms 750
    1wreset
    1wwrite &H55
    1wwrite Adres(index) , 8
    1wwrite &HBE

    Rd(1) = 1wread(2)
    Rdp = Rd(2)
    Shift Rdp , Left , 8
    Rdp = Rdp + Rd(1)
    T(ktory) = Rdp / 16
    End Sub




    Sub 18b20_g
    1wreset
    1wwrite &H55
    1wwrite Adres(index ) , 8
    1wwrite &H44
    End Sub


    Sub 18b20_d
    1wreset
    1wwrite &H55
    1wwrite Adres(index) , 8
    1wwrite &HBE

    Rd(1) = 1wread(2)
    Rdp = Rd(2)
    Shift Rdp , Left , 8
    Rdp = Rdp + Rd(1)
    T(ktory) = Rdp / 16
    End Sub

    Sub Oblindex '1 +(8 *(Ktory -1))
    Index = Ktory - 1
    Index = 8 * Index
    Index = Index + 1
    End Sub
  • Pomocny post
    Poziom 39  
    LichyiChydy napisał:
    ...Czy w bascomie można zadeklarować tablicę dwu wymiarową

    Nie :!:
    LichyiChydy napisał:

    Dla czego przy odczycie danych muszę ponownie resetować magistralę i podawać numer seryjny układu...

    Bo tak są skonstruowane - patrz tabelki w PDF-ku :)
    LichyiChydy napisał:

    Czy jest możliwe najpierw wysłanie do wszystkich czujników polecenia mierzenia temperatury ...

    Jasne ;)
    Code:

    '...
    1wreset
    If Err=0 Then
       1wwrite SKIP ROM
       1wwrite CONVERT T
    Else
       'coś nie tak :(
    End If
    '...

    LichyiChydy napisał:
    Chciał bym mieć zmierzoną temperaturę w zmiennej ze znakiem i jednym miejscem dziesiętnym oraz ...

    Na tym forum , jest tego ... po prostu "zatrzęsienie" :D
    https://www.elektroda.pl/rtvforum/viewtopic.php?t=573268#2963507
    LichyiChydy napisał:

    ... brak nie wyświetlania minusa dla temperatury do -1

    Tego fragmentu zdania , nie jestem w stanie pojąć :(

    Piotrek
  • Poziom 12  
    Code:
    Tego fragmentu zdania , nie jestem w stanie pojąć  

    I tu się nie dziwię. Za co przepraszam i postaram się wyjaśnić co miałem na myśli
    W Czasie przeszukiwania forum znalazłem taki kod konwersji

    Code:
    T = Makeint(odczyt(1) , Odczyt(2))                          'zrób z dwóch bajtów jednego integer'a
    
    Tspr = T                                                    'teraz sprawdzam jaki jest wynik
    'interesuje nas tylko czy jest dodatni czy ujemny
    T = Abs(t)                                                  'teraz, aby uniknąć późniejszego wyświetlania dwóch minusów przy temperaturze
    '-55stC do -1... , wsadzam zmienną T w modul, tak, żeby zawsze byla dodatnia
    T = T * 10 : T = T / 16                                     'teraz jeszcze dla poprawnego wyświetlania temperatury muszę
    'pomnożyć przez 10 i podzielić przez 16
    Przecinek = T Mod 10                                        'przecinek otrzymuje wartość części dziesiętnych
    T = T / 10                                                  'a T jeszcze dzielę przez 10

    'zapytasz, czy prościej by się nie dalo...
    'owszem, dalo by się
    'chociażby tak
    '
    'T = Makeint(odczyt(1) , Odczyt(2))
    'T = T * 10 : T = T / 16
    'Przecinek = T Mod 10
    'T = T / 10
    '
    to jednak pewną nieścisłość
    'w zakresie temperatury od -1 do 0 °C nie byłby wyświetlany znak minus
    'zastanów się dlaczego ;)

    Czy mi ktoś odpowie dlaczego nie było by tego znaku.


    Cytat:
    to jednak pewną nieścisłość
    'w zakresie temperatury od -1 do 0 °C nie byłby wyświetlany znak minus
    'zastanów się dlaczego


    I tu są moje pytania dlaczego w zmiennej temperatury nie przechowuje się wartości ujemnej tylko tworzy się dodatkową zmienną i jeszcze na dodatek tworzy się te instrukcje sprawdzania czy wyświetlić znak . Przecież jeżeli byłą by zmienna z ujemna przy wartości minusowej ułatwiło by dalsze porównanie zmiennej
    Code:
    Cls
    
    If Tspr < 0 Then                                            'jeśli zmienna pomocnicza jest ujemna to wyświetl przed wartością temperatury minus
    Lcd "-"
    End If
    Locate 1 , 2
    Lcd T ; "," ; Przecinek                                     'wyświetl calkowitą wartość temperatury i częś dziesiętną
    Cursor Off
    Wait 1

    Osobiście najbardziej podoba mi się kod ten poniżej
    Code:
    $regfile = "2313def.dat" 
    
    $crystal = 16000000
    Config 1wire = Portb.0
    Dim T As Integer , Stt As String * 6
    Cls
    Do
       1wreset
       1wwrite &HCC
       1wwrite &H44
       Waitms 800
       1wreset
       1wwrite &HCC
       1wwrite &HBE
       T = 1wread(2)
       T = T * 10
       T = T / 16
       Stt = Str(t)
       Stt = Format(stt , " 0.0")
       Home
       Lcd Stt;"   ";
    Loop

    Czy przy tym formacie nie ma problemu z temperaturami ujemnymi jej pełnym zakresie

    W czasie przeglądanie forum znalazłem wypowiedz że 1Wire nie zawsze pracuje przy Kwarcu 16MHz.
    Czy to prawda jeżeli tak to jaki powinem zastosować Kwarc aby transmisia przebiegała prawidłowo. Również wspomnę że będzie też komunikacja przez RS-232

    Czy dane z tabeli do sprawdzenia poprawości odczytu dla DS1820 są takie same jak dla DS18B20

    Code:
    Suma:
    
       Crc = 0
       For I = 1 To 9
          Dstemp = Crc Xor Bd_ds1820(i)
          Crc = Lookup(dstemp , Crc8)
       Next
    Return

    Crc8:
    Data 0 , 94 , 188 , 226 , 97 , 63 , 221 , 131 , 194 , 156
    Data 126 , 32 , 163 , 253 , 31 , 65 , 157 , 195 , 33 , 127
    Data 252 , 162 , 64 , 30 , 95 , 1 , 227 , 189 , 62 , 96
    Data 130 , 220 , 35 , 125 , 159 , 193 , 66 , 28 , 254 , 160
    Data 225 , 191 , 93 , 3 , 128 , 222 , 60 , 98 , 190 , 224
    Data 2 , 92 , 223 , 129 , 99 , 61 , 124 , 34 , 192 , 158
    Data 29 , 67 , 161 , 255 , 70 , 24 , 250 , 164 , 39 , 121
    Data 155 , 197 , 132 , 218 , 56 , 102 , 229 , 187 , 89 , 7
    Data 219 , 133 , 103 , 57 , 186 , 228 , 6 , 88 , 25 , 71
    Data 165 , 251 , 120 , 38 , 196 , 154 , 101 , 59 , 217 , 135
    Data 4 , 90 , 184 , 230 , 167 , 249 , 27 , 69 , 198 , 152
    Data 122 , 36 , 248 , 166 , 68 , 26 , 153 , 199 , 37 , 123
    Data 58 , 100 , 134 , 216 , 91 , 5 , 231 , 185 , 140 , 210
    Data 48 , 110 , 237 , 179 , 81 , 15 , 78 , 16 , 242 , 172
    Data 47 , 113 , 147 , 205 , 17 , 79 , 173 , 243 , 112 , 46
    Data 204 , 146 , 211 , 141 , 111 , 49 , 178 , 236 , 14 , 80
    Data 175 , 241 , 19 , 77 , 206 , 144 , 114 , 44 , 109 , 51
    Data 209 , 143 , 12 , 82 , 176 , 238 , 50 , 108 , 142 , 208
    Data 83 , 13 , 239 , 177 , 240 , 174 , 76 , 18 , 145 , 207
    Data 45 , 115 , 202 , 148 , 118 , 40 , 171 , 245 , 23 , 73
    Data 8 , 86 , 180 , 234 , 105 , 55 , 213 , 139 , 87 , 9
    Data 235 , 181 , 54 , 104 , 138 , 212 , 149 , 203 , 41 , 119
    Data 244 , 170 , 72 , 22 , 233 , 183 , 85 , 11 , 136 , 214
    Data 52 , 106 , 43 , 117 , 151 , 201 , 74 , 20 , 246 , 168
    Data 116 , 42 , 200 , 150 , 21 , 75 , 169 , 247 , 182 , 232
    Data 10 , 84 , 215 , 137 , 107 , 53