mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Eine float variable in die einzelnen bits zerlegen und wiede


Autor: Montolio (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

ich muss eine float variable zerlegen um sie mittels RX/TX zu 
verschicken, da man da nur 8 bit schicken kann steh ich vor einem 
problem!

bei int ist es mit << ja recht einfach, nur funktioniert das nicht so 
wie ich will!

sinn der aktion ist das ich einem microcontroller eine gleitkomma zahl 
schicken muss (ein ATMEL 8515)!

ich hab es versucht die vorkomma stelle und die nachkomma stelle einzeln 
zu übertragen!

also zum zerlegen

int vorkomma; (wir sicher ned größer als int)
char nachkomma; (ich brauch nur 2 nachkommastellen)

vorkomma = (int)float
nachkomma = (float - vorkomma)*100

die werden dann an den microcontroller geschickt und so wieder 
zusammengesetzt:

float = vorkomma;
float += nachkomma/100;

wenn ich jetzt allerdings mit

if (float == 123.34) PORTB = 0xFF;

und es liegt sicher am float und nicht an irgendwelchen port 
einstellungen und sonstwas

vor und nachkomma werden auch korrekt übertragen!

dann funktioniert das leider nicht :-(((((
und ich weis ned warum!

thx im vorraus
Bernhard

Autor: Karsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

das übertragen der einzelnen bytes geht auch
einfacher, ohne die ganze Rechnerei.

float number;
char *buf = (char*)&number;

for(i=0;i<LEN_OF_FLOAT;++i)
 SEND(buf[i]);

Und weg sind die Daten. LEN_OF_FLOAT ist dabei die Anzahl von bytes in 
einem float (4?) und SEND deine Sendefunktion.

Zu Punkt 2 deines Problems: Man sollte niemals eine float mit == auf 
Gleichheit prüfen, da sich nicht alle Fliesskommazahlengenau darstellen 
lassen. Stattdessen sollte der Vergleich etwa so aussehen:

if(fabs(number-123.34)<EPSILON) PORTB=0xFF;
mit EPSILON <<1 aber > 0 (versuch mal 1e6 oder sowas).

Ich hoffe geholfen zu haben.

 Karsten

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
eine float-Zahl besteht aus 4 Byte, und mit den Konvertierungen wäre ich 
ganz vorsichtig.
Ich habs irgendwann mal mit einer kleinen Assemblerroutine gelöst, 
Adresse der Variablen übergeben, dieses Byte und die nachfolgenden 3 
senden, ohne jede Konvertierung.

Autor: Karsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@crazy horse

... was genau das ist, was der C-Code da oben tut.
Konvertiert wird da nichts (außer dem Typ des Zeigers auf den float)

 Karsten

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Karsten
als ich das geschrieben habe, war dein Beitrag noch nicht da, 
Konvertierung bezog sich auf Vorkomma/Nachkomma von Montolino. Deine 
Lösung ist natürlich eleganter, meine stammt noch aus der Zeit, als ich 
gerade mit C angefangen habe und mir solche Konstrukte noch nicht 
geläufig waren :-)

Autor: Karsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, horse,

wollte Dich nicht ärgern, nur die Verwirrung
vergrößern :)
C ist halt auch nur ein macro assembler (behaupten manche jedenfalls )

Karsten

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da sind wir wieder beim alten Problem:

Das geht nur solange gut, wie man float auf identische CPUs mit 
identischen Compilern überträgt.

D.h. die Reihenfolge der 4 Bytes ist nicht im C-Standard festgelegt.


Am besten, man überträgt Daten immer in der Networkbyteorder.

Wenn man Glück hat, hat der Compiler schon die dafür nötigen 
Bibliotheksfunktionen:

htons, htonl, ntohs, ntohl

Man bräuchte dann aber noch:

htonf, ntohf



Peter

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.