ich lese einen Ds1820 aus, bekomme aber eine falsche ausgabe (statt zb.:
13,5 C bekomme ich 135 C) wie kann ich die zahl trennen über Fusing
habe ich es schon probiert das will bascom aber nicht!
ich denke es liegt daran das ich "T" as Integer definiert habe! was kann
ich da machen?
Quellcode:
------------------------------------------------------------------------
--
$regfile = "m8def.dat"
$crystal = 3686411
Ddrd = &HFF
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 ,
Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
Config Lcd = 16 * 2
Config 1wire = Portc.5
Dim Dsid(8) As Byte
Dsid(1) = &H10 : Dsid(2) = &H68 : Dsid(3) = &H17 : Dsid(4) = &H25 :
Dsid(5) = &H01 : Dsid(6) = &H08 : Dsid(7) = &H00 : Dsid(8) = &H98
Dim Sc(9) As Byte
-------------------------->Dim T As Integer
Dim T1 As Integer
Dim I As Byte
Cls
Cursor Off
Locate 1 , 1 : Lcd "Mein Termometer"
Do
1wreset
1wwrite &HCC
1wwrite &H44
Waitus 200
1wverify Dsid(1)
1wwrite &HBE
Sc(1) = 1wread(9)
If Sc(9) = Crc8(sc(1) , 8) Then
I = Sc(1) And 1
If I = 1 Then Decr Sc(1)
T = Makeint(sc(1) , Sc(2))
T = T * 50
T = T - 25
T1 = Sc(8) - Sc(7)
T1 = T1 * 100
T1 = T1 / Sc(8)
T = T + T1
T = T / 10
Locate 2 , 1
--------------------------------> Lcd T ; " Grad"
Else
Locate 2 , 1
For I = 1 To 8
Lcd Hex(sc(i))
Next
End If
Waitms 500
Loop
End
------------------------------------------------------------------
Ich versteh grad garnicht, was du da alles rumrechnest. Eigentlich
reicht das auslesen von Sc(1) und Sc(2) und das ganze dann durch die
Genauigkeit teilen:
Answer(1) = 1wread(9)
T = Makeint(Answer(1) , Answer(2))
Temp = T / 16
Print Fusing(Temp , "#.##")
Bei mir heisst Sc() halt Answer() und ich habe einen DS18b20. Deswegen
"T / 16", beim normalen DS1820 müsste es "T / 2" sein.
Gruß
Dominique Görsch
PS: Answer ist Byte, T ist Integer, Temp ist Single
mit str(variable) wandelst du die variable in einen String um
mit len(variable) kannst du dir die Zeichenlänge des strings ausgeben
lassen
mit mid(variable, sartposition, anzahl der Zeichen) kannst du
ausschneiden
mit instr(variable, xx) kannst du nach nen bestimmten zeichen suchen und
dessen position wiedergebn lassen
Schaun danach mal in der bascom hilfe nach!
gruss axel
@dgoersch:
Cooool39 benutzt den DS18S20. Ist ein etwas größerer Aufwand, um die
höhere Auflösung zu bekommen. Und er vermeidet (klevererweise)
Flieskommarechnung.
@Cooool39:
temp$=str(T):format(temp$,"0.0"):lcd temp$
das war nicht mein Quellcode, den habe ich nur gefunden und
umgeschrieben!
und ich benutze den Code mit einen DS1820. kann mir jemand sagen wie der
code für einen DS18b20 aussehen würde?
"Deswegen "T / 16", beim normalen DS1820 müsste es "T / 2" sein. "
Wieso das denn ?
Wer kann mir das erklären, ich habe bisher beim 1820 wie beim 18b20
benutzt; ohne Probleme.
Was habe ich da übersehen ?
Dietmar
Wenn ich das richtig sehe, hat der DS18b20 eine höhere Auflösung,
nämlich 9, 10, 11 und 12 Bit, der DS18s20 bietet lediglich 9-Bit an.
Möglicher Weise verwendest du beide einfach im 9-Bit Modus und brauchst
deswegen den Code nicht anpassen.
@dgoersch
Im Datenblatt zum DS18B20 hab ich nichts über einen 9-Bit-Modus gelesen.
Kannst Du das bitte genauer erklären?
@jasmin
Auch wenn der Sensor "nur" eine Genauigkeit von 0.5°C hat, muß die
binäre vierte Nachkommastelle noch lange nicht hüpfen. Ich nutze die
höhere Auflösung der Sensoren, um Temperaturtrends zu erkennen.
der gefällt mir sehr gut:
Answer(1) = 1wread(9)
T = Makeint(Answer(1) , Answer(2))
Temp = T / 16
Print Fusing(Temp , "#.##")
und wie sieht es mit der Nachkomma-Stelle aus? kann mir jemand das noch
veraten?
@screwdriver
stimmt zur Trendanzeige sehr nützlich wenn der Asolutwert nicht
interessiert.
Aber Vorsicht, man kann sich auch dicke Weiber schönsaufen !