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
... 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
"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
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
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...
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
....
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
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.
Eine eigene Frage?
Dieser Thread ist über 21 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.