www.mikrocontroller.net

Forum: Compiler & IDEs zu dumm Daten in einem String abzulegen?!?


Autor: Christian (Gast)
Datum:

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

Autor: Schmittchen (Gast)
Datum:

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

Autor: Christian (Gast)
Datum:

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

Autor: Schmittchen (Gast)
Datum:

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

Autor: Schmittchen (Gast)
Datum:

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

Autor: Christian (Gast)
Datum:

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

Autor: Christian (Gast)
Datum:

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

Autor: Jonas Diemer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
na, ohne unsigned geht der char von -127 bis 128 (wenn ich nicht irre). 
und der läuft dann natürlich eher über...

Autor: Schmittchen (Gast)
Datum:

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

Autor: Jonas Diemer (Gast)
Datum:

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

Autor: Christian (Gast)
Datum:

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

Autor: Schmittchen (Gast)
Datum:

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

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.