www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik floatzahl in ein assemblerkompatibles Format umwandeln


Autor: König Artus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

eine Sensorelektronik liefert eine Floatzahl welche Werte von -200,0 bis 
+850,0 beschreibt.
Diese Floatzahl ist zwar mit 'C' auszuwerten aber ich suche eine 
Möglichkeit diese in ein assemblerkompatibles Zahlenformat umzuwandeln.

Gibt es da eine Lösung?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
König Artus schrieb:
> eine Sensorelektronik liefert eine Floatzahl welche Werte von -200,0 bis
> +850,0 beschreibt.
Worüber (Schnittstelle, ADC) wird diese Zahl geliefert?

> Möglichkeit diese in ein assemblerkompatibles Zahlenformat umzuwandeln.
Wozu? In welchem Assembler?

> eine Floatzahl welche Werte von -200,0 bis +850,0 beschreibt.
Diese Zahl liesse sich z.B. in einer Festpunktzahl super abbilden.
Du definierst einfach: Zahlenbereich -2000...8500 und schwuppdiwupp 
passt das locker in eine 16-Bit Zahl...

Autor: tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
König Artus schrieb:
> Diese Floatzahl ist zwar mit 'C' auszuwerten aber ich suche eine
> Möglichkeit diese in ein assemblerkompatibles Zahlenformat umzuwandeln.

Wenn Du Dir wirklich selber Schmerzen zufügen willst:

http://de.wikipedia.org/wiki/IEEE_754

Autor: König Artus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für eure Antworten!

Lothar Millers Idee mit der 16-Bitzahl ist schon mal einleuchtend.


Der Hintergrund:(Hätte ich sofort schreiben sollen)

Die Sensorelektronik gibt über SPI(Slave) eine floatzahl aus(4 Byte).
Die Empfängerplatine übernimmt mit SPI(Master) diesen Wert. Wie tobi 
schrieb, ist es wohl maso-mässig diese floatzahl im Assemblerprogramm 
des Empfängers weiter zuverarbeiten.
Da sind 16-Bit doch handlicher, auch wenn die Übertragung viermal 
solange dauert.

Besten Dank!

Autor: Serieller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Da sind 16-Bit doch handlicher, auch wenn die Übertragung viermal
> solange dauert.

Halb so lange...

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
König Artus schrieb:
> Die Sensorelektronik gibt über SPI(Slave) eine floatzahl aus(4 Byte).
Das macht nur Sinn, wenn die Dynamik des Signals es erfordert. Das ist 
hier augenscheinlich nicht nötig...

Was ist das für eine "Sensorelektronik"?

Serieller schrieb:
>> Da sind 16-Bit doch handlicher, auch wenn die Übertragung viermal
>> solange dauert.
> Halb so lange...
Hätte ich auch getippt: 32 Bit (float) vs 16Bit (short)...

Autor: König Artus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Da sind 16-Bit doch handlicher, auch wenn die Übertragung viermal
> solange dauert.

Halb so lange...

Ähm..
"Bedecket mein Haupt nun, es muss erst gereinigt sein"(Aus "Die 
Zauberflöte")


Lothar Miller schrieb:
> Du definierst einfach: Zahlenbereich -2000...8500 und schwuppdiwupp
> passt das locker in eine 16-Bit Zahl...

So, zwischen "schwuppdi" und "wupp" hakt es jetzt. ;-)

Nachdem was ich mir erlesen habe kommt da ein 16-Bit 2er-komplement in 
Frage. Wie konvertiere ich eine float in das 2er-komplement?

Ich hab mal folgendes gemacht:

float a;
signed int b;

b = a;

In b steht zwar das 2er-komplement von der Ganzzahl von float a, aber 
eine Auf/Abrundung der ersten Nachkommastelle von float a wird nicht 
berücksichtigt.

Gibt es da vielleicht Bibliotheksroutinen?

Vor lauter Bäumen seh ich den Wald nicht mehr.

Autor: Helmut Lenzen (helmi1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
König Artus schrieb:
> float a;
> signed int b;
>
> b = a;

b = 10.0 * a + 0.5;

Du willst ja eine Nachkommastelle haben.

Also von 2000 .. 8500

Autor: Detlev T. (detlevt)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was willst du damit machen? Vergleichen größer/kleiner geht auch ohne 
Umwandlung indem man die Zahl als int32 behandelt.

Autor: König Artus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Helmut Lenzen schrieb:
> Du willst ja eine Nachkommastelle haben.
>
> Also von 2000 .. 8500

Ja, von -2000 bis +8500.

Das Geheimniss mit der +0.5 war mir neu. Ich hab jetzt folgendes 
gemacht:

float a;
signed int b;

if(a < 0)
    b = 10 * a - 0.5; // -2000 bis <0
    else
        b = 10 a + 0.5; // 0 bis 8500


Besten Dank für deine Hilfe!

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da bleibt noch die Frage, die ich schonmal stellte:
Lothar Miller schrieb:
> Was ist das für eine "Sensorelektronik"?
Und: in welchem Format (welche Bayte- und Bitordnung) werden die Daten 
von dort übertragen?

Autor: Helmut Lenzen (helmi1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Lothar

Du weist doch das ist wieder so eine geheime Area51 Kiste :=)

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.