Aktyw Forum
Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.
Sprawdź punkty Zarejestruj sięproblem z DS18b20
Moderatorzy:Jacek Bogusz, robertw, k.pawliczak, Moderatorzy
Proszę o listing programu w bascomie do 89c2051, który obsługiwałby DS18B20, ew. jakieś wskazówki przeróbki programu obsługującego DS1820. Z góry dzięki
Dzięki bardzo za listing, układ fajnie mierzy temperaturkę ale tylko do 39 stopni, po przekroczeniu tej temp, wyświetla jakieś haotyczne liczby, podejrzewałem że tak zaprogramowane ma wewnętrzne wartości TL i TH, przeprogramowełem je na wyższe wartości zgodnie z dokumenyacją DS18b20, ale nic to nie dało. Proszę jeszcze o jakieś wskazówki
przepraszam ale źle wkleiłem soft
Problemy wynikły też pewnie ze źle zadeclarowanych zmiennych
spróbuj tak, ja nie mam problemów w całym zakresie od 0 do 127 stopni
(podany listing nie pracuje poniżej 0)
Dim Bd(9) As Byte
Dim Tmp As Integer
Dim T As Integer , T1 As Integer
Declare Sub Read1820
Config 1wire = Pina.3
Do
Read1820
Loop
Sub Read1820
1wreset
1wwrite &HCC
1wwrite &H44
Wait 1
1wreset
1wwrite &HCC
1wwrite &HBE
Bd(1) = 1wread(9)
T = Makeint(bd(1) , Bd(2))
T = T * 10
T = T / 16
End Sub
Problemy wynikły też pewnie ze źle zadeclarowanych zmiennych
spróbuj tak, ja nie mam problemów w całym zakresie od 0 do 127 stopni
(podany listing nie pracuje poniżej 0)
Dim Bd(9) As Byte
Dim Tmp As Integer
Dim T As Integer , T1 As Integer
Declare Sub Read1820
Config 1wire = Pina.3
Do
Read1820
Loop
Sub Read1820
1wreset
1wwrite &HCC
1wwrite &H44
Wait 1
1wreset
1wwrite &HCC
1wwrite &HBE
Bd(1) = 1wread(9)
T = Makeint(bd(1) , Bd(2))
T = T * 10
T = T / 16
End Sub
Czesc
To znalazlem kiedys gdzies w necie,dziala na 100%,mierzy tez temp. ujemne (efekt mozesz zobaczyc tu http://www.elektronika.kgb.pl/1.jpg)
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'program obslugi termometru DS18B20 kompatybilnym z DS1822
'uwagi i komentarze prosze mailem mariuszk@altkom.com.pl
'Mariusz Ksiezak
Config 1wire = P1.0 'konfiguracja magistrali 1wire
Config Lcd = 16 * 1a 'konfiguracja wyswietlacza
Deflcdchar 1 , 4 , 10 , 4 , 32 , 32 , 32 , 32 , 32 'znak stopnia
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
R = &HFF
Declare Sub 1wr 'podprogram resetujacy magistrale 1w
Cursor Off
Cls
Do
1wr 'podprogram 1wr
1wwrite &HCC 'komenda skip ROM
1wwrite &H44 'komenda convert T
Waitms 250
Waitms 250
1wr 'podprogram 1wr
1wwrite &HCC 'komenda skip ROM
1wwrite &HBE 'komenda read
B1 = 1wread() 'odczyt z termometru
B2 = 1wread()
1wr '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 , ###.&&)
Cls
Lcd Znak ; Tmp ; Chr(1) ; "C "
Waitms 250
Waitms 250
Waitms 250
Waitms 50
Loop
Sub 1wr 'podprogram resetujacy magistrale
1wreset
End Sub
''''''''''''''''''''''''''''''''''''''''''''''''''
To znalazlem kiedys gdzies w necie,dziala na 100%,mierzy tez temp. ujemne (efekt mozesz zobaczyc tu http://www.elektronika.kgb.pl/1.jpg)
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'program obslugi termometru DS18B20 kompatybilnym z DS1822
'uwagi i komentarze prosze mailem mariuszk@altkom.com.pl
'Mariusz Ksiezak
Config 1wire = P1.0 'konfiguracja magistrali 1wire
Config Lcd = 16 * 1a 'konfiguracja wyswietlacza
Deflcdchar 1 , 4 , 10 , 4 , 32 , 32 , 32 , 32 , 32 'znak stopnia
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
R = &HFF
Declare Sub 1wr 'podprogram resetujacy magistrale 1w
Cursor Off
Cls
Do
1wr 'podprogram 1wr
1wwrite &HCC 'komenda skip ROM
1wwrite &H44 'komenda convert T
Waitms 250
Waitms 250
1wr 'podprogram 1wr
1wwrite &HCC 'komenda skip ROM
1wwrite &HBE 'komenda read
B1 = 1wread() 'odczyt z termometru
B2 = 1wread()
1wr '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 , ###.&&)
Cls
Lcd Znak ; Tmp ; Chr(1) ; "C "
Waitms 250
Waitms 250
Waitms 250
Waitms 50
Loop
Sub 1wr 'podprogram resetujacy magistrale
1wreset
End Sub
''''''''''''''''''''''''''''''''''''''''''''''''''
DS18b20
Byc moze problem tkwi w zbyt krotkim czasie na przetwarzanie danych przez DS'a. Musi byc min 700ms.
Wiem, że to dość stary post i jego autor dawno znalazł już rozwiązanie problemu, ale być może ta informacja przyda się innym roztargnionym lub początkującym miłośnikom magistrali 1wire. Otóż takie dziwaczne zachowanie układów DS1820 (w temperaturach do ok. 40 'C zachowuje się na pierwszy rzut oka poprawnie - tylko na pierwszy rzut oka , bo tak naprawdę to zawyżają wskazania o jakieś 2-4 'C, a po przekroczeniu pewnej magicznej granicy "świruje", czyli wystawia wartość temperatury dość zabawną np. -15.7, a zaraz potem 127.1 'C) spowodowane jest najczęściej brakiem rezystora podciągającego szynę 1wire do +zasilania. Producent zaleca tu 4k7, ale można poeksperymentować z innymi wartościami. Po szczegóły odsyłam do dokumentacji.
Witam ponownie, opornik 4,7k to podstawa, bez tego ani rusz, w oprogramowaniu też nie było większych uchybień, bawiłem sie z tym ponad miesiąc, w układach 18b20 jest jeden mankament, natomiast żeby pracowały w pełnym zakresie muszą być zasilane nie przez oporniczek, tylko przez dodatkową żyłę zasilającą
Co do samego zasilania układów DS18xx to faktycznie zasilanie ich tradycyjnie czyli z oddzielną linią zasilającą (wtedy to już nie jest 1-wire ;-) pozwala wydusić z nich więcej, zwłaszcza jeśli chodzi o możliwe do uzyskania długości kabla transmisyjnego i szybkość konwersji. NAtomiast zasilanie tzw. pasożytnicze czyli przez linię do transmisji danych wymaga po prostu, aby dać układowi więcej czasu na wykonanie konwersji temperatury. Wartością przyjmowaną za "bezpieczną" jest 700-750ms. Moje próby z tymi kostkami wykazały, że przy spełnieniu tych warunków uzyskanie wiarygodnych pomiarów nie stanowi problemu. Nie miałem wprawdzie możliwości sprawdzenia pełnego zakresu pomiarowego, ale w przedziale od -18'C (moja lodowka więcej nie potrafi ;-) do 120'C wszystko było O.K.
Warto jeszcze wspomnieć, że w bieżącym numerze EP zamieszczono dobrze napisany artykuł Artura Starza, który powinien rozwiać wszelkie wątpliwości dotyczące obsługi DS-ów pod Bascomem. Sam dowiedziałem się z niego kilku nowych rzeczy i poznałem kilka innych trików programistycznych, różnych od tych, które wymyśliłem podczas moich bojów z Dallasami (niektóre mogą być nawet lepsze w sensie generowania krótszego kodu wynikowego - kod programu jest dłuższy, ale to muszę na spokojnie sprawdzić).
Pozdrawiam i życzę owocnych pomiarów.
Pi
Warto jeszcze wspomnieć, że w bieżącym numerze EP zamieszczono dobrze napisany artykuł Artura Starza, który powinien rozwiać wszelkie wątpliwości dotyczące obsługi DS-ów pod Bascomem. Sam dowiedziałem się z niego kilku nowych rzeczy i poznałem kilka innych trików programistycznych, różnych od tych, które wymyśliłem podczas moich bojów z Dallasami (niektóre mogą być nawet lepsze w sensie generowania krótszego kodu wynikowego - kod programu jest dłuższy, ale to muszę na spokojnie sprawdzić).
Pozdrawiam i życzę owocnych pomiarów.
Pi
Czesc
To znalazlem kiedys gdzies w necie,dziala na 100%,mierzy tez temp. ujemne (efekt mozesz zobaczyc tu http://www.elektronika.kgb.pl/1.jpg)
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'program obslugi termometru DS18B20 kompatybilnym z DS1822
'uwagi i komentarze prosze mailem mariuszk@altkom.com.pl
'Mariusz Ksiezak
Config 1wire = P1.0 'konfiguracja magistrali 1wire
Config Lcd = 16 * 1a 'konfiguracja wyswietlacza
Deflcdchar 1 , 4 , 10 , 4 , 32 , 32 , 32 , 32 , 32 'znak stopnia
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
R = &HFF
Declare Sub 1wr 'podprogram resetujacy magistrale 1w
Cursor Off
Cls
Do
1wr 'podprogram 1wr
1wwrite &HCC 'komenda skip ROM
1wwrite &H44 'komenda convert T
Waitms 250
Waitms 250
1wr 'podprogram 1wr
1wwrite &HCC 'komenda skip ROM
1wwrite &HBE 'komenda read
B1 = 1wread() 'odczyt z termometru
B2 = 1wread()
1wr '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 , ###.&&)
Cls
Lcd Znak ; Tmp ; Chr(1) ; "C "
Waitms 250
Waitms 250
Waitms 250
Waitms 50
Loop
Sub 1wr 'podprogram resetujacy magistrale
1wreset
End Sub
''''''''''''''''''''''''''''''''''''''''''''''''''
Mnie ten program pokazuje tylko temperaturę 85,0C
Dlaczego tak się dzieje ?? Mam DS18B20
Witam
Ja chwilę walczyłem z układami DS1820 (Z DS18B20 niestety nie miałem do czynienia) ale miałem podpięte 4 układy na przewodzie telefonicznym każdy koło 10metów długości, i problem z temp 85 występował w 3 sytuacjach (o koniecznym rezystorze już się nie wypowiadam)
1.4 DSy mam podpięte na 2 żyłowym przewodzie telefonicznym i na początku podłączałem tylko masę i linie danych, 3 końcówka (VDD) wisiała w powietrzu - na dłuższym przewodzie niż 10 cm wyświetlało tylko 85 stopni –pomogło dopiero połączenie 3 końcówki z masą albo podpięcie 3 przewodu zasilania – U mnie od 3 miesięcy konfiguracja działa bez problemów na 2 przewodach. Sposób połączenia zresztą jest opisany w nocie aplikacyjnej chyba storna 5 (http://pdfserv.maxim-ic.com/en/ds/DS18B20.pdf).
2. za krótki czas na konwersje wydłużenie do 750ms pomogło oczywiście też po spełnieniu warunku prawidłowego zasilenia układu
3. problem występował w czasie testów jak DSy miałem jeszcze nie przylutowane i miałem je prowizorycznie podłączone czasem cos nie stykało wiec tez ten sam błąd występował
Całością steruje Atmega8, a program napisałem na podstawie książki „Programowanie mikrokontrolerów AVR w języku Bascom” na stronie wydawnictwa BTC są wszystkie listingi programów z książki.
Na początek jednak proponuje zweryfikować czy wszystko jest prawidłowo połączone – u mnie to był główny problem
pozdrawiam
Ja chwilę walczyłem z układami DS1820 (Z DS18B20 niestety nie miałem do czynienia) ale miałem podpięte 4 układy na przewodzie telefonicznym każdy koło 10metów długości, i problem z temp 85 występował w 3 sytuacjach (o koniecznym rezystorze już się nie wypowiadam)
1.4 DSy mam podpięte na 2 żyłowym przewodzie telefonicznym i na początku podłączałem tylko masę i linie danych, 3 końcówka (VDD) wisiała w powietrzu - na dłuższym przewodzie niż 10 cm wyświetlało tylko 85 stopni –pomogło dopiero połączenie 3 końcówki z masą albo podpięcie 3 przewodu zasilania – U mnie od 3 miesięcy konfiguracja działa bez problemów na 2 przewodach. Sposób połączenia zresztą jest opisany w nocie aplikacyjnej chyba storna 5 (http://pdfserv.maxim-ic.com/en/ds/DS18B20.pdf).
2. za krótki czas na konwersje wydłużenie do 750ms pomogło oczywiście też po spełnieniu warunku prawidłowego zasilenia układu
3. problem występował w czasie testów jak DSy miałem jeszcze nie przylutowane i miałem je prowizorycznie podłączone czasem cos nie stykało wiec tez ten sam błąd występował
Całością steruje Atmega8, a program napisałem na podstawie książki „Programowanie mikrokontrolerów AVR w języku Bascom” na stronie wydawnictwa BTC są wszystkie listingi programów z książki.
Na początek jednak proponuje zweryfikować czy wszystko jest prawidłowo połączone – u mnie to był główny problem
pozdrawiam
Mam pytanie...Witam
Ja chwilę walczyłem z układami DS1820 (Z DS18B20 niestety nie miałem do czynienia) ale miałem podpięte 4 układy na przewodzie telefonicznym każdy koło 10metów długości, i problem z temp 85 występował w 3 sytuacjach (o koniecznym rezystorze już się nie wypowiadam)
1.4 DSy mam podpięte na 2 żyłowym przewodzie telefonicznym i na początku podłączałem tylko masę i linie danych, 3 końcówka (VDD) wisiała w powietrzu - na dłuższym przewodzie niż 10 cm wyświetlało tylko 85 stopni –pomogło dopiero połączenie 3 końcówki z masą albo podpięcie 3 przewodu zasilania – U mnie od 3 miesięcy konfiguracja działa bez problemów na 2 przewodach. Sposób połączenia zresztą jest opisany w nocie aplikacyjnej chyba storna 5 (http://pdfserv.maxim-ic.com/en/ds/DS18B20.pdf).
2. za krótki czas na konwersje wydłużenie do 750ms pomogło oczywiście też po spełnieniu warunku prawidłowego zasilenia układu
3. problem występował w czasie testów jak DSy miałem jeszcze nie przylutowane i miałem je prowizorycznie podłączone czasem cos nie stykało wiec tez ten sam błąd występował
Całością steruje Atmega8, a program napisałem na podstawie książki „Programowanie mikrokontrolerów AVR w języku Bascom” na stronie wydawnictwa BTC są wszystkie listingi programów z książki.
Na początek jednak proponuje zweryfikować czy wszystko jest prawidłowo połączone – u mnie to był główny problem
pozdrawiam
podłączyłem rezystor, DS18B20 jest wlutowany "na sztywno" i nadal temperatura 85.00
[ Dodano: 11-02-2005, 17:38 ]
Witam ponownie, opornik 4,7k to podstawa, bez tego ani rusz, w oprogramowaniu też nie było większych uchybień, bawiłem sie z tym ponad miesiąc, w układach 18b20 jest jeden mankament, natomiast żeby pracowały w pełnym zakresie muszą być zasilane nie przez oporniczek, tylko przez dodatkową żyłę zasilającą
O jakim mankamencie DS18B20 mówisz??
Podlaczyłem teraz DS1820 (bez literki B) pokazuje temperaturę +10.62
O co tutaj chodzi??
Kompletnie tego nie rozumiem...
Czy ma znaczenie na jaki port wpiołem żyłę danych?? Bo ja podłączyłem DS1820 na P3.7
Może tak zostać??
Teraz zaczął mi pokazywać temperaturę, +2,37, gdzie w pokoju mam conajmniej 21C
Chyba znalazłem przyczyne, ten programco jest napisany wyżej chyba jest do banii, bo znalazłem inny program i dziala prawidłow, prawie prawidlowo, tzn. jest co jakiś czas skok o 1 stopień.
Dodaj jeszcze jedną instrukcję Waitms 250. I bedzie dobrze.Do
1wr 'podprogram 1wr
1wwrite &HCC 'komenda skip ROM
1wwrite &H44 'komenda convert T
Waitms 250
Waitms 250
1wr 'podprogram 1wr
1wwrite &HCC 'komenda skip ROM
1wwrite &HBE 'komenda read
Czas konwersji temperatury jest za krótki. Przeczytaj trochę wyżej...
Minimum 700ms
Dodałem nawet 1 sekundę i tak nic nie pomogło w tym programie.Dodaj jeszcze jedną instrukcję Waitms 250. I bedzie dobrze.Do
1wr 'podprogram 1wr
1wwrite &HCC 'komenda skip ROM
1wwrite &H44 'komenda convert T
Waitms 250
Waitms 250
1wr 'podprogram 1wr
1wwrite &HCC 'komenda skip ROM
1wwrite &HBE 'komenda read
Czas konwersji temperatury jest za krótki. Przeczytaj trochę wyżej...
Minimum 700ms
[ Dodano: 11-02-2005, 18:18 ]
Ten przyklad działa bez zarzutów, jednak podaje temperaturę z dokładnością do 1C, tak więc
mysle, ze cały problem polega w dokładności, może one różnie poprostu konwertują dane??
$baud = 57600
Config 1wire = P1.0
Dim T(2) As Byte
Dim Temperatura As Byte
Dim Minus As Byte
Declare Sub Inicjuj_czujnik
Declare Sub Czytaj_temp
1wreset
Do
Inicjuj_czujnik
Czytaj_temp
Print Temperatura
Loop
Sub Inicjuj_czujnik
1wreset
1wwrite &HCC
1wwrite &H44
Wait 1
End Sub
Sub Czytaj_temp
1wreset
1wwrite &HCC
1wwrite &HBE
T(1) = 1wread()
T(2) = 1wread()
1wreset
If T(2) = 0 Then
Temperatura = T(1) / 2
Minus = 0
Else
T(1) = 256 - T(1)
Temperatura = T(1) / 2
Minus = 1
End If
If Temperatura = 0 Then
Minus = 0
End If
End Sub
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 19 gości