Seite 1 von 2

Problem mit DS18X20 und Wil´s Software auf ETH_M32

Verfasst: 22.10.2008, 18:38:34
von Erni
Ich bekomme die Dallas Temp-Sensoren mit Wil´s Software nicht ans laufen. Mit OW werden beide Sensoren erkannt, mit OWREAD kommt als Ergebnis nur 0.
Hab auch den SD-Card-Reader und das EEprom wie im WEBMODUL nachgerüstet, weil ich dachte daran könnte es liegen - leider nicht.
Hat vielleicht jemand ne Idee wo mein Denkfehler liegt :?:
Vielen Dank für jede Antwort!!!
Erni

Re: Problem mit DS18X20 und Wil´s Software auf ETH_M32

Verfasst: 22.10.2008, 21:53:08
von wil
Hallo,
der Befehl OW scannt den 1-wire bus nach Sensoren. Diese melden sich in irgendeiner normalerweise nicht vorhersagbaren Reihenfolge. Solange du nichts an den Anschlüssen (Reihenfolge) änderst, werden sich die Sensoren wahrscheinlich immer in der gleichen Reihenfolge melden. ... nur sicher ist das nicht.

Daher habe ich von meinen bekannten Sensoren (von denen ich weiss welche Temparatur sie messen) die feste ID ausgelesen (mittels OW) und dann hart codiert ihnen Speicherplätze zugewiesen.
Also etwa so:
  • Sensor an Webmodul anhängen
  • mit OW Befehl den Sensor auslesen. Das ergibt z.Bspl.
    #1 ist ein DS18S20/1820 mit externer Spannungsversorgung.
    FC:10 (18S)SN: 26 5f 24 1 8 0 CRC:a6 CRC O.K. 0 23.0001 C 231
  • in der config.h die ID des Sensors eintragen:

    Code: Alles auswählen

    	// hier die ausgelesenen ROM-IDs der DS18B20 eintragen
    	#define OW_ID_T01		{0x10,0x26,0x5f,0x24,0x01,8,0,0xa6}
    
  • Sensor am 1-wire Bus montieren und OW@01 bzw. OW@21 mit der entsprechenden Messstelle bezeichnen
Der Cardreader und das EEPROM haben absolut nicht mit 1-wire zu tun. :o

Gruß
wil

Re: Problem mit DS18X20 und Wil´s Software auf ETH_M32

Verfasst: 22.10.2008, 23:10:33
von AVRnet
Habe selbes Problem wie Erni.

Ich kann mittels OW meine beiden DS1820 Sensoren scannen und alle Daten werden ordnungsgemäß auf der Console ausgegeben,
aber wenn ich die ID wie im oben angegeben Thread in die config.h eintrage,
dann zeigt der Befehl OWREAD trotzdem als Wert immer 0 an.

Ausgabe von OW
Scanning Bus for DS18X20
2 1-Wire Sensoren gefunden.

#1 ist ein DS18S20/DS1820 mit externer Spannungsversorgung. 10 (18S)24 5a 24 1 8 0 c3 CRC O.K. 0 19.0010 C 196
#2 ist ein DS18S20/DS1820 mit externer Spannungsversorgung. 10 (18S)4c 67 24 1 8 0 43 CRC O.K. 0 19.0007 C 194
Ausgabe von OWREAD
Fixed T-Sensor Werte:
1: 0
2: 0
In der config.h habe ich eingetragen
/** 1-Wire ************/
#define USE_OW 1 // 1-Wire bus einbinden
#define MAXSENSORS 2 // max. Anzahl der 1-wire sensoren (DS18B20)
#define OW_ONE_BUS 1 // nur ein fest eingestellter 1-wire bus; keine Auswahl
// die Ports werden in onewire.h definiert
#define OW_ROMCODE_SIZE 8 // rom-code DS18B20 size including CRC

// hier die ausgelesenen ROM-IDs der DS18B20 eintragen
#define OW_ID_T01 {0x10,0x24,0x5a,0x24,0x01,8,0,0xc3}
#define OW_ID_T02 {0x10,0x4c,0x67,0x24,0x01,8,0,0x43}

#define OW_ID_T03 {0x28,0x11,0x22,0x33,0x44,0,0,0x77}
#define OW_ID_T04 {0x28,0x22,0x33,0x44,0x55,0,0,0x77}
#define OW_ID_Last {0x00,0x00,0x00,0x00,0x00,0,0,0x00}
Ich habe bereits den Sourcecode rauf- und runter durchsucht um evt. selber an des Rätsels Lösung zu kommen,
aber leider vergebens......

Ich hoffe jemand hat noch einen guten Tip,
ich stehe mit meinen bisherigen Kenntnissen zurzeit absolut in der Luft und weiss nicht woran es noch liegen könnte

P.S.: Ich verwende (avr-webserver093.zip)

Re: Problem mit DS18X20 und Wil´s Software auf ETH_M32

Verfasst: 23.10.2008, 07:49:34
von Erni
Hallo Wil,
benutzt Du evtl. DS18B20 Sensoren?
Beim auslesen mit OW kommt als Meldung:
#1 ist ein DS18S20/DS1820 mit parasitaerer Spannungsversorgung. 10 (18S)37 5d ff 0 8 0 77 CRC O.K. 0 17.0010 C 176
#2 ist ein DS18S20/DS1820 mit parasitaerer Spannungsversorgung. 10 (18S)43 31 ff 0 8 0 3 CRC O.K. 0 17.0014 C 179

Liegt es vielleicht daran das ich die DS18S20 verwende? An der parasitären SV dürfte es wohl nicht liegen. Ansonsten die ausgelesenen Werte hatte ich schon in der config.h eingetragen.
Also: #define OW_ID_T01 {0x10,0x37,0x5d,0xff,0x00,8,0,0x77}
#define OW_ID_T02 {0x10,0x43,0x31,0xff,0x00,8,0,0x03}

Ergebnis weiterhin =0 :(

Noch ne Idee :?:
Vielen Dank
Erni

Re: Problem mit DS18X20 und Wil´s Software auf ETH_M32

Verfasst: 23.10.2008, 14:02:09
von wil
Hallo,

ich habe bei mir natürlich nur DS18B20 und daher beim lesen der vordefinierten IDs auf DS18B20 abgeprüft (haben dort 28 wo beim 18S20 eine 10 steht).
Die geänderte Routine aus messung.c hier:

Code: Alles auswählen

/**
 *	\ingroup messen
 *	bekannte DS18x20 auslesen
 */
void lese_Temperatur(void)
{
#if USE_OW
	uint8_t i = 0;
	uint16_t TWert;
	uint8_t subzero, cel, cel_frac_bits;
	uint8_t tempID[OW_ROMCODE_SIZE];

	memcpy_P(tempID,DS18B20IDs[0],OW_ROMCODE_SIZE);	// erste ID ins RAM holen

	while (tempID[0] != 0 ) {  // <<<--- auf 0 testen; nicht nur auf DS18B20_ID
		// T messen
		if ( DS18X20_start_meas( DS18X20_POWER_PARASITE, tempID ) == DS18X20_OK ) {

			_delay_ms(DS18B20_TCONV_10BIT);
			if ( DS18X20_read_meas( tempID, &subzero,&cel, &cel_frac_bits) == DS18X20_OK ) {
				TWert = DS18X20_temp_to_decicel(subzero, cel, cel_frac_bits);
				ow_array[i] = TWert;
			}
			else {
				MES_DEBUG("\r\nCRC Error (lost connection?) ");
				//DS18X20_show_id_uart( tempID, OW_ROMCODE_SIZE );
			}
		}
		else MES_DEBUG("\r\n*** Messung fehlgeschlagen. (Kurzschluss?) ***");

		memcpy_P(tempID,DS18B20IDs[++i],OW_ROMCODE_SIZE);	// nächste ID ins RAM holen
	}
#endif

}
Der DS18B20 hat eine feste Auflösung von 9 bit. In messung_init() initialisiere ich die DS18B20 auf 10 bit Genauigkeit, was beim DS18S20 keinen Sinn macht. Man kann daher die folgende Anweisung aus messung_init löschen:

Code: Alles auswählen

	#if USE_OW
	set_SensorResolution();
	#endif
Ich hoffe es klappt jetzt :)

Re: Problem mit DS18X20 und Wil´s Software auf ETH_M32

Verfasst: 23.10.2008, 15:05:15
von AVRnet
Es funktioniert :P

Vielen Dank für die Unterstützung Wil !!

Eine Frage habe ich noch bezüglich des Temperaturbereiches:
Wie sieht es mit Werten unter 0 Grad aus ?

Bevor ich mir jetzt eine lange Leitung in die Küche ins Eisfach lege,
frage ich doch hier mal nach :roll:

Re: Problem mit DS18X20 und Wil´s Software auf ETH_M32

Verfasst: 23.10.2008, 16:59:01
von Erni
Vielen Dank Wil!!!

aber bei mir funktionierts leider nicht. :( Wenn ich die Änderungen in der Messung.h mache, bekomme ich als Meßergebnis= 850 also 85 Grad für beide Sensoren.

Glückwunsch AVRnet!
könntest Du evtl. Deine messung.c und config.h zum Download einstellen, oder mir per Mail mal schicken, vielleicht hat sich ja doch ein Tippfehler eingeschlichen.
Hast Du sonst noch Dateien von der "avr-webserver093.zip" geändert?

Vielen Dank
Erni

Re: Problem mit DS18X20 und Wil´s Software auf ETH_M32

Verfasst: 23.10.2008, 18:01:24
von wil
@Erni:
The power-on reset value of the temperature register is +85°C.
So steht es im Datenblatt des DS18S20.
Hast du parasitäre Power verwendet oder ist Pin 3 auch an Vcc angeschlossen? Falls du mal mehrere Sensoren an lange Kabel anhängen willst ist es sinnvoll nicht unbedingt auf 1-wire plus Gnd zu bestehen :!:
Ansonsten habe ich grad gesehen, dass der DS18S20 die vollen 750ms zum konvertieren benötigt. Der DS18B20 kann von 9bit bis 12 bit eingestellt werden. Ich habe es auf 10 bit runtergestellt (siehe Beitrag oben). Dann benötigt das Teil nur noch ein Viertel der Zeit (187,5 ms). Bei mehreren von den Dingern kann es sonst schnell mal zu einigen Sekunden Messzeit anwachsen.
In der lese_Temperatur() steht ein delay() drin. Ändere den mal auf die vollen 750 ms ab.

Code: Alles auswählen

			_delay_ms(DS18S20_TCONV);
@AVRnet:
Eh, naja -- meine Sensoren hängen an Wasserleitungen (Heizung) und bis jetzt ist da noch nichts eingefroren. Meinen Aussensensor habe ich erst im April/Mai montiert und der Sommer war zwar nix gescheites dieses Jahr, aber so schlimm wars nun auch nicht, dass ich da schon Minus gemessen hab :roll:
Aber wenn ich mir dann nochmal den Code ansehe ... da steht doch glatt "returns absolute value of temperatur in decicelsius" bei der Routine um die Messwerte mit Nachkommastellen in Celsius umzurechnen. Man sollte wohl den Code noch so ändern:

Code: Alles auswählen

				if (subzero)
					TWert *= (-1);
				ow_array[i] = TWert;
Werde das mal austesten :wink:

Gruß
wil

Re: Problem mit DS18X20 und Wil´s Software auf ETH_M32

Verfasst: 23.10.2008, 19:22:44
von AVRnet
Das ist ein Versuch Wert... :)
Ich teste das mal mit meinem Eisfach und berichte dann meine Ergebnisse.

Re: Problem mit DS18X20 und Wil´s Software auf ETH_M32

Verfasst: 23.10.2008, 20:59:19
von Erni
Danke Wil!!!

Jetzt misst er die Temperaturen richtig :D
Momentan läuft das ganze ja noch als Versuchsaufbau, aber später werden die Sensoren mit VCC gespeist.

Nochmals 1000 Dank - das mit den Timern hätte ich als Anfänger nie herausgefunden.

Erni

Re: Problem mit DS18X20 und Wil´s Software auf ETH_M32

Verfasst: 26.10.2008, 11:13:09
von AVRnet
Hallo,

ich möchte gern die Temperatur auf einem LCD ausgeben.
Allerdings wird die Temperatur ohne das Trennungszeichen ausgegeben ( zb. 223 anstatt 22,3 )

Ich habe versucht mich an den Code der httpd.c zu halten um das Komma zu setzen.
Auszug aus der http.c

Code: Alles auswählen

if (b >= 20) {	// Offset bei Sensor# abziehen und Wert als Dezimalzahl ausgeben
					b -= 20;
					int8_t i = (int8_t)(ow_array[b] / 10);
					itoa (i,var_conversion_buffer,10);
					str_len = strnlen(var_conversion_buffer,CONVERSION_BUFFER_LEN);
					var_conversion_buffer[str_len] = ',';
					str_len++;
					memmove(&eth_buffer[TCP_DATA_START+a],var_conversion_buffer,str_len);
					a += str_len;
					i = ow_array[b] % 10;
					itoa (i,var_conversion_buffer,10);
				} else {
					itoa (ow_array[b],var_conversion_buffer,10);
				}
Hat jemand einen Ansatz oder Lösungsvorschlag ??

Re: Problem mit DS18X20 und Wil´s Software auf ETH_M32

Verfasst: 26.10.2008, 23:59:04
von AVRnet
NACHTRAG:

Ich habe das erfolgreich erstmal so gelöst:

Code: Alles auswählen

sprintf(TEMP_I,"INNEN: %i.%i",(ow_array[0] / 10),ow_array[0] %10); //Innen
sprintf(TEMP_A,"AUSSEN: %i.%i",(ow_array[1] / 10),ow_array[1] %10); //Aussen

Re: Problem mit DS18X20 und Wil´s Software auf ETH_M32

Verfasst: 27.10.2008, 13:51:19
von AVRnet
Den Eisfachtest habe ich gerade abgeschlossen und bin zu folgendem Ergebnis gekommen:

Beim ungeänderten Code wird bei 0 einfach wieder hochgezählt
(Es fehlt praktisch nur das "minus" als Vorzeichen)

Mit der von Wil vorgeschlagenen Codeänderung bekomme ich Werte um die 65000 °C:
while (tempID[0] !=0 ) {
// T messen
if ( DS18X20_start_meas( DS18X20_POWER_PARASITE, tempID ) == DS18X20_OK ) {

//_delay_ms(DS18B20_TCONV_10BIT);
if ( DS18X20_read_meas( tempID, &subzero,&cel, &cel_frac_bits) == DS18X20_OK ) {
TWert = DS18X20_temp_to_decicel(subzero, cel, cel_frac_bits);
if (subzero)
TWert *= (-1);

ow_array = TWert;
}
else {
MES_DEBUG("\r\nCRC Error (lost connection?) ");
//DS18X20_show_id_uart( tempID, OW_ROMCODE_SIZE );
}
}
else MES_DEBUG("\r\n*** Messung fehlgeschlagen. (Kurzschluss?) ***");

memcpy_P(tempID,DS18B20IDs[++i],OW_ROMCODE_SIZE); // nächste ID ins RAM holen
}

@Wil
Hast du noch einen Tip wie man die Änderung noch anpassen könnte ?

Re: Problem mit DS18X20 und Wil´s Software auf ETH_M32

Verfasst: 28.10.2008, 01:38:50
von wil
Hallo AVRnet,

du musst natürlich alle Speicherplätze (TWert und ow_array) von uint16_t nach int16_t abändern. Beim ow_array hatte ich das aber auch vergessen :( Dann fehlt noch die passende Stringkonvertierung für html bzw. E-mail. Sieh dir mal die Änderungen in der neuen Version (1.1.01) an.

Die Stringkonvertierung kannst du auch direkt so machen:

Code: Alles auswählen

sprintf(TEMP_I,"INNEN: %f",ow_array[0] / 10.0);
oder mit der dtostrf() Funktion.

Re: Problem mit DS18X20 und Wil´s Software auf ETH_M32

Verfasst: 28.10.2008, 10:42:55
von AVRnet
Hi Wil,

habe die aktuelle 1.1.0.1 gerade geladen und getestet.
Funktioniert 1A mit den Temperaturwerten unter 0 :D

Code: Alles auswählen

dtostrf(ow_array[1] / 10.0,3,1,TEMP_A);
...hat den erwünschten Temperaturwert inkl. Vorzeichen in die TEMP_A Variable geschrieben...

Vielen Dank nochmal!!
weiter so...

Gruß