Obsługa DS18x20


10
Ocena: None Średnia: 10 (1 głosujący)

Zawarte fragmenty programów dotyczą czujników DS18S20 i DS18B20. Procedury obsługi tych układów nie różnia się od siebie w prostych zastosowaniach, poza sposobem obliczania temperatury na podstawie odczytanych wartości z rejestrów czujników.

Język Bascom AVR


Odczyt 8 bajtów numeru seryjnego DS18S20 lub DS18B20 gdy na magistrali jest tylko jeden układ. Numer seryjny zostanie zapisany do zmiennej tablicowej Ds:
Config 1wire = Pind.7
Dim Ds(8) As Byte
 
1wreset
1wwrite &H33
Ds(1) = 1wread(8):

Uruchomienie konwersji temperatury przez wszystkie czujniki podłączone do magistrali 1-wire. Po wydaniu rozkazu konwersji należy odczekać pewien czas (max 750ms) przed przystąpieniem do odczytu temperatury:

Config 1wire = Pind.7
 
1wreset
1wwrite &HCC
1wwrite &H44

Odczyt zawartości dwóch pierwszych rejestrów układu DS18x20, zawierających informację o wartości temperatury w przypadku gdy na magistrali jest tylko jeden czujnik.

...
1wreset
1wwrite &HCC
1wwrite &HBE
 
Lsb = 1wread():
Msb = 1wread():
1wreset

Dla większej ilości czujników podłączonych do jednej magistrali odczytujemy dane z jednego układu wykorzystując jego numer seryjny odczytany wcześniej i zapisany do zmiennej tablicowej Ds(8 bajtów).

...
1wreset
1wwrite &H55
1wwrite Ds(1) , 8
1wwrite &HBE
 
Lsb = 1wread():
Msb = 1wread():
1wreset

Po odczytaniu bajtów Msb i Lsb wykonujemy oblicznia temperatury.
Układ DS18S20:

Dim Temp As Single
...
If Msb = 0 Then
  Temp = Lsb / 2
Else
  Lsb = Not Lsb
  Lsb = Lsb +1
  Temp = Lsb/2
  Temp = Temp * (-1)
End If

Układ DS18B20:

Dim Temp As Single
Dim Tempa As Integer
...
 
Tempa = Msb * 256
Tempa = Tempa + Lsb
 
If Msb.7 = 0 Then
   Temp = Tempa / 16
Else
  Tempa = Not Tempa
  Tempa = Tempa +1
  Temp = Tempa / 16
  Temp = Temp * (-1)
End If

Poniżej przedstawiony jest cały prosty program testowy do obsługi dwóch czujników (DS18S20 i DS18B20) podłączonych na jednej magistrali. Całość została uruchomiona na Płytce Testowej opisanej w dziale projekty. Wskazania temperatury wyświetlane są na wyświetlaczu LCD

'***********************************************
'Konfiguracja AVR
'***********************************************
$regfile = "m162def.dat"
$crystal = 16000000
 
$baud = 2400
 
Config Porta = 255
Porta = 255
Config Portb = 255
Portb = 255
Config Portc = 255
Portc = 255
Config Portd = 255
Portd = 255
Config Porte = 255
Porte = 255
 
'Config Scl = Portd.6
'Config Sda = Portd.7
'I2cinit
 
Config 1wire = Pind.7
 
Config Lcdpin = Pin , Db4 = Porta.5 , Db5 = Porta.4 , Db6 = Porta.3 , Db7 = Porta.2 , E = Porta.0 , Rs = Porta.1
Config Lcd = 20 * 2
Cls
Cursor Off Noblink
 
'Config Int0 = Falling
'Enable Int0 : On Int0 Przerw_zewn
 
'Config Timer0 = Timer , Prescale = 64
'Enable Timer0 : On Timer0 Przerwanie1
 
'Config Timer1 = Timer , Prescale = 8
'Enable Timer1 : On Timer1 Przerwanie2
 
Enable Interrupts
'///////////////////////////////////////////////
 
'***********************************************
'Zmienne
'***********************************************
Dim Lsb As Byte
Dim Msb As Byte
Dim Tempa As Single
Dim Ds1(8) As Byte , Ds2(8) As Byte
Dim Tekst1 As String * 10
Dim Tekst2 As String * 10
'///////////////////////////////////////////////
 
Lcd "test DS18B20"
Wait 1
 
'Numery wpisane na sztywno
Ds2(1) = 40
Ds2(2) = 55
Ds2(3) = 181
Ds2(4) = 1
Ds2(5) = 1
Ds2(6) = 0
Ds2(7) = 0
Ds2(8) = 207
 
Ds1(1) = 16
Ds1(2) = 171
Ds1(3) = 224
Ds1(4) = 167
Ds1(5) = 0
Ds1(6) = 8
Ds1(7) = 0
Ds1(8) = 220
 
Do
  1wreset
 
  1wwrite &HCC
  1wwrite &H44
  Waitms 250
  Waitms 250
 
  1wreset
 
  1wwrite &H55
  1wwrite Ds2(1) , 8
  1wwrite &HBE
 
  Lsb = 1wread():
  Msb = 1wread():
 
  Tempa = Msb * 256
  Tempa = Tempa + Lsb
  Tempa = Tempa / 16
  Tekst1 = Fusing(tempa , "#.##")
 
 
  1wreset
 
  1wwrite &H55
  1wwrite Ds1(1) , 8
  1wwrite &HBE
 
  Lsb = 1wread():
  Msb = 1wread():
 
  Tempa = Lsb / 2
  Tekst2 = Fusing(tempa , "#.#")
 
  Cls
  Lcd "DS18B20= " ; Tekst1
  Lowerline
  Lcd "DS18S20= " ; Tekst2
Loop
End




Portret użytkownika mordacz222

Witam Siedzę nad tym dobrą

Witam

Siedzę nad tym dobrą godzinę i nie rozumiem po co są te obliczenia dla np.: DS18B20

Polecenie

tempa=not tempa
tempa=tempa/16
tempa=tempa*(-1)
rozumiem i się zgadzam ale w takim razie po co całą reszta, siedzę przy windowsowym kalkulatorze i nigdy nie wychodzi to co by miało, no chyba że się pomyliłeś.

Możesz mi napisać po co to robisz?

Portret użytkownika mirley

Re; DS18B20

Nie ma tu pomyłki, poniższy fragment wykonuje się gdy temperatura jest ujemna (odpowiednia wartość w starszym bajcie)

  Tempa = Not Tempa
  Tempa = Tempa +1
  Temp = Tempa / 16
  Temp = Temp * (-1)

Pierwsze dwie linijki to klasyczna zamiana z kodu U2(Uzupełnień do dwóch) na kod binarny, kolejna linijka dzieli przez 16 aby uzyskac zapis w stopniach, potem zmiana znaku na ujemna wartość bo wiemy ze jest ujemna z wcześniejszych przesłanek a odczytujemy wartość bezwzględną

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika mordacz222

Przepraszam jeśli się mylę

Przepraszam jeśli się mylę ale np temp. +25 to przy 9 bitach naprawdę jakby +50 dlatego dzielone przez 2 czyli binarnie 00110010 a polecenie not da wynik 11001101 czyli 205/2 czyli 102,5 stopnia czyli gdzie popełniam błąd, i jeszcze pytanie jak przełączyć 18B20 na 9bit.

Portret użytkownika mirley

Re: DS18B20

Niestety nie wiem jak przełaczyć DS'a w tryb 9 bitów bo nigdy nie było mi to potrzebne.... raczej napewno trzeba wpisać do rejestru odpowiednia wartość na podstawie karty katalogowej

Jeśli chodzi o te obliczenia to tak zaplątałeś że nie mogę zrozumieć o to Ci chodzi. Wartość policzyłem na podstawie karty katalogowej

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika green

DS1820

Mam taki zabytek, który wciąż nieźle działa ale wymaga peceta. Jak zrobić odczyt temperatury 0-99 C i przy użyciu at89c2051 wyświetlać wynik na dwóch wyświetlaczach LED (bez części dziesiętnych)?

Ewentualnie jakiś alarm przy spadku temperatury poniżej np. 40 C (piec CO).

Pozdrawiam

Portret użytkownika mirley

Re: Termometr

Program masz wyżej a w projektach mam gotowe dwa termometry z wyświetlaczem LED

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika mordacz222

Chodziło mi o to że 00110010

Chodziło mi o to że 00110010 oznacza 50/2 czyli 25 stopni a polecenie not zamieni każdy bit w bajcie czyli da wartość 11001101 czyli 205/2 czyli 102,5 stopnia więc gdzie popełniam błąd???

Portret użytkownika mirley

Re: DS18S20

Nie zrozumiałem wcześniej co ci chodzi ale teraz już wiem..... Błąd jest tu że negujesz wartości temperatury gdy jest ona dodatnia. To przeliczenie z negacją działa jak liczba jest ujemna zapisana w kodzie U2, robiąc z liczby U2 liczbę dodatnią binarną.

If Msb = 0 Then     'jesli temperatura większa od zera to:
  Temp = Lsb / 2    
Else                'jeśli mniejsza od zera to:
  Lsb = Not Lsb      
  Lsb = Lsb +1
  Temp = Lsb/2
  Temp = Temp * (-1)
End If

Dla przykładu jeśli temperatura jest -25 stopni to ds18B20 ma wartości w dwóch bajtach 1111 1111 1100 1110, pierwszy bajt niesie informacje o znaku a drugi po negacji dodaniu 1 i podzieleniu przez 2 daje liczbę 25, a że jest to -25 to wiemy z pierwszego bajtu który zawiera same 1. Dla DS18B20 nie wszystkie bity starszego bajtu są 1 i sprawdzam tylko pierwszy bit bo inne kombinacje sa niedopuszczalne z punktu widzenia samego DS'a.

popatrz na tabelkę w karcie katalogowej

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika mordacz222

Dziękuję bardzo teraz

Dziękuję bardzo teraz popatrzyłem do datasheet i już to zrozumiałem, ale jeszcze pytanko po co dodawać 1?

Portret użytkownika mirley

Re: U2

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika green

DS18(S)20 - temperatura ujemna

Else
  Lsb = Not Lsb
  Lsb = Lsb +1
  Temp = Lsb/2
  Temp = Temp * (-1)
End If

A nie prościej byłoby:

Else
  Lsb = 256 - Lsb
  Temp = Lsb/2
End If

Poza tym nawiązuję do mojego wcześniejszego postu: czy obsługa DS1820 (taki mam) i DS18S20 jest taka sama ?

Portret użytkownika mirley

Re: DS18S20

Ds18S20 to chyba to samo co DS1820.... do pdf-a popatrz na tabelkę z przeliczeniem temperatury.

Co do fragmentu przeliczającego temperatury to jest wiele sposobów żeby to zrobić....Raz wieki temu napisałem te linijki i teraz zawsze wklejam do swoich programów, nawet za bardzo nie zastanawiam się nad tym. Z tego co patrze to twój kod tez poprawnie konwertuje ujemne temperatury... tylko było by lepiej gdyby dać Lsb-256, wtedy wyjdzie z minusem (jak zmienna będzie integer)

Ps. kody źródłowe należy umieszczać w odpowiednim znaczniku, czasami poprawiam wpisy a czasami kasuje więc dostosuj się do regulaminu

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika gosc

zamiana ds1820 na 18b20

Witam Cię Mirley
Wiem że terminaż masz napięty, ale może mógłbyś pomóc??
mam gotowy soft do sterownika akwariowego w którym odczyt temp. jest z czujnika 1820 czy mogłbyś zerknąć jak zamienić go na 18b20 ponieważ takie czujniki mi przysłano. Czytałem trochę ale nic z tego nie rozumię coś się przelicza inaczej.
pozdrawiam

oto fragment kodu:

Sub Read1820
   Waitms 250
   Waitms 100
   1wreset
   1wwrite &HCC
   1wwrite &HBE
   Bd(1) = 1wread(9)
   1wreset
   Tmp = Bd(1) And 1
   If Tmp = 1 Then Decr Bd(1)
   T = Makeint(bd(1) , Bd(2))
   T = T * 50 : T = T - 25 : T1 = Bd(8) - Bd(7) : T1 = T1 * 100
   T1 = T1 / Bd(8) : T = T + T1 : T = T / 10
   X = T / 10
End Sub

Portret użytkownika rafliczek22

1wreset 1wwrite &hcc 1wwrite

1wreset
1wwrite &hcc
1wwrite &h44 
wait 1
1wwrite &hcc
1wwrite &hbe
Lsb = 1wread():
Msb = 1wread():
1wreset
 
temperatura=makeint(lsb,msb)
temperatura=temperatura/16

To co podałem to bez liczb po przecinku, chyba że będzie to zmienna single, inaczej jesli nie chcesz miejsc po przecinku to word.
Ten kod co podałeś jest jakiś "niedziałający", nie ma prawa działać.

Portret użytkownika farmer

3 szt ds18b20 na różnych portach

Pytanie dla bardziej doświadczonych niż ja. Potrzebuję uruchomić trzy ds18b20 na różnych pinach. Jak powinna wyglądać konfiguracja tych pinów w komendzie config port. Piny mają być wejściami, wyjściami z podciąganiem czy bez, czyli reasumując jak skonfigurować te piny ? Oczywiście chodzi o bascom.

Portret użytkownika mirley

Re: 1-wire

Po pierwsze nigdy nie robiłem więcej niz jednego 1-wire bo wymyślono to po to aby była jedna taka magistrala. Jeśli zależy Ci na tym aby odpalić trzy magistrale niezależne to będziesz musiał za każdym razem konfigurować 1-wire za pomocą "Config 1wire = Pinx.y", tak mi się przynajmniej wydaje. Co do ustawienia typu wyprowadzenia to i tak polecenia config 1-wire ustawia sobie pin tak jak mu potrzeba. Możesz spróbować ustawić jako wejścia na początku a potem config 1-wire na jeden z pinów. Przed każdym wywołaniem innej magistarli będzie trzeba zrobić config 1-wire na inny pin. Popróbuj coś bo jak mówiłem takich rzeczy nigdy do niczego nie potrzebowałem

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika farmer

1-Wire

Dzięki za podpowiedź sprawdzę ten sposób. Wiem że założenia magistrali 1-Wire są trochę inne lecz ostatnio miałem taką sytuację że po awarii jednego z ds sterownik pieca co dostał szału i grzał aż się przygotował (wszystkie odczyty ds między 25 a 35 stopni C ). Chcę na przyszłość uniknąć takiej rzadkiej sytuacji a znalazłem w pomocy bascom wzmiankę że można do komend obsługi 1-Wire dodać nr pinu np. 1wreset port,pin lecz nie ma wzmianki czy i jak ten pin ustawić. Google również skąpi informacji. Jeszcze raz dzięki za odzew.

Portret użytkownika beleco

podaj mi maila to podeśle ci

podaj mi maila to podeśle ci kod od sterownika wykorzystującego 2 termometry DS18B20
obsługuje on 2 termometry niezaleznie podłączone do 2 odobnych wejść może ci się przyda.

-

Max

Portret użytkownika farmer

Byłoby super. Mail do mnie:

Byłoby super. Mail do mnie: . Z góry dzięki.

Portret użytkownika mirley

Re: Ds18B20

Wstawcie kod tutaj na strone.... klikając na wstawianie obrazka można pod przyciskiem "browse" wrzucać różne pliki, nie tylko foto

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika farmer

ds18b20

Kompletny kod jest dość długi. Postaram się wybrać te części które odpowiadają za obsługę magistral i wystawię na forum. Oczywiście jeżeli kolega beleco nie wystosuje sprzeciwu ;). Pzdr.

Portret użytkownika nowygosc

DS18b20

witam
jestem bardzo ciekawy jak wygląda obsługa ds na 2 portach
możesz to pokazać

Portret użytkownika beleco

nie moge sobie poradzic z

nie moge sobie poradzic z wklejeniem tego kodu na strone, chetnych prosze o adres to przesle emialem

-

Max

Portret użytkownika mirley

Re: Kod

Klikasz przycisk "BAS" w edytorze, i między znaczniki gb wklejasz kod jako zwykły tekst (bascom otwarty w edytorze tekstowym, np notatnik). Mail: elektronika_małpa_firlej.org

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika farmer

ds18b20

'program obslugi termometru DS18B20
'obsługuje on 2 termometry niezaleznie podłączone do 2 odobnych wejść
'T1 podłączony do wejścia IN1
'T2 podłączony do wejścia IN2
 
'niestety ale musi być podłączone zasilanie do układu DS18B20
' na zasilaniu pasozytniczym układ niestety nie che pracować
 
 
 
$regfile = "m8def.dat"                                      'informuje kompilator o pliku
      'dyrektyw mikrokontrolera
$crystal = 8000000                                          'informuje kompilator
      'o częstotliwości oscylatora
      'taktującego mikrokontroler
 
 
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 = Portd.2       'konfiguracja linii
      'mikrokontrolera, do ktˇrych
      'do-?czono wyťwietlacz
      'LCD
 
 
Deflcdchar 1 , 4 , 10 , 4 , 32 , 32 , 32 , 32 , 32          'znak stopnia
Deflcdchar 2 , 32 , 32 , 32 , 4 , 10 , 17 , 31 , 32         ' delta
 
Dim T1 As Single
Dim T2 As Single
Dim B1 As Byte , B2 As Byte , R As Byte
Dim Tmp As String * 6
Dim Znak As String * 1
 
Dim T1b As Single
Dim T2b As Single
Dim Histereza As Word
Dim Histereza_e As Word
Dim Delta As Single
Dim Alarm1 As Single
Dim Alarm_pom As Single
 
 
Dim Tmax As Byte
Dim Tmax1 As Single
Dim Tmax_e As Byte
Dim Sekundy As Word
Dim Hist_off As Byte
Dim Hist_off_e As Byte
 
 
 
Dim B1b As Byte , B2b As Byte
Dim Tmpb As String * 6
Dim Znakb As String * 1
 
 
Up_sw Alias Pinb.5                                          ' Przycisk "UP"
Down_sw Alias Pinb.4                                        ' Przycisk "DOWN"
Ok_sw Alias Pinb.3                                          ' Przycisk "ENTER"
Buzer Alias Portb.1                                         ' Wyjście ( Buzer )
 
Set Portb.5                                                 'ustawiam pstryki na stan wysoki
Set Portb.4
Set Portb.3
 
 
Config Portb.0 = Output
Config Portb.1 = Output
Config Portb.2 = Output
 
 
 
Config Pinc.0 = Input
Config Pinc.1 = Input
 
 
R = &HFF
Declare Sub 1wr                                             'podprogram resetujacy magistrale 1w
Cursor Off
Cls
 
Readeeprom Histereza_e , 10
Histereza = Histereza_e
If Histereza > 150 Then Histereza = 15
Alarm1 = Histereza
 
Readeeprom Tmax_e , 20
Tmax = Tmax_e
If Tmax > 150 Then Tmax = 95
Tmax1 = Tmax
 
Readeeprom Hist_off_e , 30
 
Hist_off = Hist_off_e
If Hist_off > 100 Then Hist_off = 5
 
 
 
 
Lcd "Sterownik"
Lowerline
Lcd "Kolektora sl."
Wait 3
Cls
 
 
 
 
 
 
 
Do
 
 
'xxxxxxxxxxxxxxx procedura ustawiania xxxxxxxxxxxxxxxxxxxx
 
If Up_sw = 0 And Down_sw = 0 Then
 
 
Cls
Lcd "Ustawiania"
Wait 1
 
'------------------- ustawianie delty --------------------
 
Cls
Lcd "roznica " ; Chr(2) ; "= T1-T2"
Lowerline
Do
 
Locate 2 , 1
Lcd Chr(2) ; ":" ; Histereza ; " "
      If Up_sw = 0 Then
            Incr Histereza
            Gosub Beep
            If Histereza > 125 Then Histereza = 125
            Waitms 400
      End If
      If Down_sw = 0 Then
            Decr Histereza
            Gosub Beep
            If Histereza < 1 Then Histereza = 1
            Waitms 400
      End If
Loop Until Ok_sw = 0
Gosub Beep
Waitms 400
 
 
 
Histereza_e = Histereza
Alarm1 = Histereza
Writeeeprom Histereza_e , 10
Cls
Lcd "zapisalem dane"
Gosub Beep
Wait 2
 
 '------------------------ ustawianie max wymiennika -------------
 
 
 Cls
Lcd "Tmax solar"
Lowerline
Do
 
Locate 2 , 1
Lcd "Tmax.sol.=" ; Tmax ; " "
      If Up_sw = 0 Then
            Incr Tmax
            Gosub Beep
            If Tmax > 125 Then Tmax = 125
            Waitms 400
      End If
      If Down_sw = 0 Then
            Decr Tmax
            Gosub Beep
            If Tmax < 1 Then Tmax = 1
            Waitms 400
      End If
Loop Until Ok_sw = 0
Gosub Beep
Waitms 400
 
 
 
Tmax_e = Tmax
Tmax1 = Tmax
Writeeeprom Tmax_e , 20
Cls
Lcd "zapisalem dane"
Gosub Beep
Wait 2
'--------------------------------------- ustawienie histeryzy wyłanczania
 
 
 
 Cls
Lcd "Histereza Off"
Lowerline
Do
 
Locate 2 , 1
Lcd "Hist.=" ; Hist_off ; " "
      If Up_sw = 0 Then
            Incr Hist_off
            Gosub Beep
            If Hist_off > Histereza Then Hist_off = Histereza
            Waitms 400
      End If
      If Down_sw = 0 Then
            Decr Hist_off
            Gosub Beep
            If Hist_off < 1 Then Hist_off = 1
            Waitms 400
      End If
Loop Until Ok_sw = 0
Gosub Beep
Waitms 400
 
 
 
Hist_off_e = Hist_off
 
Writeeeprom Hist_off_e , 30
Cls
Lcd "zapisalem dane"
Gosub Beep
Wait 2
 
 
End If
' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
 
' --------------------------------  odsniezanie ----------------
 
 
If Ok_sw = 0 Then
Cls
Sekundy = 300
Set Portb.2
Lcd "Odladzanie"
Do
Decr Sekundy
Locate 2 , 1
Lcd "pozostalo:" ; Sekundy
Wait 1
 
 
Loop Until Sekundy = 0 Or Ok_sw = 0
Reset Portb.2
Cls
Lcd " koniec"
Lowerline
Lcd "odladzania"
Wait 1
 
 
 
End If
 
 
'-------------------------------------------------------------
 
 
 
 
 
 
1wreset Pinc , 1                                            'podprogram 1wr
1wwrite &HCC , 1 , Pinc , 1                                 'komenda skip ROM
1wwrite &H44 , 1 , Pinc , 1                                 'komenda convert T
Waitms 250
Waitms 250
1wreset Pinc , 1                                            'podprogram 1wr
1wwrite &HCC , 1 , Pinc , 1                                 'komenda skip ROM
1wwrite &HBE , 1 , Pinc , 1                                 'komenda read
 
B1 = 1wread(1 , Pinc , 1)                                   'odczyt z termometru
B2 = 1wread(1 , Pinc , 1)
 
1wreset Pinc , 1                                            'podprogram 1wr
 
If B2 >= 248 Then                                           'w przypadku temperatur ujemnych
B1 = R - B1                                                 'Od 255 Odejmujemy B1
B2 = R - B2                                                 'od 255 odejmujemy B2
Znak = "-"
Else
Znak = "+"
End If
T1 = B1 / 16                                                'Przesuniecie w pawo o 4 bajty
T2 = B2 * 16                                                'przesuniecie w lewo o 4 bajty
T1 = T1 + T2
 
Tmp = Fusing(t1 , " ###.&")
 
 
 
 
 
 
 
 1wreset Pinc , 0                                           'podprogram 1wr
1wwrite &HCC , 1 , Pinc , 0                                 'komenda skip ROM
1wwrite &H44 , 1 , Pinc , 0                                 'komenda convert T
'Set Portc.0
Waitms 500
'Waitms 250
'Reset Portc.0
 
1wreset Pinc , 0                                            'podprogram 1wr
1wwrite &HCC , 1 , Pinc , 0                                 'komenda skip ROM
1wwrite &HBE , 1 , Pinc , 0                                 'komenda read
 
B1b = 1wread(1 , Pinc , 0)                                  'odczyt z termometru
B2b = 1wread(1 , Pinc , 0)
 
1wreset Pinc , 0                                            'podprogram 1wr
 
If B2b >= 248 Then                                          'w przypadku temperatur ujemnych
B1b = R - B1b                                               'Od 255 Odejmujemy b1b
B2b = R - B2b                                               'od 255 odejmujemy B2b
Znakb = "-"
Else
Znakb = "+"
End If
T1b = B1b / 16                                              'Przesuniecie w pawo o 4 bajty
T2b = B2b * 16                                              'przesuniecie w lewo o 4 bajty
T1b = T1b + T2b
 
Tmpb = Fusing(t1b , " ###.&")                               ' t solar  = t1b
Cls
 
Lcd "T.solar:" ; Znakb ; Tmpb ; Chr(1) ; "C "               'zamiast temp1 miożesz napisac dowolny tekst max 8 liter  na przykład "w aucie"
 
 
Lowerline
Lcd "T.wymie:" ; Znak ; Tmp ; Chr(1) ; "C "                 'zamiast temp2 miożesz napisac dowolny tekst max 8 liter  na przykład "na polu"
Wait 2
 
 
'---------------------  sprawdzanie histerezy-------------------------------------
 
Delta = T1b - T1
Delta = Int(delta)
 
If Znakb = "+" Then                                         ' tutaj poprawiłem żeby ie załanczał przy minusowych
If Delta => Alarm1 Or T1b > Tmax1 Then
Set Portb.2
 
End If
End If                                                      ' tutaj poprawiłem żeby ie załanczał przy minusowych
 
 
If Delta >= Alarm_pom Then
Cls
Lcd "Pompa ON"
Wait 1
End If
 
Alarm_pom = Alarm1 - Hist_off
If Delta < Alarm_pom And T1b < Tmax1 Then Reset Portb.2
 
 
 
 
'------------------------------------------------------------------------------
 
 
 
 
 
Waitms 250
Waitms 250
Waitms 250
Waitms 50
Loop
 
Sub 1wr                                                     'podprogram resetujacy magistrale
End Sub
 
 
 
 
' -------------------- Procedura Beep ------------------------------------------
 
' Odpowiedzialna za "piśnięcie buzerem przy naciskaniu przycisków
Beep:
 
Set Buzer
Waitms 50
Reset Buzer
 
Return
'--------------------------------------------------------------------------------

Portret użytkownika gosc1

Witam. Mam pewien problem.

Witam.

Mam pewien problem. Otóż chciałem zrobić termometr, który temperaturę wysyłałby co 500ms przez uart do komputera. Kwarc 16mHz, 1-wire na PorcieC.5 AVRek to Amega8. Jednak zawsze w terminalu ukazuje się "4095.94" Czy mógłbym prosić o kod?Muj to przerobiona wersja tego od termometru uniwersalnego. Zmieniłem attiny2313 na m8def, 12000000 na 16000000 i dodałem wysyłanie wartości zmiennej w pętli głównej na RSa.

Dziękuję

Portret użytkownika mirley

Re: Ds18B20

Da na początek czytanie z Ds'a co najmniej co 1s-2s i zobacz efekty

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika matrix

Re: Ds18B20

Jak wyglądała by procedura wyświetlenia numeru seryjnego jednego DS'a?
W jakiej postaci się to wyświetli bez jakiejkolwiek konwersji?

Czy wystarczyło by napisać:

lcd ds1(1);ds1(2);ds1(3);ds1(4);ds1(5);ds1(6);ds1(7);ds1(8)

Potrzebował bym wartość numeru takiego termometru jako jedna liczba z dowolnego zakresu.

Portret użytkownika mirley

Re: Numer ds

Numer ds'a jest w postaci 8 bajtów.... nigdy nie zastanawiałem się czy ma to jakąś głębszą interpretację w postaci jednej wartości(napewno jest tam crc, kod układu i kod rodziny).... można by zamienić to na jednego long'a (4 bajty) albo jeśli potrzebujesz taki numer zapisać a potem za jego pomocą sterować odpowiednim DS to można zrobić tak jak napisałeś wyżej, albo zapisać w postaci w postaci tablicy

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika matrix

Re: Numer ds

Numer ds'a potrzebny mi jest do czegoś innego mianowicie:
Powiedzmy że kilka osób ma jeden układ (konkretnie chodzi o sterownik do modelu o którym gdzieś pisałem). Do każdego sterownika dorzucę ds'a. Jeśli będę znał jego numer to napiszę na początku programu tak:

odczyt ds'a
   'wczesniej sczytam sobie ds'y
   'i na sztywno przypisze numery do danego sterownika
If numer_ds = (tu liczba danego ds'a) then
   do
   loop
   end
else
   'cos tam
end if

Portret użytkownika matrix

Funcja Fusing - czy potrzebna?

A czy do reprezentacji temperatury potrzebna jest tu funkcja Fusing? Przecież DS daje liczbę binarną, nie można użyć makedec. Potrzebuję uzyskać liczbę mieszczącą się w zmiennej byte i odpowiadającą dokładnie temperaturze czyli jeśli jest temperatura powiedzmy 25st.C to chciałbym mieć taką liczbę. Da się tak?

Portret użytkownika mirley

Re: Temperatura

fusing nie jest potrzebny to tylko jedna z propozycji.

Ds18B20 daje liczbę binarną pomnożoną przez 16 (w dwóch bajtach) możesz podzielić przez 16 i wpisac wynik do byte

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika matrix

Re: Temperatura

mirley wrote:
Ds18B20 daje liczbę binarną pomnożoną przez 16 (w dwóch bajtach)

Ja Cię kręcę. Dzięki Mireczku, gdzie to jest napisane? Nigdzie w nocie nie znlazłem. Wychodzi dokładnie tak jak chciałem. Super, stawiam browara.

Portret użytkownika matrix

Odczyt temperatury z kilku czujników - nie bardzo rozumiem

Nie bardzo rozumiem zasadę odczytywania temperatury z kilku czujników. Mam podpięte 4 czujniki pod magistralę, ale jak mam odczytać z nich temperaturę?
Mam niby napisać tak?:

1wreset
1wwrite &H33
czujnik(1) = 1wread(8):
czujnik(2) = 1wread(8):
czujnik(3) = 1wread(8):
czujnik(4) = 1wread(8):

Jak mam zarejestrować numery tych czujników? Jakoś to dla mnie mało jasne. Co później? Można łopatologicznie?

Potrzebuję do jednej zmiennej zapisać te 2x8 bitów, podzielić to przez 16 by uzyskać liczbę dla zmiennej byte.

Portret użytkownika mirley

Re: DS

Wyżej w opisie masz wszystko napisane.... jak odczytywać numery seryjne i jak odczytywać poszczególny czujnik..... napewno nie tak jak napisałeś.

Musisz wysłać na magistrale numer seryjny ds'a a potem robisz tak jakby był tylko jeden czujnik, poprostu odczytując dane. Po każdym resecie musisz zaadresować czujnik, chyba że chcesz wysłać rozkaz do wszystkich.

Popatrz na przykładowy program na końcu artykułu. Tam są numery wpisane na sztywno, ale możesz zrobić na początku if'a który np po zwarciu zworki odczyta numer seryjny jednego ds'a i zapisze go do eeprom, potem odczytasz numer drugiego ds'a i zapiszesz w innym miejscu w eeprom a na samm końcu podłączysz dwa czujniki naraz i będziesz adresował tymy zapisanymi numerami

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika matrix

Mała prośba

Mireczku, czy możesz swój program główny w tym temacie uzupełnić o komentarze? Chętnie przeanalizował bym cały kod z dobrymi komentarzami. Nie mam czujnika DS pod ręką więc zrobił bym analizę że tak powiem, na sucho.

Portret użytkownika mirley

Re; DS

Który dokładnie fragment kodu? Nie dam rady wszystkiego opisać

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika matrix

Re: Który fragment kodu?

Opisz to i będę happy:

Do
  1wreset 'reset magistrali
 
  1wwrite &HCC 'pomiń sprawdzanie numeru seryjnego ROM
  1wwrite &H44 'rozpocznij konwersję temperatury
  Waitms 250
  Waitms 250
 
  1wreset
 
  1wwrite &H55     'zaadresuj czujnik - rozkaz
  1wwrite Ds2(1) , 8 'wpisz jego numer
  1wwrite &HBE      'wyślij do zaadresowanego rozkaz odczytu 
 
  Lsb = 1wread():  'odbierz pierwszy bajt
  Msb = 1wread():   'odbierz drugi
 
  Tempa = Msb * 256   'Przelicz dwa bajty na jedną liczbę, zgodnie z kartą
  Tempa = Tempa + Lsb
  Tempa = Tempa / 16
  Tekst1 = Fusing(tempa , "#.##") 'zrób stringa, dwa miejsca po przecinku
 
 
  1wreset  'reset
 
  1wwrite &H55     'to samo co wyżej drugi czujnik
  1wwrite Ds1(1) , 8
  1wwrite &HBE
 
  Lsb = 1wread():
  Msb = 1wread():

Portret użytkownika karolesz

Barometr

Witam wszystkich.
Ja z kolei mam taki problem. Termometry są już tak "przewałkowane" na wszystkie strony, że nie ma większego problemu. Ale apetyt rośnie w miarę jedzenia! Ostatnio wpadł mi w ręce czujnik ciśnienia DMP015A. Chciałbym go oczywiście wykorzystać. Czy ktoś mógłby mi podrzucić jakiś kod do jego obsługi? Może być coś podobnego, z modyfikacją jakoś bym sobie poradził (?).
Pozdrawiam.

Portret użytkownika Schramm

SYMULATOR DS18B20

Witam, proszę o pomoc, sugestie porady w następującej kwestii : symulator DS18B20 najlepiej napisany w Bascom. O co chodzi: program ma symulować DS i wysyłać dane po 1-wire. załużmy, że mamy urządzenie, które potrafi komunikować się tylko z DS18B20 i nic więcej (softu urządzenia nie możemy zmienić). Chcemy do tego urządzenia przesyłać dane. Widzę to tak. Na zapytanie urządzenia symulator odpowiada kodem urządzenia DS18B20, na zapytanie o temp. wysyła dane przez nas wybrane. Wygląda to tak jakbyśmy to my ustalali temperaturę. Mam nadzieję, że jasno opisałem problem. Wszelkie pomysły i realizacje mile widziane. Pozdrawiam

Portret użytkownika Pier

Tak się zastanawiam...

Witam.
Mirku przecztałem ten bardzo przydatny mi artykuł i mam pewno pytanie dotyczące obsługi tych DS-ów.
Czy aby na pewno trzeba po każdej konwersji temperatury trzeba czekać te 750ms?
Mnie się wydaje że jest to niezbędne tylko wtedy gdy czujnik jest podpięty w trybie zasilania go przez linię DQ (dwa przewody). A jeśli podłączamy czujnik standardowo (trzy przewody) ten czas oczekiwania jest niepotrzebny.
Niekiedy ten czas konwersji strasznie przeszkadza np przy obsłudze multipleksowanego wyświetlacza led.

Portret użytkownika mirley

Re: DS

Zasilanie nie ma tu nic do rzeczy po wydaniu rozkazu konwersji trzeba odczekać czas aż czujnik zmierzy temperaturę... to chyba normalne. Temperatura nie jest mierzona w locie.

Nie rozumiem w jaki sposób czekanie 750ms przeszkadza w multipleksowaniu wyświetlacza? natomiast sama transmisja danych 1-Wire trochę przeszkadza i trzeba umiejętnie program napisać aby przerwania nigdy nie występowały w środku przesyłania bajtu po 1-wire bo wtedy będzie się źle wysyłać

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika Pier

No to nie wiem jakim cudem

No to nie wiem jakim cudem kilka moich urządzeń działa właśnie bez tego czasu konwersji.

Portret użytkownika mirley

Re: DS

Może nieświadomie odliczasz w przewrwaniu albo co którys odczyt z dsa jest dobry jak się akurat konwersja skończy albo obsługujesz wiele rzeczy w programie i siłą rzeczy robi się zwłoka. Trudno powiedzieć bez kodu programu

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika Pier

Przejrzalem programy dwóch

Przejrzalem programy dwóch swoich urządzeń które działają już jakiś czas prawidłowo. No i tak jak pisałem nie ma w nich tych czasów oczekiwania na konwersję. Jest rozkaz dokonania konwersji i zaraz odczyt. Nieprawidłowości w odczycie też nie ma. W programach tych nie korzystam z przerwań.
Może to bascom bez wiedzy użytkownika załatwia to "za kulisami"?
Pamiętam jak kiedyś męczyłem obsługę 16-sto pozycyjnego wyświetlacza alfanumerycznego led i ds18b20 i właśnie wtedy odkryłem że ds działa bez tych opóźnień. Oczywiście tylko w trybie trzy-przewodowym.
Mirku jeśli możesz to sprawdź to u Siebie.

Portret użytkownika farmer

Witam wszystkich. Stare

Witam wszystkich. Stare zagadnienie ale chciałbym dodać coś od siebie. Czas konwersji jest niezbędny na zasilaniu pasożytniczym ( dwa przewody). Na zasilaniu aktywnym (trzy przewody) nie jest konieczny ( z praktyki), aczkolwiek wg dokumentacji powinien wynosić przynajmniej 200ms. Gdzieś w jakiejś publikacji wyczytane, sprawdzone w praktyce. Atmega16, bascom, instrukcja odczytu zaraz po instrukcji konwersji nie powoduje przekłamań w pomiarach. Może na dobry egzemplarz DS trafiłem, może firma Dallas "zabezpiecza" się tymi 200ms, lub długość magistrali ma wpływ na czas konwersji DS. W każdym razie w owej publikacji wyjaśniono to w ten sposób:
1. Ładowanie wewnętrznego kondensatora w DS
2. Instrukcja conwert (DS zasilany z wewnętrznego kondensatora)
3. Ponowne naładowanie wewnętrznego kondensatora
4. Odczyt z DS(DS zasilany z wewnętrznego kondensatora)
Przy zasilaniu pasożytniczym, bez zwłoki nie nastąpi ponowne naładowanie kondensatora w DS i braknie energii na wysłanie wartości temperatury, sama konwersja również przebiega wolniej ze względu na niewielką wydajność tego kondensatora.
Z praktyki, to by się zgadzało ;).
Pozdrawiam.

Portret użytkownika PawelK

Temp = Temp * (-1) Bascom nie

 Temp = Temp * (-1)

Bascom nie przyjmuje takiej skladni. Dla uzyskania wartosci ujemnej mozna uzyc metody
 Temp = 0 - Temp

Pozdrawiam

Portret użytkownika Yari27

wartość ujemna

Dla wartości ujemnej np. -0,5 zostanie pobrane FFF8h czyli w DEC 255 i 248?

Portret użytkownika mirley

Re: DS

Tak dokładnie tak powinno być to odebrane.... Ja czesto odczytuje też

Hi = 1wread(2)

gdzie Hi jest zmienna integer.... po wypisaniu na LCD dostajemy liczbę ze znakiem i nie trzeba kombinować

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.