Forum: Mikrocontroller und Digitale Elektronik Hilfe, komme nicht weiter. Temperatur von 0 bis -1 Grad kein negatives Vorzeichen.


von Stefan B. (sibbl) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hallo geschätztes Forum,

ich bin an einem Punkt, an dem ich nicht weiter komme und mich deshalb 
an Euch wende.

Ich bin gerade an einem Versuchsaufbau eines Thermo/Hygrometers. Soweit 
läuft auch alles bestens, bis auf eine kleine Sache, die mich echt in 
den Wahnsinn treibt.
Bei einer Temperatur zwischen 0 und -1 Grad wird kein "-" angezeigt. 
Darunter, also ab -1 Grad schon. Ich habe auch keinen Anhaltspunkt, wo 
überhaupt das Problem bestehen könnte.

Ich würde mich über den einen oder anderen Tipp freuen.

Danke im Vorraus...

Gruss Stefan

von (prx) A. K. (prx)


Lesenswert?

Wenn du willst, dass -0.5/10 ein negatives Vorzeichen hat, dann solltest 
du im Einerkomplement rechnen, nicht im Zweierkomplement. Denn nur dann 
gibt es eine negative 0.

von Karl H. (kbuchegg)


Lesenswert?

> temp_val.i/10

logisch.
wenn dein Wert -5 ist (als Repräsentierung für -0.5), dann ergibt -5/10 
nun mal eine glatte 0. Und die wird ohne Vorzeichen (also positiv) 
ausgegeben.

von Joachim .. (joachim_01)


Lesenswert?

lcd_string_format("T: %i.%i C    \nH: %i.%i %%" , temp_val.i/10, 
abs(temp_val.i%10), humid_val.i/10, humid_val.i%10);

... abs(temp_val.i%10)...

Absolutwert steht für: den Wert einer Zahl losgelöst von ihrem 
Vorzeichen...

von Stefan B. (sibbl) Benutzerseite


Lesenswert?

Hmmm....

Danke erstmal....

Nur wie stelle ich das an? Ich hätte gerne das Zweierkomplement 
beibehalten, da dann später noch ne Menge an Programmierung rankommen 
soll und es für mich so am einfachsten wäre, da ich erst am Anfang 
meiner "GCC-Fähigkeiten" stehe.

Ich hoffe, Ihr verzeiht mir.


Gruss

von (prx) A. K. (prx)


Lesenswert?

Joachim ... schrieb:
> Absolutwert steht für: den Wert einer Zahl losgelöst von ihrem
> Vorzeichen...

Und? Dieser Teil stimmt. Soll ja nicht 0.-5 dastehen.

von Karl H. (kbuchegg)


Lesenswert?

Stefan B. schrieb:
> Hmmm....
>
> Danke erstmal....
>
> Nur wie stelle ich das an? Ich hätte gerne das Zweierkomplement
> beibehalten,

Die Zahl an sich ist ja in Ordnung.
Nur für die Anzeige wirst du dir selber eine Funktion schreiben müssen.

von Stefan B. (sibbl) Benutzerseite


Lesenswert?

Joachim ... schrieb:
> lcd_string_format("T: %i.%i C    \nH: %i.%i %%" , temp_val.i/10,
> abs(temp_val.i%10), humid_val.i/10, humid_val.i%10);
>
> ... abs(temp_val.i%10)...
>
> Absolutwert steht für: den Wert einer Zahl losgelöst von ihrem
> Vorzeichen...

Das wäre ja nur die Nachkommastelle.

von Joachim .. (joachim_01)


Lesenswert?

Uh. Stimmt.

von Karl H. (kbuchegg)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Stefan B. schrieb:
>> Hmmm....
>>
>> Danke erstmal....
>>
>> Nur wie stelle ich das an? Ich hätte gerne das Zweierkomplement
>> beibehalten,
>
> Die Zahl an sich ist ja in Ordnung.
> Nur für die Anzeige wirst du dir selber eine Funktion schreiben müssen.

Tipp:

negative Zahlen kann man ausgeben, indem man sie zuerst positiv macht 
und als Ausgleich dafür zuallererst ein '-' ausgibt. Und positive Zahlen 
kannst du ja korrekt ausgeben :-)

von (prx) A. K. (prx)


Lesenswert?

Stefan B. schrieb:
> Nur wie stelle ich das an?

Vorzeichen getrennt behandeln.

von Stefan B. (sibbl) Benutzerseite


Lesenswert?

Okay, d.h. ich müßte sie mit -1 multiplizieren, soweit ja null Problemo, 
aber es macht doch keinen Sinn, das Ganze nur in einem Bereich zwischen 
0 und -1 Grad zu machen. Das müsste doch anders auch gehen. Ab -1 Grad 
ist das negative Vorzeichen ja automatisch wieder da. Oder verstehe ich 
das falsch?

Ich hab mir den ganzen Nachmittag schon den Kopf zerbrochen.

von (prx) A. K. (prx)


Lesenswert?

Erst das Vorzeichen ausgeben. Dann den Absolutbetrag der Zahl. Getrennt.

von Karl H. (kbuchegg)


Lesenswert?

Stefan B. schrieb:
> Okay, d.h. ich müßte sie mit -1 multiplizieren, soweit ja null Problemo,
> aber es macht doch keinen Sinn, das Ganze nur in einem Bereich zwischen
> 0 und -1 Grad zu machen.

Was hindert dich daran, generell ein negatives Ergebnis anders zu 
behandeln?

Durch deine Fixed Point Arithmetik (also das 10-fache) hast du ja 
sowieso schon einen Sonderfall konstruiert. Alleine der würde ja schon 
rechtfertigen, dass es eine Funktion
1
void lcd_string_temperatur( int16_t temp )
2
{
3
  ....
4
}

gibt, die man im Hauptprogramm benutzt und die um dieses Detail Bescheid 
weiß.
1
...
2
      temp_val.i=(int16_t)(temp_val.f*10);
3
       
4
      lcd_instr(0x0C);           // Cursor eliminieren
5
      lcd_string( "T: " );
6
      lcd_string_temperatur( temp_val.i );
7
      lcd_string( " C" );
8
...

und in diese Funktion kommt dann diese Sonderbehandlung für negative 
Zahlen auch noch mit rein.

Wobei man sich, nach dem ganzen Floating Point Gemetzel im restlichen 
Programm, ja auch noch fragen kann, was diese Fixed Point Arithmetik 
überhaupt noch soll. Fixed Point Arithmetik hat den Sinn, eine 
Alternative zu Floating Point zu sein. Du benutzt aber sowieso schon 
Floating Point. Welchen Sinn macht es dann noch, da noch mal eine neues 
System drüber zu stülpen?

von DirkZ (Gast)


Lesenswert?

Stefan B. schrieb:
> Bei einer Temperatur zwischen 0 und -1 Grad wird kein "-" angezeigt.
> Darunter, also ab -1 Grad schon. Ich habe auch keinen Anhaltspunkt, wo
> überhaupt das Problem bestehen könnte.

Schau mal hier
http://www.mikrocontroller.net/attachment/4550/1wire.zip

Peters Lösung:

uint temp;

...
sprintf( s, "%4d.%01d¯C", temp >> 4, (temp << 12) / 6553 ); // 0.1¯C
...

von Marcus (Gast)


Lesenswert?

Bei deinem Code wundert mich, dass das überhaupt so gut funktioniert. 
Diese union aus float und int16_t ist nichts anderes als Glücksspiel.

von Stefan B. (sibbl) Benutzerseite


Angehängte Dateien:

Lesenswert?

Ich danke Euch erstmal für Eure Hilfe.

Es ist echt zum Mäuse melken. Dat Ding macht micht echt wahnsinnig :-)

Ich hab das ganze Float mal rausgenommen (hoffe ich). Funzen tuts, aber 
jetzt bekomme ich nur noch ganze Zahlen, d.h. die Nachkommastelle bleibt 
immer auf dem Wert 0.

Ich glaube, dass hat hier was mit der Rechnerei zu tun:

       humid_val.f=(int16_t)humid_val.i;
       temp_val.f=(int16_t)temp_val.i;
       calc_sht11(&humid_val.f,&temp_val.f);
                   humid_val.i=(int16_t)(humid_val.f*10);
       temp_val.i=(int16_t)(temp_val.f*10);

Ich hab jetz bißchen damit "herumexperimentiert", aber leider ohne 
Erfolg.

Hätte da noch jemand einen Tipp?

Gruss und allen ein schönes Wochenende....

Ich werde wohl leider frühestens ab Montag wieder mit meinem Projekt 
weitermachen können.

PS:

Ich könnte es ja auch so auf dem LCD ausgeben lassen wie hier:

       itoa(temp_val.i/10, buf, 10);
       LCD_WriteText(buf);
       LCD_GoTo(8,0);
       LCD_WriteText(".");
       itoa(temp_val.i%10, buf, 10);
       LCD_WriteText(buf);
       LCD_GoTo(10,0);
       LCD_WriteText(" C");
       LCD_GoTo(0,1);
       humid_val.i = abs(humid_val.i);
       LCD_WriteText("Humi: ");
       itoa(humid_val.i/10, buf, 10);
       LCD_WriteText(buf);
       LCD_GoTo(6,1);
       LCD_WriteText(buf);
       LCD_GoTo(8,1);
       LCD_WriteText(".");
       itoa(humid_val.i%10, buf, 10);
       LCD_WriteText(buf);
       LCD_GoTo(10,1);
       LCD_WriteText(" %");
         }   ......

Aber, da dann später noch einiges an Codezeilen rankommen soll, die mit 
der LCD-Ausgabe zu tun haben, und das Ganze dann echt zu unübersichtlich 
für mich wird, habe ich mich für diese Ausgabevariante:

    lcd_string_format("T: %i.%i C    \nH: %i.%i %%" , temp_val.i/10, 
abs(temp_val.i%10), humid_val.i/10, humid_val.i%10);

entschieden....

von Stefan B. (sibbl) Benutzerseite


Lesenswert?

Hat da niemand eine Idee?

von LostInMusic (Gast)


Lesenswert?

Wie schon mehrfach gesagt: Vorzeichen getrennt behandeln.

sign = ' '
if (i<0) sign = '-'
a = abs(i)

Ausgabestring: sign , a/10, '.', a%10

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.