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
gab es nicht verschiedne versionen von printf alsomit und ohne flat ausgabe??
... 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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.