Forum: Mikrocontroller und Digitale Elektronik Variablen und Ausgabendefinition für Kommazahlen???


von Markus (Gast)


Lesenswert?

Hallo Zusammen,

ich hab folgendes Problem:

Ich hab ein Winkelmessmodul, das mir über UART den Winkel Binär
ausgibt. Dabei wird ein Highbyte und ein Lowbyte gesendet.
Laut Datenblatt muss der Winkel dann mit:

Neigung=(((256*highbyte)+lowbyte)*360/65536);

berechnet werden.
Für ein Highbyte von 0x3e (Dez=62) und ein Lowbyte von 0xf9 (Dez=249)
ist die Neigung dann 88,555 Grad. Das würde auch stimmen.
Jetzt hab ich ein kleines C-Programm geschrieben das mir den Winkel
einliesst und dann auf ein LCD ausgibt.

        unsigned Neigung;
        unsigned highbyte;
        long int lowbyte;

        // Berechnung des Winkels
        highbyte=0x3e;
        lowbyte=0xf9;

        Neigung=(((256*highbyte)+lowbyte)*360/65536);

        lcd_gotoxy(0,1);
        sprintf(bufferLCD,"%d\xdf",Neigung);
        lcd_puts(bufferLCD);

Mein Problem ist, dass mir immer nur 88 angezeigt wird, und die
Nachkommastellen verschluckt werden. Stelle ich den Variablentyp auf
Float und den Ausgabetyp auf %f um so wird mir gar nichts mehr
ausgegeben.

Wie bekomme ich die Nachkommastellen angezeigt.

Grüsse Markus

von Sebastian (Gast)


Lesenswert?

gab es nicht verschiedne versionen von printf
alsomit und ohne flat ausgabe??

von Markus (Gast)


Lesenswert?

... kann sein, aber sprintf müsste eigentlich richtig sein. Ich habe
gerade in mehreren Docus nachgelesen. Sprintf sollte float anzeigen
können. Kann es vielleicht sein, dass Codevision nicht damit zurecht
kommt???
Die LCD-Funktion hat Codevidion erstellt.

Grüsse Markus

von Peter D. (peda)


Lesenswert?

"unsigned Neigung; "

Bei integer Zahlen ist die Kommastelle immer 0 !


Es geht aber auch ohne float:

       unsigned long Neigung;
       ...
       Neigung=(((256*highbyte)+lowbyte)* 1000 *360/65536);
       ...
       sprintf(bufferLCD,"%ld,%03ld\xdf",Neigung / 1000, Neigung
%1000);


Dann hast Du sogar ein richtiges Komma.


Peter

von Markus (Gast)


Lesenswert?

Hallo Peter,

danke das hat mich ein Stück weiter gebracht.
Jetzt ist bloss das Problem aufgetreten, dass mein Codevision
anscheinend alles was zwischen % und d steht falsch interpretiert, und
dann das d als Zeichen ausgibt. Sprich auf dem Bildschirm erscheint
d,d°. Wenn ich die Zusatzangaben "l" und "03l" rauslösche wird
plötzlich eine Zahl angezeigt, die Stimmt, bloss bei grösseren Zahlen
fängt das ganze natürlich zum spinnen an, da es nicht als long
definiert ist.
Das mit der Definition -unsigned Neigung- war mir soweit schon klar,
dass das nicht klappt. Ich hab dann versucht unsigned gegen float
auszutauschen, und dann wird plötzlich nichts mehr´angezeigt.

Herzlichen Dank Markus

von Rufus T. Firefly (Gast)


Lesenswert?

Du hast beim Ersatz von unsigned durch float auch daran gedacht, den
Formatstring von sprintf entsprechend anzupassen?

Ansonsten solltest Du Dir mal genau die Dokumentation Deines Compilers
zum Thema Floatingpoint-Unterstützung ansehen; aus Größengründen werden
nämlich oft mehrere verschieden umfangreiche sprintf-Varianten als
Library mitgeliefert. Und nur die schlussendlich von Dir verwendete
Library entscheidet über den Funktionsumfang von sprintf...

von Markus (Gast)


Lesenswert?

Hallo,

ich glaub ich bin jetzt Dank Deiner Hilfe dahintergekommen. Meine Alte
Version kann vermutlich keine Floatausgabe. Die neuere
Codevisionausgabe kanns anscheinend.
Ich kanns jetzt bloss nicht probieren, da ich meine Hardware nicht
greifbar habe.
Vielleicht ist dann auch das Problem behoben, dass ich zwischen % und d
nichts angeben konnte.

Grüsse und Danke

Markus

von Markus (Gast)


Lesenswert?

....
so jetzt hab ich es probieren können. CodeVision hat eine Option, wo
man die einzelnen sprintf-Funktionen angeben kann.
Jetzt bekomme ich wenigstens schon eine Zahl mit einem Komma drin
ausgegeben. Allerdings sind die Nachkommastellen immer Null, obwohl
nach der Formel Neigung=(((256*highbyte)+lowbyte)*360/65536); auf
jedenfall die Kommastellen bei den gegebenen Werten nicht Null sind.

Was mach ich denn jetzt schon wieder falsch???

Aber wenigstens hatte ich schon ein kleines Erfolgserlebnis!

Grüsse Markus

von crazy horse (Gast)


Lesenswert?

lass float-Zahlen weg, wenn du sie nicht unbedingt brauchst. Mit integer
rechnet es sich schneller und genauer.
Peters Ansatz ist genau der richtige.
Du musst allerdings unter "Projekt" "Configure" "C-Compiler"
(s)printf features einstellen, dass du auch long Zahlen ausgeben
willst.
Bin ich auch schon mal drübergestolpert, hat aber den Vorteil,  dass
die Programme kleiner werden, wenn nicht alle Optionen mit eingebunden
werden, wenn man es gar nicht braucht.

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
Noch kein Account? Hier anmelden.