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
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