Hilfe, komme nicht weiter. Temperatur von 0 bis -1 Grad kein negatives Vorzeichen.

OP Persönliche Seite #3320057
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
Angehängte Dateien:
#3320103
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 :-)
OP Persönliche Seite #3320112
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.
#3320138
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?
OP Persönliche Seite #3320789
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....
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren