bascom i ds18s20


Witam, mam problem z czujnikiem ds18s20. Chodzi o to, że po włączeniu zasilania na lcd pokazuje się liczba 127.0 lub 127.5. Podejrzałem 2 bajty rejestru tegoż czujnika, w obu jest wartość 255. Korzystam z kodu zamieszczonego na tej stronie:

$regfile = "m32def.dat"
$crystal = 2000000
 
Config Lcd = 20 * 4
Config Lcdpin = Pin , Db7 = Portb.5 , Db6 = Portb.4 , Db5 = Portb.3 , Db4 = Portb.2 , Rs = Portb.0 , E = Portb.1
Config 1wire = Portb.6
 
Dim Lsb As Byte
Dim Msb As Byte
Dim Tempa As Single
Dim Tekst2 As String * 10
 
 
 
 Deflcdchar 0 , 8 , 20 , 11 , 4 , 4 , 4 , 3 , 32
'Start Adc
 
Do
'Wart_ac = Getadc(7)
Cursor Off : Cls
 
 
1wreset
 
1wwrite &HCC
1wwrite &H44
 
Waitms 250
Waitms 250
 
1wreset
 
1wwrite &HCC
1wwrite &HBE
 
Lsb = 1wread():
  Msb = 1wread():
 
  Tempa = Lsb / 2
  Tekst2 = Fusing(tempa , "#.#")
 
  Lcd Tekst2
  Waitms 500
Loop
 
End    

Zmieniłem czujnik na inny ds18s20 ale sytuacja jest taka sama. Jestem noobem w tej dziedzinie więc proszę o wyrozumiałość i pomoc :)




Portret użytkownika mirley

Re: DS18B20

Czy masz rezystor 4,7k podłączony między pin 1-wire a + zasilania (5V). Bez tego czujnik nie będzie działał. Program ten jest dobry dla czujnika DS18s20, zobacz czy napewno taki masz a nie np DS18B20 bo trzeba by było troszkę odczyt przerobić

-

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 McGiver1

Temp. DS18B20

$regfile = "attiny2313.dat"
$crystal = 8000000
 
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.3 , Rs = Portb.2
 
Config 1wire = Portb.1
 
Declare Sub Odcz_temp
 
Dim Temperatura(2) As Byte
 
Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32
 
Do
Call Odcz_temp
 
Cls
If Temperatura(2) = 0 Then
 
Lcd "Temp: " ; Temperatura(1) ; Chr(0) ; "C"
Else
 
Lcd "Temp: -" ; Temperatura(1) ; Chr(0) ; "C"
End If
 
Loop
End
 
Sub Odcz_temp
 
1wreset
1wwrite &HCC
1wwrite &H44
Waitms 750
1wreset
1wwrite &HCC
1wwrite &HBE
 
Temperatura(1) = 1wread(2)
 
1wreset
If Err = 1 Then
 
Cls
Lcd "Brak układu"
 
Do
 
Loop
End If
If Temperatura(2) > 0 Then
 
Temperatura(1) = 256 - Temperatura(1)
End If
Temperatura(1) = Temperatura(1) / 2
 
End Sub

Cześć!
Chciałem wypróbować moje tiny2313 ,postanowiłem więc zabrać się za termometr chociażby dlatego ,że znalazłem gotowy kod w książce Marcina Wiązani umieszczony wyżej.
Gdy zaprogramowałem procka, mój zapał szybko ostudził odczyt temperatury w pokoju jako - 40 C.
Zorientowałem się ,że coś jest nie tak i zacząłem szukać przyczyny.
Mój czujnik to DS18B20 ,a kod napisany był pod DS1820. Myślałem z początku ,ze nie robi to róznicy.
Jednak przeglądając trochę internet zauważyłem ,że chyba te czujniki mają jakoś inaczej z tymi bajtami i trzeba wprowadzić inną procedurę odczytu.

Gdy włącze mikrokontroler na wyświetlaczu jak już mówiłem mam około - 40 C gdy dotchnę czujnik to tak temperatura rośnie aż do -0 C po czym nie mam 1 C tylko 128 C i spada. Być może czujnik jest niesprawny ,ale myślę ,że tutaj procedurka odczytu jest inna. Program jest na 8mhz jak w oryginale tylko ,zę było on pod atmegę8 ,ale to nie przeszkadza. Wyłączyłem dzielnik przez 8 w fusach ,by mieć te 8mhz. Nie procuje na zewnętrznym kwarcu ,bo poprostu się go boje ,a dotego ciągłe zmienianie ,go na płytce testowej już ją uszkodziło, bo odpadła ta metalizacja :(

Pomożesz mi przerobić kod Mirku? A przynajmniej naprowadź mnie co do której linijki się przyjżeć :)
Podejrzewam te linijki

Do
 
Loop
End If
If Temperatura(2) > 0 Then
 
Temperatura(1) = 256 - Temperatura(1)
End If
Temperatura(1) = Temperatura(1) / 2
 
End Sub

Pozdrawiam
PS: Ustawiałem też czas oczekiwania na 1 sekundę z racji nie dokładności wew. oscylatora ;]

Portret użytkownika mirley

Re: DS18B20

A czemu nie skorzystasz z tego co napisałem: http://mirley.firlej.org/obsluga_ds18x20 Błąd jest tam gdzie podejrzewasz, poprostu źle obliczasz temperaturę. DS18S20 ma w jednym bajcie temperaturę a DS18B20 jeszcze trochę "zahacza" o ten starszy bit i dlatego If Temperatura(2) > 0 Then jest niepoprawne. Popatrz do kart katalogowych, tam jest dokładnie narysowane wraz z przykładami obliczonych temperatur w zależności od odebranych bajtów

-

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 McGiver1

A Ty wiesz już gdzie jest

A Ty wiesz już gdzie jest błąd?

$regfile = "attiny2313.dat"
$crystal = 8000000
 
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.3 , Rs = Portb.2
 
Config 1wire = Portb.1
 
1wreset
1wwrite &HCC
1wwrite &H44
Waitms 800
1wreset
1wwrite &HCC
1wwrite &HBE
 
Lsb = 1wread():
Msb = 1wread():
 
1wreset
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
End

Zrobiłem coś takiego czyli żywcem spisane i wykrywa błąd :
Lsb = 1wread():
Msb = 1wread():

Co jest?

Portret użytkownika mirley

Re: Program DS

Gdzie w programie masz deklarację zmiennych Msb i Lsb, obie zmienne muszą być typu byte. Poza tym linijki:

Dim Temp As Single
Dim Tempa As Integer

Powinny być na początku programu, zaraz po "config 1wire". Nie mieszaj kodu programu z deklaracją zmiennych.

Dodaj jeszcze:

Dim Lsb as byte, Msb as byte

Tak na marginesie to program zmierzy temperaturę tylko raz bo nie ma pętli głównej programu. Zamknij wszystkie instrukcje (bez konfiguracji, deklaracji zmiennych i instrukcji end) między polecenia do i loop:

$regfile = "attiny2313.dat"
$crystal = 8000000
 
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.3 , Rs = Portb.2
 
Config 1wire = Portb.1
 
Dim Temp As Single
Dim Tempa As Integer 
Dim Lsb as byte, Msb as byte
 
do
 
1wreset
1wwrite &HCC
1wwrite &H44
Waitms 800
1wreset
1wwrite &HCC
1wwrite &HBE
 
Lsb = 1wread():
Msb = 1wread():
 
1wreset
 
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
 
loop
 
End

-

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 McGiver1

Temp = Temp * (-1) Bascom

  Temp = Temp * (-1)

Bascom czepia się tej linijki wywalając błąd 242 ,czyli coś o nie zgodności zmiennej :(

Portret użytkownika mirley

Re: Program

Spróbuj:

  Temp = -1*Temp

lub

  Temp = -Temp

albo zostaw bez minusa czy się kompiluje, problem może być gdzie indziej a jest idiotycznie pokazywany

-

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 McGiver1

Kurde ile się nawalczyłem ,bo

Kurde ile się nawalczyłem ,bo to nie chciało wyświetlać a przecież wystrczyło dopisać LCD Temp ; " C"
Tylko i tak nie mam dobrej temperatury, bo jak trzymam termometr palcem to powinno być z 36.6 a jest 33.3 :( Ale i tak nadzieja powoli dochodzimy do rozwiązania.

Portret użytkownika mirley

Re: Termometr

To że wskazuje 33.3 między palcami to normalne. Nie uzyskasz 36.6 stopnia nigdy między palcami. Spróbuj porównać z jakimś innym termometrem np w szklance z wodą ciepłą

-

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 McGiver1

Powiedzmy ,że temperaturkę

Powiedzmy ,że temperaturkę mierzy dosyć dobrze. Tylko jedynie muszę się teraz przerzucić na atmegę 8 ,bo w tinym brakło miejsca na temperatury ujemne :) Dziękuje za pomoc.
PS: Skąd masz taką wiedzę o Bascomie? Uczyłeś się sam czy na studiach miałeś coś, bo bardzo Cię podziwiam ,że umiesz zrobić cos samemu :)

Portret użytkownika mirley

Re: Bascom

Nie miałem nic z bascoma na studiach, jak w szkole średniej robiliśmy coś z bascomem to już się go wcześniej dawno nauczyłem. Nie powiem że znam dobrze ten język, poprostu potrafię korzystać z helpa i większości rzeczy nauczyłem się sam. Podstawą był dla mnie kiedyś kurs mikroprocesorowa ośla łączka i teraz sam mam zamiar coś podobnego napisać na swojej stronie.

Najważniejsza jest praktyka, pisać różne programy i ciągle coś poprawiać.

-

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

Ds1820

witaj Mirley.
Wszędzie jest opisanny inny czujnik a mi chodzi o ten jak z niego odczytać tęperature ?
Sam algorytm na jeden czujnik.(Jak by Ci sie chciało to na 2 :) )

Portret użytkownika mirley

Re: DS

DS1820 od tego z literką S nie różni się niczym, przynajmniej na pierwszy rzut oka, dokładność ta sama, rejestry te same

-

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.