Temperatur messen mit DS1820 und atmeg8

Der Code, den du benutzt, ist für den DS1820 und DS18S20 geschrieben. Das wird so nicht gehen.
Der DS18B20 gibt dir die Temp. im 12-bit Format aus, d.h. dass du eine andere Umrechnung machen musst.
Ganz simpel geht es so:

Dim S As Single
Sc(1) = 1wread(9)
If Sc(9) = Crc8(sc(1) , 8) Then
T = Makeint(Sc(1) , Sc(2))
S = T / 16
Print S
End If

Ist so nicht getestet, sollte aber hinkommen.

HBA
 
Der DS18B20 hat eine höhere Auflösung und der DS18S20 eine Kleinere.
Hallo Cassio,
die Auflösung beider Sensoren ist tatsächlich identisch, 4-bit hinter dem Komma, also 1/16°C.
Der B-Typ gibt sie dir in einem 12-bit (verteilt natürlich auf 2 Byte) Wert aus, falls du die Standard Konfiguration bestehen lässt (kann man über Register festlegen). Der S-Typ gibt dir 8bit aus, wobei die dann wie bekannt mit 0,5° C Auflösung daherkommen. Wenn man 1/16 ° will, dann muss man die etwas aufwändige Umrechnung machen.
Bei beiden kommt aber alles in der 8 Byte Antwort vom Sensor zurück.

HBA
 
Hi HBA!

Na, dann ist ja gut...
Es kommt also in beiden Fällen die gleiche Antwort und sein Array wäre damit auch ausreichend.

Ich hatte eben nur mal schnell eine AppNote durchgesehen und da ist mir wieder aufgefallen, dass der B-Sensor sogar eine einstellbare Ausgabe (nicht Auflösung, sorry!) hat.
Wirklich nett, diese B-Version!

Wenn meine S-Typen aufgebraucht sind, dann werde ich mir auch mal ein paar DS18B20 Sensoren besorgen. ;)

Wünsch ein schönes Wochenende....
Cassio
 
DS1820 / S-Version und B-Version

Hallo zusammen,

ich hab mal grade die beiden datenblätter gegeneinandergehalten. Also beide
haben bei der Ausgabe die gleiche Anzahl Bytes die zurückgeliefert werden.
Allerdings sieht das mit der Funktion der Bits in diesem Datenstrom etwas
anders aus.

Beim DS18S20 ...
0 - LSB : 2^6 ... 2^-1
1 - MSB : Sign
4 - Reserved
6 - Count Remain
7 - Count per °C

Beim DS18B20 ...
0 - LSB : 2^3 ... 2^-4
1 - MSB : Sign + 2^6 ... 2^4
4 - Config Register
6 - Reserved
7 - Reserved

Auf diese Bytes kommt es vor allem drauf an.

Der Temperaturwert muß also aus anderen Bytes des Datenstroms und in
etwas anderer Weise berechnet werden. Auch wenn beide 8 Bytes liefern
kommt nur Müll raus wenn man die falsche Routine verwendet.

Gruß
Dino
 
Moin Dino!

Danke, für das Gegenübersellen....

Damit ist nun völlig klar, dass die im Internet gefundene Berechnung von Someone nicht zu seinem B-Sensor passt. ;)
Gleiches hatte aber HBA und ich auch schon angemerkt....

Btw:
Finde es allerdings nicht in Ordnung, wenn ein User in zwei Foren immer hin und her springt und den jeweils überlassenen oder angepassten Programmcode dann wieder "überprüfen" lässt.
Ich bin der Meinung, wenn man sich mit einer Sache befasst dann sollte man den Code auch verstehen, oder wenigstens versuchen zu verstehen.
Immer nur irgendwelche Codebeispiele zusammen kopieren bringt einen bei späteren Fehlern auch nicht weiter. :cool:

Da aber HBA nicht nur hier schon eine Menge Zeit investiert hat, überlasse ich ihm gern das Feld. ;)

Grüße,
Cassio
 
Hallo zusammen,

Btw:
Finde es allerdings nicht in Ordnung, wenn ein User in zwei Foren immer hin und her springt und den jeweils überlassenen oder angepassten Programmcode dann wieder "überprüfen" lässt.
Ich bin der Meinung, wenn man sich mit einer Sache befasst dann sollte man den Code auch verstehen, oder wenigstens versuchen zu verstehen.
Immer nur irgendwelche Codebeispiele zusammen kopieren bringt einen bei späteren Fehlern auch nicht weiter. :cool:

Da aber HBA nicht nur hier schon eine Menge Zeit investiert hat, überlasse ich ihm gern das Feld. ;)
naja ... Es stört mich eigentlich nicht wenn jemand auch in nem anderen
Forum nach einer Problemnlösung sucht. Das was aber die Sache kompliziert
macht ist, wenn man dann nur Bruchstücke mitbekommt und nicht weiß was
im anderen Forum schon probiert wurde und was nicht. Wenn das Problem
in nem anderen Forum auch behandelt wird dann sollte man es auch schreiben
und erzählen was man da schon ausgeschlossen hat damit wenigstens beide
auf dem aktuellen und gleichen Stand sind.

Das mit dem verstehen des Codes ist natürlich klar. Einfach was abtippen und
blind in den Zeilen rumrühren bringt nix. Wenn man nicht versteht was man
da macht dann bringt die ganze Erklärerei der anderen nix. Das wär so als
wenn man nem Patienten einfach mal nen Arm abhackt (ein paar Zeilen
löschen) in der Annahme das er dann wieder gesund ist (das Programm dann
funktioniert).

Aber genug der Motzerei ;) Weiter im Thema ... :D

Gruß
Dino
 
Hallo Leute!

Nach langer Zeit Pause, habe ich mich entschlossen heute wieder in die Mikroelektronik einsteigen ;-).

Ich habe betreffend des Codes, welcher Markus uns bereitgestellt hat, eine Frage:

Code:
  Sc(1) = 1wread(9)
  If Sc(9) = Crc8(sc(1) , 8) Then
    ' Genauere Temperaturberechnung auf 0,1 °C
    [COLOR=Red][B]I = Sc(1) And 1
    If I = 1 Then Decr Sc(1)
      T = Makeint(sc(1) , Sc(2))[/B][/COLOR]
      T = T * 50
      T = T - 25
      T1 = Sc(8) - Sc(7)
      T1 = T1 * 100
      T1 = T1 / Sc(8)
      T = T + T1
      T = T / 10
      'Temperatur in 0,1 Grad Schritten ausgeben
      Print "Temperatur 1: " ; T ; " Grad"
Die Stelle, wo ich rot markiert habe, komme ich irgendwie nicht ganz nach. Weshalb sc(1) and 1 und denn sc(1) um eins subtrahieren?

Auch ist die Frage, ob diese Formel auch Minus-Temperaturen anzeigt.

Ich habe aus dem Datenblatt die Formel genommen und folgendes dabei gemacht:

Code:
Sc(1) = 1wread(9)
  If Sc(9) = Crc8(sc(1) , 8) Then
    ' Genauere Temperaturberechnung auf 0,1 °C    
    I = Sc(1) And 1
    If I = 1 Then Decr Sc(1)
      T01 = Sc(1) / 2
      T01 = T01 - 0.25
      T0 = Sc(8) - Sc(7)
      T0 = T0 / Sc(8)
      T0 = T0 + T01
      'Temperatur in 0,1 Grad Schritten ausgeben
      Print "Temperatur 2: " ; Fusing(t0 , "##.#") ; " Grad"
Da ich nicht wusste, was

Code:
    I = Sc(1) And 1
    If I = 1 Then Decr Sc(1)
sein soll, und ich weiss, dass Markus wirklich ein Super-Experte in diesem Bereich ist, habe ich einfach angenommen, dass das hier auch rein sollte.

Kann mir da jemand auf die Sprünge helfen?

Besten Dank für eure kompetente Unterstützung im Voraus.

Freundliche Grüsse aus der Schweiz

Shurikn
 
Hallo Zusammen

Nach langer Recherche im Internet, bin ich immer noch nicht drauf gekommen weshalb man den Schritt

Code:
I = Sc(1) And 1 
If I = 1 Then Decr Sc(1)

macht. :(

Leider konnte ich mich auch aus dem Datenblatt nicht schlau machen, wie der 2. byte zu lesen ist. Kann mich hier jemand kurz erklären, oder einen Tipp geben? Evtl mach ich einfach einen Denkfehler, weshalb ich nicht weiterkomme. :eek:

Es ist mir bewusst, dass dieses Thread schon älter ist, aber ich dachte mir, dass es besser ist das alte wiederzugebrauchen als ein neues dafür zu eröffnen.

Besten Dank für eure Bemühungen im Voraus.

Freundliche Grüsse
Shurikn
 
Hi shurikn,

ich versuchs mal ...

also im Datenblatt steht ja folgendes ...
OPERATION – MEASURING TEMPERATURE
The core functionality of the DS18S20 is its direct-to-digital temperature sensor. The temperature sensor
output has 9-bit resolution, which corresponds to 0.5°C steps. The DS18S20 powers-up in a low-power
idle state; to initiate a temperature measurement and A-to-D conversion, the master must issue a Convert
T [44h] command. Following the conversion, the resulting thermal data is stored in the 2-byte
temperature register in the scratchpad memory and the DS18S20 returns to its idle state. If the DS18S20
is powered by an external supply, the master can issue “read time slots” (see the 1-WIRE BUS SYSTEM
section) after the Convert T command and the DS18S20 will respond by transmitting 0 while the
temperature conversion is in progress and 1 when the conversion is done. If the DS18S20 is powered
with parasite power, this notification technique cannot be used since the bus must be pulled high by a
strong pullup during the entire temperature conversion. The bus requirements for parasite power are
explained in detail in the POWERING THE DS18S20 section of this datasheet.
The DS18S20 output data is calibrated in degrees centigrade; for Fahrenheit applications, a lookup table
or conversion routine must be used. The temperature data is stored as a 16-bit sign-extended two’s
complement number in the temperature register (see Figure 2). The sign bits (S) indicate if the
temperature is positive or negative: for positive numbers S = 0 and for negative numbers S = 1. Table 2
gives examples of digital output data and the corresponding temperature reading.
Resolutions greater than 9 bits can be calculated using the data from the temperature, COUNT REMAIN
and COUNT PER °C registers in the scratchpad. Note that the COUNT PER °C register is hard-wired to
16 (10h). After reading the scratchpad, the TEMP_READ value is obtained by truncating the 0.5°C bit
(bit 0) from the temperature data (see Figure 2). The extended resolution temperature can then be
calculated using the following equation:

TEMPERATURE = TEMP_READ - 0,25 + ( COUNT_PER_C - COUNT_REMAIN ) / COUNT_PER_C

Additional information about high-resolution temperature calculations can be found in Application Note
105: “High Resolution Temperature Measurement with Dallas Direct-to-Digital Temperature Sensors”.

und ...

Byte0 - Sc(1) - Temperature LSB (AAh
Byte1 - Sc(2) - Temperature MSB (00h)
Byte2 - Sc(3) - TH Register or User Byte 1*
Byte3 - Sc(4) - TL Register or User Byte 2*
Byte4 - Sc(5) - Reserved (FFh)
Byte5 - Sc(6) - Reserved (FFh)
Byte6 - Sc(7) - COUNT REMAIN (0Ch)
Byte7 - Sc(8) - COUNT PER °C (10h)
Byte8 - Sc(9) - CRC*

und ...

LSB Sc(1) - 2^6, 2^5, 2^4, 2^3, 2^2, 2^1, 2^0, 2^-1
MSB Sc(2) - S , S , S , S , S , S , S , S

also ...

Temp = Sc(1) - 0,25 + ( Sc(8) - Sc(7) ) / Sc(8)

(hoffentlich richtig ;) )

Code:
Sc(1) = 1wread(9)
  If Sc(9) = Crc8(sc(1) , 8) Then
    ' Genauere Temperaturberechnung auf 0,1 °C    
    I = Sc(1) And 1
    If I = 1 Then Decr Sc(1)
      T01 = Sc(1) / 2
      T01 = T01 - 0.25
      T0 = Sc(8) - Sc(7)
      T0 = T0 / Sc(8)
      T0 = T0 + T01
      'Temperatur in 0,1 Grad Schritten ausgeben
      Print "Temperatur 2: " ; Fusing(t0 , "##.#") ; " Grad"

Also ...
I = Sc(1) And 1 .... => Bit0 von Sc(1) ausmaskieren und Ergebnis nach I
Es werden also die halben GradC nach I gespeichert.
Wenn es ein halbes Grad gibt dann wird Sc(1) um 1 vermindert.
Dann wird in T01 mit Sc(1)/2 geladen (könnte man auch mit nem shift machen).
Es werden also die vollen GradC berechnet und in T01 gespeichert.
.....
Aha ... es wird also über einen ziemlich komplizierten Umweg das Bit0 des
Bytes vom LSB-Scratchpad gelöscht. Manoman. Warum machen die das
nicht mit ...

Sc(1).0 = 0

geht das in Bascom nicht ? Einfach ddas Bit auf 0 setzen ?
Das machen die um bei dem folgenden /2 keine 0.5 zu bekommen. Also nur
ganzzahlige Ergebnisse. Das ganze ...

T01 = T01 - 0.25
T0 = Sc(8) - Sc(7)
T0 = T0 / Sc(8)
T0 = T0 + T01

dahinter ist dann die Berechnung aus der Formel.
Ich würde sagen ... von hinten durch die Brust ins Auge. Das ganze ...

I = Sc(1) And 1
If I = 1 Then Decr Sc(1)
T01 = Sc(1) / 2

könnte man mit...

T01 = SHIFT Sc(1) , RIGHT , 1

in einem Befehl erledigen der bestimmt auch noch wesentlich schneller und
speicherplatzsparender ist.

When shifting to the RIGHT, the least significant bit will be shifted out of the variable.
The MS bit becomes zero. Shifting a variable to the right, divides the variable by two.

Gruß
Dino
 
Hallo Dino!

Danke für Deine Ausführungen. Ich glaube, ich komme der Sache einwenig näher :rolleyes: .

Als Markus sein Bascom Code uns zur Verfügung gestellt hat, hat er offensichtlich extra nur mit ganzen Zahlen gerechnet (evtl um Speicher zu sparen). Da ich in meinem Code ja mit Single's arbeite und somit Kommastellen erlaubt sind, meinst Du kann man hier die Ausmaskierung des Bit0s und die anschliessende Überprüfung weglassen?

Code:
I = Sc(1) And 1 If I = 1 Then Decr Sc(1)

Weil im Datenblatt steht bei der Formel ja nicht explizit, dass man einen Shift nach rechts machen muss, oder hab ich hier was falsches verstanden?

TEMPERATURE = TEMP_READ - 0,25 + ( COUNT_PER_C - COUNT_REMAIN ) / COUNT_PER_C

Die MSB Sc(2) sollte ja ein Indikator sein, so wie es im Datenblatt beschrieben ist:

LSB Sc(1) - 2^6, 2^5, 2^4, 2^3, 2^2, 2^1, 2^0, 2^-1
MSB Sc(2) - S , S , S , S , S , S , S , S

The sign bits (S) indicate if the
temperature is positive or negative: for positive numbers S = 0 and for negative numbers S = 1. Table 2
gives examples of digital output data and the corresponding temperature reading.

Somit sollte es doch heissen, dass wenn es um negative Temperaturen geht die Sc(2) = 11111111 sein und bei positive Sc(2)= 00000000. Also müsste doch wenn es 0.5 Grad warm ist MSB 00000000 LSB 00000001 sein und bei -0.5 Grad 11111111 00000001. Im Datenblatt steht jedoch, dass bei -0.5 Grad 11111111 11111111 ist.

Das macht mich irgendwie traurig, dass ich nach so langer Überlegung einfach immer noch nicht verstanden habe. Es kann doch nicht so kompliziert sein :( .

Ich werde zur Sicherheit morgen Morgen nochmals darüber nachzudenken. Evtl machts ja morgen bei mir klick. Falls Du noch welche Tipps hast, wäre ich Dir unendlich dankbar :flowers: .

Grüsse aus der Schweiz
Shurikn
 
Hi,

im Moment fehlt mir grad etwas die Zeit um alles zu beantworten. Nur soviel ...

Da ich in meinem Code ja mit Single's arbeite und somit Kommastellen erlaubt sind, meinst Du kann man hier die Ausmaskierung des Bit0s und die anschliessende Überprüfung weglassen?

Code:
I = Sc(1) And 1 If I = 1 Then Decr Sc(1)

Weil im Datenblatt steht bei der Formel ja nicht explizit, dass man einen Shift nach rechts machen muss, oder hab ich hier was falsches verstanden?
da hast du was falsch verstanden.
Das Byte im Sc(1) kann Werte von 0..255 annehmen. Das niederwertigste
Bit bedeutet aber nicht 1 sondern 0,5. Damit zählt das Byte also von
0*0,5...255*0,5 . Wenn du die Division (also /2 oder auch mit Shift) wegläßt
hast du immer die doppelte Tempereatur in der Anzeige weil das Byte ja im
Wert von 0...255 geht und nicht von 0...128°C. Verstanden ? Es kommt also
auf die Wertigkeit des untersten Bits an. Das wär so als wen du bei ner
Dezimalzahl einfach mal das Komma ne Stelle nach rechts schieben würdest.

Beispiel mit Dezimal ...
Du mißt ne Temperatur von 0...100°C. Der AD-Wandler des Sensors liefert
dir aber Werte von 0...1000 . Also was machst du ? Du dividierst durch 10
um auf 0...100,0 zu kommen.

Beim DS18S20 ist das genau das selbe.

Gruß
Dino
 
Besten Dank für Deine Erklärungen trotz des Zeitmangels.

Ich glaube, diesmal hast Du's wirklich so einfach erklärt, sodass sogar ein Kind es verstehen kann... :) Danke

Ich werde noch einwenig über die Minustemperaturen nachdenken, vielleicht fällt es mir jetzt ja nach deine Erklärungen ja leichter ;)

Nochmals herzlichen Dank

Beste Grüsse
Shurikn
 
Ich werde noch einwenig über die Minustemperaturen nachdenken, vielleicht fällt es mir jetzt ja nach deine Erklärungen ja leichter ;)
Such mal nach "Zweierkomplement" und dann vergleich mal die Erklärung
mit der Tabelle mit den Beispieltemperaturen des Datenblatts mit der
Erklärung. Dann fällt es dir wie Schuppen aus den Haaren :D

Gruß
Dino
 
Hi Dino,

Tausend Dank!!!! Ohne Dich wär ich nie aufs Zweierkomplement gekommen. Jetzt hab ich das verstanden und was neues dazu gelernt ;).

Jetzt muss ich nur noch schauen, ob der Formel, so wie ichs gemacht hab mit den Single's auch die Minus-Temperaturen korrekt anzeigen. (Werde wohl erst am Dienstag dafür Zeit haben).

Beste Grüsse
Shurikn
 

Ü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)