Forum: Mikrocontroller und Digitale Elektronik LM75 und Datenformat


von Stefanie (Gast)


Lesenswert?

Hallo,
ich verwende den LM75 und empfange schon die beiden (hoffentlich
richtigen) Datenbytes.

Als welchen Datentyp muss ich sie abspeichern, damit das richtige
Ergebnis raus kommt?

Habe schon folgende zwei Versionen getestet:

unsigned char temperatur=0x00,temphalf=0x00,temphelp,teiner,tzehner;
void TEMP_LCD(void)
{
  temphelp = temperatur; //ersten Datenbyte
  teiner = 0x00;
  tzehner = 0x00;

  do
  {
  if (temphelp > 9)    // wenn Temperatur > 9
  {
    temphelp = (temphelp - 0x0a);  // Temperatur - 10
    tzehner ++;  // Ausgabebyte Temp.-Zehner + 1
  }  // end if
  }while (temphelp > 9);    // solange, bis Temperatur < 9

  teiner = temphelp; //Rest in Ausgabebyte Temp.-Einer speichern

  teiner |= 0xb0;        // Korrektur f&#65533;r LCD
  tzehner |= 0xb0;      // Korrektur f&#65533;r LCD
  temphelp = 0x00;
  fprintf(uart,"%d%d,%d", tzehner, teiner, temphalf);
  fprintf(uart,"%o%o,%o", tzehner, teiner, temphalf);
  fprintf(uart,"%u%u,%u", tzehner, teiner, temphalf);
  fprintf(uart,"%x%x,%x", tzehner, teiner, temphalf);
   //nichts hat funktioniert
}

und Version 2:
    int temp = buf[0]*256+buf[1];
            temp >>=7;
            if (temp>512)
                temp &= -1;
    fprintf(uart,"Temperatur %d in Grad Celsius", temp/2.0);
    fprintf(uart,"Temperatur %f in Grad Celsius", temp/2.0);
    fprintf(uart,"Temperatur %e in Grad Celsius", temp/2.0);
auch hier hat nichts funktioniert.

Habt Ihr vielleicht ein Programm, das geht?

von Profi (Gast)


Lesenswert?

Wenn Du auf der Threadliste
http://www.mikrocontroller.net/forum/list-1-1.html
rechts oben "Im Betreff suchen:"
LM75
eingibst, bekommst Du mindestens 30 Treffer, da ist sicher was
passendes für Dich dabei.

Also: zuerst suchen dann fragen.

    fprintf(uart,"Temperatur %d in Grad Celsius", temp/2.0);

geht auf keinen Fall, da die Division ein real-Ergebnis liefert, das
mit %d inkompatibel ist.

Temphalf ist immer 0, da würde ich mal temphelp ausgeben (zum Debuggen,
aber vorher temphelp=0 weglassen).

von Stefanie (Gast)


Lesenswert?

Hab gesucht, daher hab ich ja auch meine Beispiele.

Da der LM75 ja ein sehr gängiger Baustein ist, wollte ich nur fragen,
ob schon wer einen Code in C hat, der funktioniert.

Ich bin mir auch nicht im klaren darüber, mit welchem Datentyp ich
arbeiten muß und wenn ich ehrlich bin, so versteh ich bei beiden
Versionen die Berechnung nicht.
Meiner Meinung nach müsste man erst schauen, ob die Temperatur negativ
(am MSB)ist und dann den Wert berechnen. Probier es selber mal. Ich hab
nur gedacht, dass die Berechnungen oben einen besonderen Trick
beinhalten.

von Rahul (Gast)


Lesenswert?

Der LM75 liefert das Ergebins als Einer-Komplement; negative Werte
werden also mit einer führenden (MSB) "1" gekennzeichnet.
Das LSB hat die Wertigkeit 0,5°C.

von Tom (Gast)


Lesenswert?

Probier doch mal das:
    int temp = buf[0]*256+buf[1];

    fprintf(uart,"Temperatur %f in Grad Celsius", temp/256.0);

oder so:
    fprintf(uart, "Temperatur %d.%d", buf[0], (buf[1] ? 5 : 0));

oder einfach:
        fprintf(uart, "Temperatur %d", buf[0]);
Damit verschenkst du zwar die Nachkommastellen, aber falls die nicht
gebraucht werden ist das einfacher.

von Stefanie (Gast)


Lesenswert?

Ganz herzlichen Dank für die Hilfe!!!
Super, habe selbst viel zu dumm drum rum gedacht.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.