Hey liebe User,
ich habe vor mir einen einzigen DS18s20 auszulesen und nur auf einem LCD
anzuzeigen. Das ganze wollte ich in C machen.
Am besten so knapp wie möglich.
Es ist ja möglich das irgendwie genauer als 0,5 Grad auflösung zu
berechnen. Das würde ich auch noch gerne machen.
Nun habe ich aber mit dem Sensor noch keine Erfahrung.
Ich habe schon einige Codes im Internet angeschaut aber nie etwas wie
ich meine gefunden.
Könnt ihr mir bei meinem Vorhaben helfen?
Datenblatt habe ich auch schon gelesen, aber nichts für mich hilfreiches
gefunden.
Ich würde mich sehr freuen wenn ich hier hilfe bekomme.
Ganz liebe Grüße
Newby
Newby schrieb:> Ich würde mich sehr freuen wenn ich hier hilfe bekomme.
Das kriegen wir hin. Aber auf Groß- und Kleinschreibung achten ;)
An was für einen Mikrocontroller hattest du denn gedacht? Schon mal ins
AVR-GCC-Tutorial geguckt? Gibts Vorerfahrung?
Okay. Entschuldigung wegen der Groß- und Kleinschreibung.
Ich dachte an einen Atmega32 (habe ich daheim).
Ein bisschen Vorerfahrung mit C und AVR habe ich schon.
Newby schrieb:> Datenblatt habe ich auch schon gelesen, aber nichts für mich hilfreiches> gefunden.
Sehr interessant. Dann hast du doch sicher auch die Formel gesehen, mit
der man genauer als 0,5°C rechnen kann, oder?
Hallo Newby,
schau einmal hier hin:
Beitrag "1-Wire-Bus-Projekt: DS1820 DS18S20 DS2450 DS2408 unter C und 8051"
Hier haben wir den kompletten 1-Wire-Bus ausführlichst beschrieben mit
DS18S20, DS2450 und DS2408er.
Hier kannst Du alles wichtige zum DS18S20er nachlesen und Dir auch die
Software-Treiber incl.Demo-Programme runter laden.
Die Software ist in C geschrieben (zwar für 8051er), kann aber sehr
einfach auf Atmegas umgesetzt werden.
Ab Mitte August gibt es auch die Applikationen und Demos zum Anschluss
eines LC-Displays (4 Zeilen á 20 Zeichen) an den 1-Wire-Bus, incl.
Ansteuerung von Relais, LEDs, Abfrage von Tastern, alles über den einen
einzigen µC-Port -Pin.
Viel Spaß mit dem 1-Wire-Bus.
Bernd
Ja ich habe zwar ne Formel gesehen wusste auch das die dafür ist aber
ich kann sie nicht in Verbindung mit der Abfrage bringen. Habe hier im
Forum einen Code gefunden weiß aber nicht ob der so funktioniert. Ich
poste ihn mal hier unter den Dateianhängen. Soweit ich das dort sehe
funktioniert es dort ohne die Rechnung. Wie könnte man die da einbauen?
Ist das insgesamt ein sinnvoller Ansatz?
Newby schrieb:> funktioniert es dort ohne die Rechnung. Wie könnte man die da einbauen?
Na, dort wo sie jetzt auch ist. In main() nach dem Auslesen.
Allerdings müsste man das etwas geschickter angehen als dort. Dort
werden ja alle Kommastellen generell weggeworfen.
Wie du das genau machen willst, hängt natürlich auch davon ab, wie du
eigentlich in deinem Programm eine Temperatur auf, sagen wir mal, 1
Nachkommastelle speichern willst.
Wie gesagt mit dem Sensor kenn ich mich noch nicht aus habe den Code nur
hier aus dem Forum gezogen.
Ja eine Nachkommastelle wäre ok.
Was meinst du mit speichern?
Dafür würde sich doch ein Double-Wert eignen oder?
Oder ich nehme einen Integer-Wert und tuhe ihn durch 10 teilen.
Oder was meinst du mit speichern?
Newby schrieb:> Ja eine Nachkommastelle wäre ok.
Ist doch schon mal eine Aussage
> Was meinst du mit speichern?
Welchen Datentyp soll denn die Variable haben, in der du die Temperatur
speicherst?
> Dafür würde sich doch ein Double-Wert eignen oder?
Kann sein. Kann auch nicht sein.
Nachkommastelle heisst nicht zwangsläufig double oder float.
Manchmal reicht es ja auch, wenn man bei der Ausgabe einfach nur an der
richtigen Stelle ein Komma einschmuggelt, damit an der Anzeige 20,45
Euro steht. Programmintern speichert (und rechnet´) man aber alles in
EuroCent, so dass dann nach der Berechnung 2045 Cent rauskommen, die
eben nur für die Anzeige zu 20,45 Euro (durch Einschmuggeln eines Kommas
an der richtigen Stelle) umgeformt werden.
> Oder ich nehme einen Integer-Wert und tuhe ihn durch 10 teilen.
Yep. zb
(PS: mag dich interessieren. In deinem Testprogramm wird die fertige
Temperatur mit 0.0625 multipliziert. 0.0625 ist aber genau 1/16. D.h.
vom Sensor wird die Temperatur als 16-faches Vielfaches ausgelesen.
Misst du im Winter und hat es +1°C dann liefert der Sensor den Wert 16.
Hat es 2°C dann eben 32 usw.
PS2: und bitte. Du tust nicht teilen und du tust nicht sprechen und du
tust nicht lesen. Sondern du teilst, du sprichst und du liest. Achte ein
wenig auf deine Muttersprache.
Newby schrieb:> Ah Ok.> Stimmt das dann mit der Multiplikations um 0.0625 oder ist das falsch?
Lies anstelle von *0.0625 einfach /16.
Grundsätzlich stimmt das schon. Nur verlierst du alle Kommastellen.
> temperature = (scratchpad [1] << 8) + scratchpad [0];> temperature = temperature - 0.25;> temperature = temperature + ((scratchpad[7] - scratchpad[6]) /> scratchpad[7];> temperature *= 0.0625; //für 12bit
Was um alles in der Welt rechnest du da?
Warum so kompliziert?
Den Teil brauchst du auf jeden Fall um die beiden 8 Bit Register zu
einer 16-Bit Temperatur zusammenzusetzen
temperature = (scratchpad [1] << 8) + scratchpad [0];
So. jetzt hast du in temperatur einen Wert, der dem 16 fachen der
richtigen Temperatur entspricht (für +1°C würde da jetzt 16 rauskommen,
für +2°C w+rden 32 rauskommen, etc).
Du willst 1 Nachkommastelle, also für +1°C hättest du gerne 10 (weil du
das Komma bei der Ausgabe einschmuggelst)
temperatur = temperatur * 10 / 16;
Bsp für 2°C:
Der Sensor liefert 32. 32 * 10 -> 320; 320 / 16 -> 20. Oder nach
Einfügen eines Kommas zwischen 'Zehner und Einer': 2,0
Ah ok danke.
Aber wie genau ist jetzt die Ausgabe?
Wenn ich den Wert jetzt ausgeben würde, würde er doch nur in 0,5er
Schritten ausgegeben werden oder?
Newby schrieb:> Ah ok danke.>> Aber wie genau ist jetzt die Ausgabe?
So wie sie dir der Sensor liefert
> Wenn ich den Wert jetzt ausgeben würde, würde er doch nur in 0,5er> Schritten ausgegeben werden oder?
Wenn dir der Sensor tatsächlich 1/10 Grad liefert, dann stehen die auch
auf der Ausgabe. Wenn der Sensor nur in 0.5 Grad Schritten auflöst, dann
stehen auf der Ausgabe auch nur 0.5°
NOchmal: wo hast du das hier
Ich Datenblatt steht folgende Formel:
count_per_c - count_remain
temperature = temp_read - 0,25 + --------------------------
count_per_c
Wobei Byte 6 Count_remain und Byte 7 count_per_c ist.
Newby schrieb:> Ich Datenblatt steht folgende Formel:
OK. Dann wird das schon stimmen.
Nur, du kannst das nicht so in C umsetzen.
((scratchpad[7] - scratchpad[6]) / scratchpad[7]
das ist eine Integer Division und keine Gleitkommadivision.
Und ausserdem muss temperatur dann eine double Variable sein, so wie du
das hast.
Ich kenn jetzt deine Anwendung nicht, für meine Anwendungen würde dieser
Genauigkeitsboost keine Rolle spielen. Wenn ich eine Raumtemperatur
messe, dann ist die sowieso nicht über den kompletten Raum hinweg
überall auf 1/10 Grad gleich. Eine Anzeige auf 1/10 sugeriert daher eine
Genauigkeit, die schon physikalisch gesehen gar nicht möglich ist. Aber
das ist meine Anwendung. Bei dir mag das anders aussehen.