www.mikrocontroller.net

Forum: Compiler & IDEs Frage zum verbinden zweier 8 Bit register in GCC


Autor: Hans Peter (Gast)
Datum:

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




Autor: Ronny (Gast)
Datum:

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

Autor: Hans Peter (Gast)
Datum:

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



Autor: Ronny (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Hans Peter (Gast)
Datum:

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





Autor: Ronny (Gast)
Datum:

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

Autor: Ronny (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.
unsigned char lsb, msb;

msb = wert >> 8;
lsb = wert;

Und wenn Du nur 6 Bit willst, dann eben
lsb = wert & 0x3F;


Peter

Autor: Hans Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah Ja so gehts.

Besten Dank

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.