Ansicht:   

#156615 C - seltsamer Rundungseffekt ??? (pc.coding)

verfaßt von Mr. Teflon, 12.08.2009, 14:04:47

> > Ich begrenze die Ausgabe/Anzeige auf -99,9°C. Mit der Abfrage
> >
> > if(wert2 > 9.99)
> > wert2 = 9.99;
>
> Das finde ich schon mal verwirrend - wieso 9.99, wenn es -99.9 sein
> sollen?

Damit wird gleichzeitig die Kommastelle angepaßt. Sonst müßte man nochmal extra durch 10 rechnen.

> > Die Zahl wird nur noch in Einzelteile zerlegt, sodass eigentlich im
> > Terminal -99.9 ankommen/angezeigt werden müßten.
> > ABER! Ich bekomme -99,8 angezeigt !!!
>
> > // ********** -30°C ... 0°C zweistellig und 0°C ... 150°C dreistellig
>
> Außerdem ist -99.9 außerhalb dieses Bereichs ...

Das tut nichts zur Sache. Ist nur mein Kommentar für später. Ich kann auch mit 3,00 statt 9,99 auf -30°C optisch begrenzen.

>
> > wert2 = (float) ad_in(chan); // A/D Wandler auslesen und als float
>
> > if(wert2 < 231) // wenn Temperatur negativ, dann hier rechnen
>
> 231 ist doch nicht negativ. Sehr seltsam ...

Ist nicht seltsam. Ist korrekt. Du lernst mir C und ich Dir Elektronik.  ;-)
Die Zahl 231 ist der Digitwert vom A/D Wandler. Er arbeitet mit 10 Bit Auflösung. Der Dualwert 2^10 ist ja 1024 dezimal. Dadurch gibt mir der A/D Wandler einen Wertebereich zwischen 0 ... 1023 zurück, was an seinem zu messenden Eingang 0 ... 5V entspricht. Durch die äußere Beschaltung des Sensors, dessen Meßbereich und Kennlinie, liegt der Nullpunkt vom Sensor bei 1,1x Volt und diese entsprechen 231 Digit vom A/D Wandler. Wenn der Nullpunkt bei 0 Digit liegen würde, könnte ich nie Temp. unter 0°C messen. Der Software Nullpunkt etc. muß eh immer an den Sensor angepaßt werden durch ausmessen. Alles klar?

>
> > if(wert2 > 9.99) // wenn Temperatur kälter wie -99°C, dann
> > wert2 = 9.99; // wird Anzeige auf -99,9°C gesetzt
>
> > D = wert2;
> > com_txd (D + 48); // Zehner Stelle als Ganzzahl an COM
> >
> > wert2 = wert2 - D;
> > wert2 = wert2 * 10;
> > D = wert2;
> > com_txd (D + 48); // Einer Stelle als Ganzzahl an COM
> >
> > com_txd (0x2e); // Dezimalpunktausgabe an COM
>
> Bei der ganzen Rechnerei können jedesmal Rundungsfehler geschehen -
> beachte dabei insbesondere, daß nicht jede Dezimalzahl im zugrundeliegenden
> Binärformat exakt darstellbar ist. So wie z.B. 1/7 im Dezimalsystem eine
> nicht-endliche Darstellung hat ( 0,142857 142857 142857 142857 142857
> usw.), gibt es Zahlen, die im Binärsystem eine nicht-endliche Darstellung
> haben - da der Speicherplatz für die Zahl aber endlich ist, wird dann
> gerundet).

Hierbei wird nicht gerundet. Die auszugebende Zahl wird nur durch eine Art Software Schieberegister zerlegt und immer die erste linke Stelle wird ausgegeben. Es darf auch nur immer einstellig sein links vorm Komma.

>
> > wert2 = wert2 - D;
> > wert2 = wert2 * 10;
> > D = wert2;
> > com_txd (D + 48); // erste Kommastelle als Ganzzahl an COM
>
> >
> > // com_txd (176); // Zeichen ° an COM
> > com_txd (\'C\');
>
> Steht sprintf oder printf zur Verfügung? Damit kannst Du die
> Fließkommazahl in einen String umwandeln, ohne den Wert dabei durch
> mehrfache Berechnungen zu verändern.

Was ist sprintf oder printf?
Fertige Befehle in C oder meinst Du vorhandene Funktionen in Bsp. Codes die ich zur Verfügung habe.
Das muß aber dann auch mit der LCD Ausgabe funktionieren. Das Terminal ist ein Zwischenschritt bis mein LCD funktioniert.

--
___________
Tschau
Mr. Teflon

 

gesamter Thread:

Ansicht:   
Auf unserer Web-Seite werden Cookies eingesetzt, um diverse Funktionalitäten zu gewährleisten. Hier erfährst du alles zum Datenschutz