Habe ein Problem mit den Verbinden zweier 8 bit register vom SPI. MSB 1. 8Bit=204 LSB 2. 8Bit=112 ergebniss soll sein 52336. in DEV C++ habe ich es so gemacht. int zwert1,MSB,LSB; zwert1=MSB<<8; eregbniss=zwert1+LSB; //ergebniss=52336; so habe ich es auch in GCC Portiert. nur bekomme ich bei zwert1= -13312 heraus und als ergebniss=-13200 Wo ist der Fehler????
Beim Datentyp.Wenn 'int' automatisch als 'unsigned' interpretiert wird,funktioniert alles wie gewohnt.Als 'signed' ist das höchste Bit jedoch das Vorzeichenbit. Abhilfe: Datentypen vollständig deklarieren: unsigned int zwert1,MSB,LSB;
Hallo habe es jetzt mal mit unsigned probiert das selbe in grün. void test1() { unsigned int zwert1,MSB,LSB,ergebniss; MSB=204; LSB=112; zwert=MSB<<8; ergebniss=zwert1+LSB; //-13200 } warum klappt es nicht. auch wenn ich folgendes mache kommt nur ein -13200 heraus. unsigned int ergebniss; ergebniss=(204<<8)+112;
Wie genau zeigst du das Ergebnis den an?Im Debugger?Oder per z.B. per printf()? Letzterem ist es egal, welche Daten du übergibst,es wird so interpretiert wie es im Formatstring steht...
> auch wenn ich folgendes mache kommt nur ein -13200 heraus.
Da kann nicht -13200 herauskommen, da der Datentyp jetzt
unsigned ist, also kein Vorzeichen hat!
Wie Ronny schon richtig feststellte, liegt dein Problem
jetzt höchst wahrscheinlich in der Art und Weise wie
du den Inhalt von ergebniss kontrollierst. Du hast also
in die Kontrolle einen Fehler eingebaut.
Also das Problem liegt am printf printf("Ergebiss %d",ergebniss); //-13200 printf("Ergebniss %x",ergebniss); 0xcc70 das entsoricht dem wahren wert. Habe noch ein Problem Bit0-Bit5 aus dem LSB zu extrahieren. habe eine Zahl 16Bit 9504 ich benötige die 8bit MSB und 8 bit LSB das mache ich so unsigned int zw1,MSB,LSB,wert; wert=9504; zw1=(wert>>8); MSB=zw<<8; LSB=wert-MSB; LSB=32; //das sind ja eigendlich schon die Werte Bit0-5. aber was mache ich wenn es zb 11110101 die 6 LSB herausnehme. (110101 soll rauskommen). da benötige ich doch noch einen Rechenschritt. Danke
Schau dir doch mal in einem C-Buch an,was die Formatierungszeichen für printf() bedeuten (insbesonders %d). http://home.fhtw-berlin.de/~junghans/cref/FUNCTIONS/format.html
Nachtrag: Ersetz das "%d" mal durch ein "%u",das löst vorerst dein Problem. Dein eigentliches Problem besteht jedoch weiterhin.Mach dich doch mal mit den unterschiedlichen Datentypen vertraut,insbesonders wie sie im binärem System dann aussehen.Dann sollte einiges klarer werden.printf() interpretier lediglich einen 16-Bitwert (oder unter Windows 32bit) so,wie du es ihm im Formatstring vorschreibst.Du könntest ihm den unsigned int auch als String verkaufen,jedoch mit unvorhersehbaren Folgen da dann der Inhalt deiner Variable als Zeiger interpretiert werden würde.
Hans Peter wrote:
> ich benötige die 8bit MSB und 8 bit LSB
Wenn Du 8 Bit willst, warum nimmst Du dann 16 Bit Variablen ?
Man muß ja den SRAM nicht absichtlich vergeuden.
1 | unsigned char lsb, msb; |
2 | |
3 | msb = wert >> 8; |
4 | lsb = wert; |
Und wenn Du nur 6 Bit willst, dann eben
1 | lsb = wert & 0x3F; |
Peter
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.