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
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.
> 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.
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...
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
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.
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.
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.
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 :-)
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.
Erst das Vorzeichen ausgeben. Dann den Absolutbetrag der Zahl. Getrennt.
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?
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 ...
Bei deinem Code wundert mich, dass das überhaupt so gut funktioniert. Diese union aus float und int16_t ist nichts anderes als Glücksspiel.
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....
Hat da niemand eine Idee?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.