PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 1-wire Temperatur in Variable speichern



Haveaniceday
02.09.2009, 08:06
Hallo zusammen,
ich hab mich jetzt mal an 1-wire Temperatursensoren versucht und benutze dafür den Code von Peter Dannegger. Ich würde gerne die aktuellen Messwerte in Variablen speichern, um Beispielweise damit eine Heizung zu regeln.
Leider finde ich momentan keinen wirklichen Ansatz, würde mich sehr freuen wenn ihr mir Anregungen geben könntet.
Ich denke, ich muss erstmal die Adressierung (ID) vom Sensor festlegen um sicher zu sein das auch die richtige Temperatur gemessen wird. Im Programm vom Peter Dannegger sieht es ja so aus, das automatisch nach allen Sensoren gesucht wird und dann von allen Sensoren die gefunden wurden die Temperaturen ausgeben wird…

Vielen Dank schonmal

Gruß Hannes

sast
02.09.2009, 08:43
http://www.mikrocontroller.net/topic/38252

sast

Haveaniceday
02.09.2009, 11:12
Danke für deine Antwort, aber der Thread hilft mir nicht ganz weiter, bin schon mal über ihn gestolpert...

Bin eher auf der suche nach einem schönen Beispielcode oder einer guten Erklärung wie es ungefähr gehandhabt wird...

sast
02.09.2009, 11:40
Also alles was du brauchst steht da bzw im Code von Peter, wenn du den da (http://www.mikrocontroller.net/topic/14792#new) her hast.

uchar w1_rom_search( uchar diff, uchar idata *id );
aus der 1wire.c sucht dir alle 1-wire devices raus und danach solltest du darauf zugreifen können. Hab mir das jetzt nicht genauer angesehen aber ich verstehe das so, dass wenn du jedes Gerät nacheinander anschließt und dir die ID geben läßt vom neu hinzugekommenen, dann kannst du diese auch eindeutig den Temperatursensoren zuordnen.

Zur Not bastelst du dir ein struct und ein struct-array in dem alle Sensoren der Reihenfolge ihres Anschließens nach aufgenommen werden und kannst das ganze im EEPROM des Controllers ablegen. Dazu brauchst du nur so eine Art Init zu implementieren.

sast

Haveaniceday
02.09.2009, 16:46
Also die ID´s von den Sensoren hab ich bereits ausgelesen, das ist nicht das problem... Aber halt nicht wie ich sie in Variablen speichere.
Habs jetzt folgender maßen probiert:



if (id == 0xB37C720108009B)
{
temp = temp1;

sprintf( sa, " T: %04X = ", temp1 ); // hex value
uputs( sa );
sprintf( sa, "%4d.%01døC", temp1 >> 4, (temp1 << 12) / 6553 ); // 0.1øC
uputsnl( sa );
}



Aber funktioniert leider nicht :(

sast
02.09.2009, 17:00
In was für Variablen willst du es denn speichern? temp und temp1 sind doch schon Variablen.

Wofür soll das shiften gut sein? Was geht denn nicht? Welche Größe haben die Werte 8Bit, 16bit, 32bit? Ist die ID so korrekt? Warum teilst du durch 6553? Soll das vielleicht 65535 heißen?

Fragen über Fragen und keine Ahnung, welchen Typ deine Variablen temp und temp1 haben und wie du was in temp1 schreibst. Wenn du willst, dass dir jemand einen Fehler findet, musst du schon mal zeigen wo denn der Fehler drin sein könnte.

sast

Haveaniceday
02.09.2009, 17:28
Also die Variable "temp" verwendet Peter Dannegger in seinem Progra m für die aktuelle Temperatur . Somit wollte ich immer wenn die ID vom 1 Sensor angesprochen wird die ich in "temp1" speichern will, über diese if Bedingung.

Die Änderungen hab ich in der tempmeas.c vorgenommen und sieht dann folgender maßen aus.



void start_meas( void ){
if( W1_IN & 1<< W1_PIN ){
w1_command( CONVERT_T, NULL );
W1_OUT |= 1<< W1_PIN;
W1_DDR |= 1<< W1_PIN; // parasite power on

}else{
uputsnl( "Short Circuit !" );
}
}


void read_meas( void )
{
uchar id[8], diff;
uchar s[30];
uchar sa[30];
uchar i;
uint temp;
uint temp1;

for( diff = SEARCH_FIRST; diff != LAST_DEVICE; ){
diff = w1_rom_search( diff, id );

if( diff == PRESENCE_ERR ){
uputsnl( "No Sensor found" );
break;
}
if( diff == DATA_ERR ){
uputsnl( "Bus Error" );
break;
}
if( id[0] == 0x28 || id[0] == 0x10 ){ // temperature sensor
uputs( "ID: " );
for( i = 0; i < 8; i++ ){
sprintf( s, "%02X ", id[i] );
uputs( s );
}
w1_byte_wr( READ ); // read command
temp = w1_byte_rd(); // low byte
temp |= (uint)w1_byte_rd() << 8; // high byte
if( id[0] == 0x10 ) // 9 -> 12 bit
temp <<= 3;
sprintf( s, " T: %04X = ", temp ); // hex value
uputs( s );
sprintf( s, "%4d.%01døC", temp >> 4, (temp << 12) / 6553 ); // 0.1øC
uputsnl( s );
}

if (id == 0xB37C720108009B)
{
temp = temp1;
sprintf( sa, " T: %04X = ", temp1 ); // hex value
uputs( sa );
sprintf( sa, "%4d.%01døC", temp1 >> 4, (temp1 << 12) / 6553 ); // 0.1øC
uputsnl( sa );
}

}
uputsnl( "" );
}


Die Berechnungen der Variablen "temp" bei der ausgabe habe ich so übernommen und funktioniert auch... Nur wenn ich versuche die temp1 auszugeben wird nur 0 angezeigt...

sast
02.09.2009, 20:48
Ja natürlich wird nur 0 angezeigt, weil deine Variable temp1 am Anfang auf 0 initialisiert wird. Das macht der Compiler schon für dich. Und zu allem Überfluss setzt du auch noch temp auf 0 indem du temp=temp1; schreibst, was nichts anderes heißt als temp=0;

Es reicht nicht aus, nur den Code anderer zu kopieren. Viel wichtiger ist es ihn zu verstehen, sonst wirst du ewig an solchen kleinen Ecken hängen bleiben. Solche Grundlagen müssen sitzen bevor man sich an größere Sachen heran wagt.

Es gibt eine Menge online Tutorial über C die man sich mal antuen kann. Zumindest eins davon. Bei einer Zuweisung wie temp=temp1; wird nämlich der Wert der Variable auf der rechten Seite des Zuweisungsoperators der Variable auf der linken Seite zugewiesen. Und da du ja temp1 nie mit irgendetwas beschrieben hast, steht da immer noch die 0 drin. Dann nimmst du genau diese nie veränderte Variable temp1 und läßt dir ausgeben was da drin steht. Wer hätte das gedacht, da steht 0 drin. ;o)

Kurz und gut mach ma temp1=temp;

Und dann lies mal ein bisschen was in den C Grundlagen bis Array und struct.

Im übrigen unterscheidet sich deine id doch stark von der die Peter hier abfragt ich vermisse hier die 0x28 oder 0x10. Bist du dir sicher, dass deine if (id==hastenichtgesehen) überhaupt true ergibt. Da wären wir dann wieder bei den Grundlagen. Typen, Arrays, if-Abfragen sind da nur ein paar gut gemeinte Stichpunkte.

sast