Hallo, ich hab' mich bereits recht lange selber mit dem Problem beschäftigt, aber da mir in naher Zukunft keine Lösung zu kommen scheint frag' ich doch mal lieber euch - ich denke das Problem ist eigentlich echt simple zu lösen - ich seh's oder weiß es bloß mal wieder nicht: warum ist kompass = (0x01*256 + 0x91)/2; __________________________________________ nicht gleich : uart_rxbuf[1] = 0x01; uart_rxbuf[2] = 0x91; kompass = (uart_rxbuf[ 1 ]*256 + uart_rxbuf[ 2 ])/2; ???? Es geht ja nur um die Zahlen - die Formel ist wurscht. Ziel ist es einen elektronischen Kompass auszulesen (2xcm-1 oder so heißt der) Vielen Dank für eure Unterstützung!!! Christian
Ist die Variable Kompass oben evtl. von einem anderen Datentyp als Kompass unten? (16bit vs. 8bit)? Ich kann mir da nur was mit Überlauf vorstellen... >warum ist [...] >nicht gleich : sollte eigentlich gleichwertig sein. Was funktioniert denn nicht? Schmittchen.
Hallo Schmittchen, Danke sehr für deine Antwort!!!! Die Variablen sind beide gleich!!! Bei mgl. 1 kommt 200 aus dem Display raus, bei Mgl. 2 kommt 72 raus - Mgl. 1 stimmt - 2 nicht. Es ist in der exakt selben Funktion - ich nehm entweder die eine Zeile raus und ersetze sie durch die Variablen, die ich zuvor auf den selben Wert setze - und schon kommt was anderes raus!!!! Gibts vielleicht eine andere Möglichkeit aus einem UART String die richtigen Zahlen rauszuholen???? Vielen Dank Christian PS: vielleicht hab' ich ja den String falsch initialisiert: char uart_rxbuf[4]; unsigned char uart_rx_pos; -ist das korrekt????
Das muß aber doch ein Problem mit einem Überlauf sein! > unsigned char uart_rx_pos; was ist das? Hat aber wahrscheinlich nix mit deinem Problem zu tun. Ich vermute folgendes: >kompass = (uart_rxbuf[ 1 ]*256 + uart_rxbuf[ 2 ])/2; der erste Rechenschritt lautet uart_rxbuf[1]*256, das Ergebnis wird evtl./wahrscheinlich/vielleicht im Register zwischengespeichert, in dem vorher uart_rxbuf[1] gespeichert war?!?! Das würde überlaufen und wäre danach 0. Dann + 0x91. Dann geteilt durch 2 ergäbe die 72(dez). Im anderen Fall macht der Compiler daraus wahrscheinlich was anderes. Ich kann deine verzweifelte Sucherei gut nachvollziehen. Schmittchen.
Ich habe doch gewußt, daß ich noch was vergessen habe (wurde gestört). Also: Was dagegen tun? Ich würde es mal mit einem Cast auf eine 16Bitvariable versuchen. kompass = ( unsigned int(uart_rxbuf[1]*256) + uart_rxbuf[2] ) /2; wenn alles fehlschlägt noch einen Cast auf die gesamte Summe. Das sollte dann aber reichen. Schmittchen.
Hallo, es funktioniert leider immer noch nicht. Wenn der Wert tatsächlich in der Variable abgespeichert wird wär das doch tierisch blöd, weil ich ja mit dem Variableninhalt nochmal rechnen möchte und die nicht plötzlich nen anderen Wert haben soll!!! Das mit deinem Cast hab' ich vermutlich missverstanden - bzw. hats der Compiler missverstanden und ich hab' das folgendermaßen unelegant gelöst: unsigned int variable; unsigned int variable2; uart_rxbuf[1] = 0x01; uart_rxbuf[2] = 0x91; kompass = ( variable2 = (variable = uart_rxbuf[1]*256) + uart_rxbuf[2])/2; es kommt dabei immer noch 72 raus. "> unsigned char uart_rx_pos; was ist das? Hat aber wahrscheinlich nix mit deinem Problem zu tun." - nein hat nix damit zu tun. Der Compiler gibt mir aber auch keinen Warnmeldungen mit möglichem Überlauf oder sowas aus - bin echt am Verzweifeln.... Viele Grüße Christian
Hurra - Problem gelöst!!!!!!! ich Trottel hab' char uart_rxbuf[4]; statt unsigned char uart_rxbuf[4]; geschrieben - ich weiß zwar nicht warums nicht als char ohne unsigend funktioniert, möchte mich aber trotzdem nochmal für deine Ideen und Tips bedanken!!! Christian
na, ohne unsigned geht der char von -127 bis 128 (wenn ich nicht irre). und der läuft dann natürlich eher über...
> Wenn der Wert tatsächlich in der Variable abgespeichert wird wär das doch
tierisch blöd
Ich hatte mir das nur so gedacht. Wär ja möglich gewesen, daß der
Compiler die Variable aus dem SRAM in ein Register zieht, um dann mit
dem Register die Berechnungen durchzuführen. Die Originalvariable im
SRAM bliebe davon unbeeindruckt. War nur ein Versuch das seltsame
Verhalten zu ergründen. Zum Glück macht der Compiler das ja jetzt dank
konkreter Angaben (unsigned...) richtig.
Schmittchen.
naja, aber über register brauchst du dir in ner hochsprache eigentlich keine sorgen zu machen, es sei denn du bettest asm ein oder debuggst den compiler...
Hallo zusammen, @ schmittchen: Tschuldigung, dass ich meine Meinung über deine Idee weiter oben so negativ dargestellt habe - war wirklich nicht meine Absicht!!!!!! Bei einem 2. durchlesen hatte mein Posting auch auf mich eine ziemlich beleidigende Wirkung - war nicht so gedacht!!! Vielen Dank allen nochmals!! Christian
> Tschuldigung, dass ich [...] deine Idee weiter oben so negativ dargestellt habe
Hoppla, hab ich garnicht bemerkt/so empfunden.
Es muß nicht jeder Thread mit einem "Danke", "Super" usw. enden, sondern
es wäre schön, wenn der Fragesteller am Ende des Threads seine/die
Lösung bzw. die Art des Umsetztens hier kurz rückmelden würde. Das
möchte ich nur ganz allgemein erwähnen. Du hast das ja zwischendrin
schon gemacht.
Manchmal tauchen auch Fragen auf, die von keinem beantwortet werden
(können), der Fragesteller die Lösung alleine findet und diese dann
anschließend hier auch noch postet. Klingt dann zwar manchmal nach
Monolog, hilft aber weiter, wenn jemand in der gleichen Situation
steckt.
Schmittchen. "Vielen Dank für Ihre Aufmerksamkeit :-)"
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.