mikrocontroller.net

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


Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sebastian (Gast)
Datum:

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

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

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.