www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik C-Problem: Komma verschieben


Autor: Johann Laver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo C-Profis,

ich habe ein Zahl die als Gleitkommazahl oder als String vorliegt, z.B.:

1.23456 bzw "1.23456".

Ich möchte nun das Komma(Dezimaltrenner, evtl .(Punkt)) beliebig 
verschieben, also z.B.:

123.45 bzw "123.45".

Eine dunkle Ahnung sagt mir, dass ich mit Funktionen aus der math.h 
arbeiten muss.

Die Zahl soll über RS232 auf ein Display ausgegeben werden.

Compiler: Codevision
MCU: ATmega64
C-Kenntnisse: 3-

Habt ihr vielleicht einen Lösungsansatz?

Vielen Dank für eure Mühe! - Ich koche auch für euch!

Johann Laver



Autor: Ulrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also 2 stellen nach rechts geht mit einer Multiplikation von 100

sowas habe ich bereits in der 3. Klasse gelernt!!!

Autor: Robert Weber (rweber)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
*100 oder /100 verschiebt das Komma um zwei Stellen, oder verstehe ich
deine Frage falsch?

Autor: Johann Laver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja ja, ihr habt natürlich Recht. So war meine erste Lösung auch.

Aber: Die Werte stammen aus einen AD-Wandler, der z.B. den Wert 1,23456 
Volt liefert. Auf Grund eines Widerstands-Vorteilers sind es in 
Wirklichkeit 1234,56 Volt. Um diese Zahl zuerhalten, müsste ich mit 1000 
multiplizieren. Und das möchte ich nicht, weil es zu Rundungsfehler in 
der letzten Nachkommastelle kommen kann.

Ideal wäre es, wenn ich den Wert des AD-Wandlers so jungfreulich 
erhalten könnte, wie er ist.


Gruß Johann

Autor: Ralph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du die Zashl über UART / RS232  ausgibst, musst du sie vorher in 
einen "n Stellen" großen String umwandeln. n entspricht der Anzahl der 
Ziffern plus dem Komma.
Bei dieser Umwandlung kannst du das Komma an jeder beliebige Stelle 
einbauen.

Gleitkommzahlen solltest du auf µC die keine FPU haben, vermeiden wo es 
nur geht.
Besser du skalierst die Werte mit Faktoren aus der 2 Potenzen damit du 
mit Ganzzahlwerten Rechnen kannst.

Also Faktor 2, 4 ,8 , 16 ,..........

Autor: Ralph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich möchte den ADC sehen der den Wert 123.4 Volt liefert.

Der ADC liefert eine Ganzzahl ( Integer ) mit 8 oder 10 Bit zurück also 
0 - 255 oder 0 - 1023.
Erst wenn du diesen Intergerwert mit der Auflösung multipliziertst 
bekommst du die Spannung.

Also behalte den Integerwert und du verlierst keine Nachkommastellen.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du den Mega64 ADC nimmst (0 bis 1024), dein
Zwischenergebnis mit 1000 multiplizierst und dich beschwerst,
dass die 2. Nachkommastelle abweicht, dann hast du sowieso
etwas nicht verstanden:

Es ist sinnlos ein Ergebnis mit mehr Stellen anzugeben
als du überhaupt messen kannst. Das sind dann die Leute
die ein Aquariumthermometer auf 1/1000 Grad ablesen und sich
auch noch an den 3 Nachkommstellen erfreuen.

Autor: Johann Laver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gemach, gemach Leute,

ich habe geschrieben, dass der Wert aus einen AD-Wandler kommt, ich habe 
nicht geschrieben, dass der Wert aus dem internen AD des mega 64 kommt.

Konkret: Mein AD ist ein 24-Bit-Modul, das, im Vergleich zu einem 
7-1/2-stelligen Keithley-DMM die letzte Stelle in meiner Anzeige genau 
liefert.
Insofern sind die Vorraussetzungen für eine genaue Messung gegeben.

Autor: Fly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jajaja... 24Bit, ist ja meeega!
Ich behaupte ohne jahrelange Layouterfahrung kriegst du nicht mehr als 
14, sagen wir mal optimistisch 15 Bits hin...

Autor: Johann Laver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fly, mit deiner Behauptung hast du Recht! :-(



Autor: Fly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sagen wir mal du hast 0-5V Eingangsspannung. Das gäbe dann ein LSB von 
ca 300 nV. Wenn du an den Eingang hauchst, zappeln die lezten paar LSB 
mit Sicherheit. Ich finde das ist sowieso ein Marketinggag. Das Rauschen 
wird schon ein x Faches höher sein. Ich schätze mal um den Faktor 
tausend :)
Vielleicht wird es besser durch Mittelwert Bildung.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Johann Laver

>Aber: Die Werte stammen aus einen AD-Wandler, der z.B. den Wert 1,23456
>Volt liefert. Auf Grund eines Widerstands-Vorteilers sind es in
>Wirklichkeit 1234,56 Volt. Um diese Zahl zuerhalten, müsste ich mit 1000
>multiplizieren. Und das möchte ich nicht, weil es zu Rundungsfehler in
>der letzten Nachkommastelle kommen kann.

Eine Multiplikation mit 1000 bring nun wahrlich keine Rundungsfehler. 
Auch n icht im Binärsystem.

MFg
Falk

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und wenn du deinen Messwert als String vorliegen hast, dann ist es umso 
einfacher und garantiert rundungsfehlerfrei. Einfach das Komma (Punkt) 
in ner Schleife suchen, die nachfolgenden ZEichen um eine Stelle 
umkopieren, neunes Komma setzen. Ähhhh Voala.

MFG
Falk

Autor: Johann Laver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mach' ich hier den Eindruck, als sei ich nur doof?

Für die C-Programmierung mag das stimmen, deshalb mein Posting.

Für die Analog- und HF-Technik/Layout stimmt das NICHT!

Autor: Johann Laver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Falk Brunner:

Endlich mal was konstruktives. Vielen Dank!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.