Ja ist ja auch einer, wenn der Controller kein 32Bit Register hat.
Druckbare Version
Ja ist ja auch einer, wenn der Controller kein 32Bit Register hat.
:-)
nagut, wie dem auch sei... ich würde gerne den Wert adcBat korrgieren (um Faktor 0.968) ... wollte dafür eigentlich adcBat erst mit 1000 multiplizieren und dann durch 1033 divideren...
OK, geht leider nicht :-(
Wie kann ich adcBat dann mit den zu Verfügung stehenden Mitteln anpassen?
THX
uint32_t wert1 = 700 / 100 * 100;
Ich vermute mal, dass das Standard-Datenformat deines Controllers 16bit ("int") ist. Die Konstanten (700, 100, 100) werden als int behandelt. Erst beim Schreiben in "wert1" (das kommt als letztes) wird der Wert in 32 bit umgewandelt.
Lösung:
uint32_t wert1 = (uint32_t)700 / 100 * 100;
oder vielleicht auch so:
uint32_t wert1 = 700UL / 100 * 100;
Teste das bitte mal.
Die Variable hat so schon 32 Bit, nur kurz vor der Ausgabe, wenn die Daten an WriteInteger übergeben werden, bleiben nur die unteren 16 über.
Bei den Rechnungen muß man noch angeben das die konstanten auch 32 bit sein sollen. Die Berechnung wird GCC (zumindest mit Optimierung) ohnehin schon beim compilieren ausführen. Ohne Zusatz sind in C konstanten erstmal Integer also 16 Bit. Man muß also statt 700 einfach 700L schreiben, und bei den andern Zahlen analog.
Das hat nichts damit zu tun ob der Conroller 32 bit Register hat - hier passiert das abschneiden ja sogar schon am PC.
Auch ne Möglichkeit, hab ich nicht dran gedacht.Zitat:
Die Variable hat so schon 32 Bit, nur kurz vor der Ausgabe, wenn die Daten an WriteInteger übergeben werden, bleiben nur die unteren 16 über.
...
Ohne Zusatz sind in C konstanten erstmal Integer also 16 Bit. Man muß also statt 700 einfach 700L schreiben, und bei den andern Zahlen analog.
Ja dann benutz doch einfach den Faktor 0,968, dafür gibt es ja Fliesskomma zahlen!Zitat:
nagut, wie dem auch sei... ich würde gerne den Wert adcBat korrgieren (um Faktor 0.968) ... wollte dafür eigentlich adcBat erst mit 1000 multiplizieren und dann durch 1033 divideren...
Lösung -> uint32_t wert1 = 700L * 106L / 100L;
Die Zeile gibt nun den gewünschten Wert aus!
@KingTobi
Fliesskommazahlen wollte ich nicht verwenden, da ich beim Durchstöbern des Forums immer wieder gelesen habe, dass man das vermeiden sollte...
THX an Alle
Die writeInteger Funktion kannst Du übrigens auch auf 32 Bit erweitern bei Bedarf.
Einfach aus der Lib rauskopieren. Anstatt itoa müsstest Du ltoa verwenden
http://www.nongnu.org/avr-libc/user-...r__stdlib.html
MfG,
SlyD
Fließkommazahlen sind nicht schlimm, solange du keine übertriebens zeitintensiven Programme hast.
Gruß, Yaro
Im Moment ist das Programm nicht groß, aber ich bin hart am arbeiten...
Der RP6, ausgestattet mit einem LCD & sonstigem Zeug was noch hinzukommt, soll dann über eine Menüführung welche über Taster und gleichzeitig über RC5 Codes gesteuert werden kann, unterschiedlichste Dinge erledigen.
Ich möchte alles in ein Programm reinpacken was geht... einfach mal um nicht immer nur kurze 08/15 Programme zu schreiben.
Dehalb die Lösung mit" uint32_t wert1 = 700L * 106L / 100L;" .... die gefällt mir eigentlich ganz gut, ist übersichtlich und ich erspare mir die Fließkommazahlen^^
mfg
Aircode
@aircode
Du könntest die Berechnung auch direkt in writeInteger packen, dürfte Speicher sparen, wären immerhin 4 Byte.