DS18B20 / Formatierung Ausgabe

HB9NMT

Neues Mitglied
03. Jan. 2009
5
0
0
CH-Muttenz
Sprachen
Hallo zusammen, ich habe hier ein kleine Routine, die einen Sensor DS 18B20 abfragt und die Min und Max Werte speichert ( 2. Zeile)
Funktioniert soweit, lediglich die Ausgabe ist 3 stellig (ohne den Dezimal-Punkt).

Ich hätte aber gerne den Wert anstelle 223 mit 22.3 Grad angezeigt.

Kann mir bitte jemand einen Tipp geben, wie ich den Wert der Variablen DG mit den richtigen Kommastellen (1 Stelle nach dem Komma) anzeigen resp. umformen kann. Gerne auch verständlich detailliert erklärt, damit ich als Anfänger auch etwas profitieren kann.

Andere Routinen sind für den DS 1820 geschrieben und liefern leider falsche Temparaturwerte mit dem DS18B20.

Vielen Dank im Voraus und ein gutes 2009 Matthias HB9NMT
 

Anhänge

  • DS18B20.txt
    5,5 KB · Aufrufe: 306
Hallo :)

Temp_string = Str(temp_integer)
Temp_string = Format(temp_string , " +0.0")

ergibt Anzeige mit dem Vorzeichen auf einer Stelle hinter dem Komma. Wenn Du das Vorzeichen nicht möchtest, dann laß das "+" im Format weg. Negative Zahlen werden natürlich mit dem Vorzeichen dargestellt. In temp_integer ist Dein Wert vom DS-blablah enthalten. Die String-Länge muß natürlich definiert werden.

Thomas
 
Temperaturumrechung

Hallo Matthias,

sorry wenn ich gleich mit der Tür ins Haus falle ohne Dir zunächst Deine Frage zu beantworten. Ich beschäftige mich nämlich gerade auch mit dem DS1820 da ich mit dem Teil die Wassertemperatur in meiner Zisterne messen möchte.

Ich habe gründsätzlich eine Frage zu der ich auch gleich noch ein paar Gedankengänge von mir beifügen möchte.


Also, zur Frage:

Bist Du sicher, dass Du die Temperatur richtig aus dem DS ausliest und umrechnest? Ich meine, bist Du sicher, dass das was Dir der Sensor anzeigt richtig ist?
Du machst aus LSB und MSB einen Integer, multiplizierst diesen mit 10 und teils durch 16. Hmmmmmmm, meiner Meinung nach dürften so nur falsche Ergebnisse raus kommen.


Gedankengänge:

1. Der Sensor liefert zwar MSB und LSB, Du hast aber real nur 9 Bit. Das MSB ist das im Prinzip ja nur das "Vorzeichen" bzw. wenn Du die gesamten zwei Byte betrachtest das vorzeichenkorrigierte Zweierkomplement was wiederum der Darstellung von negativen ganzen Zahle in der Digitaltechnik entspricht.
Soweit ist das Kind noch nicht in den Brunnen gefallen.

2. Jedes Bit repräsentiert die Wertigkeit 0,5! Ich habe nicht verstanden warum *10 und /16?!?!?
Ein Beispiel: Wenn Du 0032h aus dem DS ausliest so weist dies nur MSB=0 zunächst darauf hin, dass es eine positive Zahl ist. 32h entpsricht 50. 50 * 0,5 sind 25°C.
Nach Deiner Rechnung bekomme ich 31,25 raus. Oder?

3. Ich habe zwar noch keine Zeile Code für den DS geschrieben da ich bisher erst die HW in Betrieb nehme, siehe auch
http://www.avr-praxis.de/forum/showthread.php?p=2046#post2046
aber im Kopf habe ich den Sensor bereits :rolleyes:
Ich würde aber den Ansatz so gehen:
A) aus MSB und LSB einen Integer machen. (das hast du ja bereits)
B) eine Signle-Variable deklarieren und den Integer in einen Single casten (in BASCOM zuweisen. So: SINGLEVAR = INTEGERVAR
C) und dann die Single Variable mit 0,5 multiplizieren. So: SINGLEVAR = SINGLEVAR * 0,5

Achtung: BASCOM hat Probleme beim Casten mit SINGLEVAR = INTEGERVAR * 0,5. Da bekommst Du nur ganze Zahlen aber keine Kommastellen.

Mit Fusing(SINGLEVAR , "#.#") kannst Du Dir dann in BASCOM einen schönen String mit einer nachkommastellen zusammenbauen und auf dem LCD ausgeben.

So sollte es auch funktionieren. Aber vielleicht sehe ich vor lauter Bäumen den Wald nicht und Deine Lösung mit *10 und /16 ist viel einfacher. Ich habs nur noch nicht begriffen.

Was meinst Du?

Grüße,
Markus


PS: Es gibt übrigens noch einen 2. Weg genauer und mit Werten größer 9Bit die Temperatur zu berechnen. Er ist aber aufwändiger!
 
String Länge / Codebeispiel

Hallo Thomas, Danke für Deine rasche Antwort. Könntest Du mir bitte noch mit einem Tipp zum String helfen ? Müsste das in der Art Temp_string = Temp_string(5, ?? ) Aussehen ?

5 würde hier für die Länge stehen, ist dies korrekt ? Was kommt nach dem Komma rein ?
Werde hier aus dem Helpfile nicht ganz schlau.

Habe den Code nicht selbst erstellt, nur ganz leicht angepasst.

Danke schön und Gruss aus der kalten Schweiz.

Matthias
 
Oh jeeee

:eek: Oh jeee

Asche auf mein Haupt, ich habe übersehen, dass Du den DS18B20 einsetzt und ich bin von dem DS18S20 ausgegangen. Sorry!!
Der DS18B20 ist in der Tat anders und liefert die Ergebnisse mit einer anderen Basis, bezogen auf 8! Dabei ist 1000b = 08h = 0,5. Er verwendet auch 3 Bit mehr und geht bis 2^10. Der Vorteil von dem Baustein ist, dass er nicht nur 0,5er Schritte kann sondern auch kleiner. Im Grund würde ich aber die Vorgehensweise mal so beibehalten wie in meinem letzten Beitrag beschrieben und über Single casten. Du musst dann aber anstelle 0,5 mit 0,0625 multiplizieren. Sollte aber auch funktionieren.

Ich lasse meinen Beitrag jetzt im Bezug auf den DS18S20 so stehen. Ich glaube das Thomas Dir ja schon eine Lösung geliefert hat.

Mist, jetzt mache ich so viel Wirbel für nix um den falschen Baustein :eek:

Grüße,
Markus
 
Ergänzungen / Deine Gedanken

Hallo Markus, habe der DS1820 ist nicht mehr lieferbar, daher bin ich auf den nicht ganz kompatiblen DS18B20 ausgewichen. Daher laufen auch die Beispiele mit dem 1820 nicht (andere Werte)



Also, zur Frage:

Bist Du sicher, dass Du die Temperatur richtig aus dem DS ausliest und umrechnest? Ich meine, bist Du sicher, dass das was Dir der Sensor anzeigt richtig ist?
Du machst aus LSB und MSB einen Integer, multiplizierst diesen mit 10 und teils durch 16. Hmmmmmmm, meiner Meinung nach dürften so nur falsche Ergebnisse raus kommen.

Die Werte sind mit einem Vergleichstermometer identisch, der Sensor reagiert auch auf berühren mit Temp Anstieg und anschliessendem Auskühlen. Mit den 1820 Codes von anderen Beispielen habe ich nur Fantasietemparaturen z.B. 174 Grad erhalten.

Mit Deinen Fragen weiter unten habe ich leider Mühe, das ist mir im Moment zu hoch, so weit bin ich noch nicht.Sorry. Vielleicht kann da jemand anders helfen, der den von mir übernommenen Code weiter "auskommentieren kann"


Mit dem "Fusing" habe ich mich noch nie beschäftigt, diesen Parameter muss ich noch studieren.


Gedankengänge:

1. Der Sensor liefert zwar MSB und LSB, Du hast aber real nur 9 Bit. Das MSB ist das im Prinzip ja nur das "Vorzeichen" bzw. wenn Du die gesamten zwei Byte betrachtest das vorzeichenkorrigierte Zweierkomplement was wiederum der Darstellung von negativen ganzen Zahle in der Digitaltechnik entspricht.
Soweit ist das Kind noch nicht in den Brunnen gefallen.

2. Jedes Bit repräsentiert die Wertigkeit 0,5! Ich habe nicht verstanden warum *10 und /16?!?!?
Ein Beispiel: Wenn Du 0032h aus dem DS ausliest so weist dies nur MSB=0 zunächst darauf hin, dass es eine positive Zahl ist. 32h entpsricht 50. 50 * 0,5 sind 25°C.
Nach Deiner Rechnung bekomme ich 31,25 raus. Oder?

3. Ich habe zwar noch keine Zeile Code für den DS geschrieben da ich bisher erst die HW in Betrieb nehme, siehe auch
http://www.avr-praxis.de/forum/showthread.php?p=2046#post2046
aber im Kopf habe ich den Sensor bereits :rolleyes:
Ich würde aber den Ansatz so gehen:
A) aus MSB und LSB einen Integer machen. (das hast du ja bereits)
B) eine Signle-Variable deklarieren und den Integer in einen Single casten (in BASCOM zuweisen. So: SINGLEVAR = INTEGERVAR
C) und dann die Single Variable mit 0,5 multiplizieren. So: SINGLEVAR = SINGLEVAR * 0,5

Achtung: BASCOM hat Probleme beim Casten mit SINGLEVAR = INTEGERVAR * 0,5. Da bekommst Du nur ganze Zahlen aber keine Kommastellen.

Mit Fusing(SINGLEVAR , "#.#") kannst Du Dir dann in BASCOM einen schönen String mit einer nachkommastellen zusammenbauen und auf dem LCD ausgeben.

So sollte es auch funktionieren. Aber vielleicht sehe ich vor lauter Bäumen den Wald nicht und Deine Lösung mit *10 und /16 ist viel einfacher. Ich habs nur noch nicht begriffen.

Was meinst Du?

Grüße,
Markus


PS: Es gibt übrigens noch einen 2. Weg genauer und mit Werten größer 9Bit die Temperatur zu berechnen. Er ist aber aufwändiger![/QUOTE]
 
Variablendeklaration ?

Hallo Thomas,

Hab den Code mal eingegeben, aber stehe noch bei der Definition an.
(Fehlermeldung beim Syntax-Check) / Compilieren

27 Dim Temp_string As Integer

113 If Sc(9) = Crc8(sc(1) , 8) Then
114 Dg = Decigrades(sc(9))
115 If Min1 > Dg Then Min1 = Dg
116 If Max1 < Dg Then Max1 = Dg


119 Locate 2 , 1 : Lcd Min1 :
120 Locate 2 , 5 : Lcd "Min"
121 Locate 2 , 9 : Lcd Max1
122 Locate 2 , 13 : Lcd "Max"
123 Temp_string = Str(temp_integer)
124 Temp_string = Format(temp_string , " +0.0")
125 Locate 1 , 1 : Lcd Temp_string

Dim Temp_string as word '(und as integer) funktionieren nicht.

Wie müsste diese Variable gesetzt werden ? Code für die Stringlänge ?

:confused:

Temp_string = Str(temp_integer)
Temp_string = Format(temp_string , " +0.0")

Merci Matthias
 
Hallo Matthias.

String ! Na, eine Stringvariable ;)

Dim Temp_string as String * 5 ' String der Länge 5

Temp_string = Str(dg)
Temp_string = Format(temp_string , " +0.0")
Locate 1 , 1 : Lcd Temp_string

oder die Lösung von Markus mit dem fusing. Die rundet glaube ich sogar noch. Allerdings hatte ich mit dem Fusing mal Probleme, wenn irrsinnige Werte drin sind.

Thomas
 
Warum nimmst Du nicht einfach eine Single-Variable statt eines Strings?
Die korrekte Berechnung sieht dann so aus:

Dim Tmpbyte as byte
Dim Tmpint as integer
Dim tmpsin as single


Tmpbyte = Scratchpad(1) AND 1 'prueft ob ein positiver oder negativer Wert vorhanden ist
If Tmpbyte = 1 Then Decr Scratchpad(1) 'falls negativ muss man den Temp-Wert minus 1 rechnen
Tmpint = makeint(scratchpad(1), scratchpad(2)) 'Import der Temp-Daten in eine Integervariable

Tmpsin = tmpint/16 'Umrechnung in eine Decimalzahl mit Nachkommastelle

Anschliessend kannst du mit dem Befehl "Fusing" die Nachkommastellen auf 1 oder 2 eingrenzen:

Lcd Fusing(Tmpsin,"#.##")

Und fertig


P.S. *10 und dann /16 ist glaub ich falsch, da gabs ein Problem mit negativen Werten, wenn ich mich recht erinnere.

P.P.S. Ja, sie ist 100%ig falsch und funktioniert nur korrekt bei positiven Temperaturen. Die Routine hab ich auch mal am Anfang genutzt und staendig Probleme, wenn die Temperaturen im Minusbereich waren. Das Dumme ist dabei, dass man es nicht sofort sieht. Man muss schon vor dem LCD sitzen, dann sieht man beim Uebergang in den Minusbreich einen Sprung. Nimm meine Routine, die laeuft 100%ig in allen Temp-Bereichen
 
Das der Fred einen kilometerlangen weißen Bart hat, hast schon überrissen, oder?

MfG
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)