Guten Tag,
ich habe eine sicherlich eigentlich ganz einfache Frage. Ich habe noch
ein paar alte DS1820 da und möchte die Temperatur auslesen.
Nun habe ich die hier ja bereits viel bekannte Library von Peter
Dannegger verwendet. Leider hat sie meinen DS1820 nicht erkannt, da er
einen alten Romcode, 0x22 hat. Dies habe ich experimentiert angepasst.
Nun habe ich mit der Temperaturumrechnung etwas experimentiert komme
aber nicht weiter. Ich hoffe das hier wer den Fehler einfach sieht.
Es soll die aktuelle Temperatur als dreistellige Dezimalzahl ausgegeben
werden. z.B. 22,0 = 220.
hier mal der Code ausschnitt:
1
uint16_tread_meas(void)
2
{
3
uint16_trueckgabe=0;
4
ucharid[8],diff;
5
uinttemp;
6
7
for(diff=SEARCH_FIRST;diff!=LAST_DEVICE;){
8
diff=w1_rom_search(diff,id);
9
10
if(diff==PRESENCE_ERR){
11
errormsg("No Temp Sensor");
12
break;
13
}
14
if(diff==DATA_ERR){
15
errormsg("Temp Bus fail");
16
break;
17
}
18
if(id[0]==0x22||id[0]==0x10){// temperature sensor DS1820 & DS1822
Hallo Wolfgang,
es ist ein DS1820 (dieser ist nicht mehr in Produktion) er soll
baugleich mit dem DS18S20 sein hat aber eine etwas schnellere
Konversionszeit.
MfG Martin
Der DS1820 hat den selben Familycode wie der DS18S20 -> 10h. Der DS1822
z.B. hat den Familycode 22h.
Die Sensoren DS1820 und DS18S20 sind auch nicht baugleich. Der DS1820
arbeitet intern mit zwei Generatoren und Counter, und beim DS18S20
funktioniert die Wandlung mit einen Sigma-Delta A/D-Wandler. Was zur
Folge hat, dass der DS1820 verschiedene Werte für 'COUNT PER °C'
liefert. Dieses Register ist beim DS18S20 aus Kompatibilitätsgründen
noch vorhanden, und liefert immer den Wert 16 (10h).
Solange man nur mit der 9bit-Auflösung (0,5 K) arbeitet ist das kein
Problem. Wenn man aber die volle Auflösung möchte, muss man das
berücksichtigen.
Funktioniert ein DS18S20 in deiner Schaltung?
Gruß
John
Ist ja interessant, der DS1820 hat ja noch keine Bandgap, sondern
arbeitet mit zwei Oszillatoren mit verschiedenen
Temperaturkoeffizienten.
Für die moderneren mit Bandgap habe ich hier einen sehr kompakten Code
entwickelt:
Beitrag "DS18S20 - extended resolution bei Temperaturen um 0°C"
Reichen Dir 0,5°C Auflösung?, dann ist es ja sehr einfach.
Wenn nicht, musst Du die Formel mit dem CountRemain verwenden, die im
Datenbuch angegeben ist. Dabei aufpassen: wenn Du mit signed-Variablen
arbeitest, stimmt das Ergebnis evtl. nicht.
Hier im Forum sind mehrere Codes gepostet.
Was mich interessiert: welchen Wert hat CountsPerDegree bei
verschiedenen Temperaturen? Der ist nämlich nicht konstant, sondern von
der Temperatur abhängig. Kannst Du mal bitte ein paar Werte posten?
Wenn Du Dir die Division sparen willst, reicht es evtl. für die
Genauigkeit aus, den festen Wert 128 CountsPerDegree zu verwenden (>>7).
Nabend,
es ist wirklich ein DS1820. Habe davon noch ein paar und würde sie
deswegen gerne noch einsetzen. Die Schaltung hat keine Hochgenauen
Ansprüche. Es ist eine Temperaturüberwachung von Akkus für den
Modellbau.
Es reichen 0.5 °C. Das mit der Variablen 'COUNT PER °C' wuste ich ja gar
nicht, interessant.
Leider hat Maxim ja das alte Datenblatt auch nicht mehr online und hier
im Forum ist auch das von DS18S20 für den DS1820 drin.
Dann muss ich mir wohl doch nochmal genauer angucken wie er
funktioniert. Ich hatte mich bis jetzt am DS18B22 orientiert und über
die komischen Werte gewundert.
Interessanter weise kommt meine empirisch ermittelte Umrechnung recht
gut hin.
MfG Martin
Finde ich auch schade, dass man auf deren HP das Datenblatt nicht mehr
findet, genauso wenig die app105.
Trau der Beschriftung nicht! Ich habe von Pollin welche, auf denen
DALLAS DS1820 1022C4 +824AJ steht, aber sicher keine DS1820, sondern
DS18S20 sind (countPerDegree ist immer 16).
Kannst Du mal die Seriennummer auslesen und mit dem exakten Aufdruck
posten?
Meine: 0008020b798c und 0008020b76e0
Scanning-Bus-for-DS18X20
2-DS18X20-Sensor(s)-available:
#-in-Bus-:1-:-FC:10-(18S)SN:-8C-79-0B-02-08-00-CRC:5F--CRC-O.K.-
#-in-Bus-:2-:-FC:10-(18S)SN:-E0-76-0B-02-08-00-CRC:8E--CRC-O.K.-
Sensor#-1-is-a-DS18S20/DS1820-which-is-parasite-powered
Sensor#-2-is-a-DS18S20/DS1820-which-is-parasite-powered
DS18B20 hat FC 0x28
Nabend,
also auf meinem steht:
Dallas
DS1820
0708C3
+369AA
den ROMCODE lese ich nachher mal aus.
Danke für das PDF.
Wie macht ihr die Umrechnung den ?
Gruß Martin
So ein misst hab es doch glatt im falschen Tread gepostet.
Vielleicht hilft euch das hier weiter:
Temp_read = (scratchpad[0]) * 0.5 ;
Count_Remain = scratchpad[6];
Count_PER_C = scratchpad[7];
temp = (float)Temp_read -0.25 + ((Count_PER_C - Count_Remain) /
Count_PER_C) ;
Für negative Temperaturen müsste man scratchpad[1] einer Variablen zu
weisen und prüfen ob FFh drinne steht.
Wenn FFh ein Flag setzen für die Ausgabe des minus Zeichen.
Dann das Zweierkomplement bilden mit scratchpad[0]) und
denn Rest normal weiter rechnen lassen.
Die Berechnung oben löst die Temperatur in 0,1 °C schritten auf.