Aus 2 char ein unsigned int erzeugen

Gast #586368
Lesenswert?

Hallo @ all

Ich möchte Daten von den Ports einlesen. Der Datenbus ist 8 Bit breit. 
Zuerst übertrage ich das Low-Byte und anschließend das High-Byte. Danach 
möchte ich das Low-Byte und High-Byte zusammenfassen zu einem unsigned 
int. Hier mein Quellcode:

bit status;
char low_byte, high_byte;


if(status == LOW_BYTE)
{
   low_byte = PINC;
   status = HIGH_BYTE;
}
else
{
   high_byte = PINC;

   ptr_datenpuffer[i] = high_byte;
   ptr_datenpuffer[i] = ptr_datenpuffer[i] << 8;
   ptr_datenpuffer[i] = low_byte;

   status = LOW_BYTE;
}

Ich dachte das durch die Wertzuweisung die unteren 8 Bits des unsigned 
int beschrieben werden. Anschließend wollte ich das ganze um 8 Stellen 
nach links schieben und dann das Low-Byte zuweisen. Dies scheint so aber 
nicht zu funktionieren

Grüsse

Sebastian
Gast #586679
Lesenswert?

ptr_datenpuffer[i] = (((int) high_byte )<<8) | low_byte;

Wieso muss der Datentyp vom low_byte nicht verändert werden? Schließlich 
führe ich doch eine Veroderung von zwei unterschiedlichen Datentypen 
durch.

Grüsse

Sebastian
Gast #586687
Lesenswert?

Vorschlag: ausschießlich unsigned verwenden, zb so:
1
bit status;
2
unsigned char low_byte, high_byte;
3

4
// unsigned short ptr_datenpuffer[300];
5

6
if(status == LOW_BYTE)
7
{
8
   low_byte = PINC;
9
   status = HIGH_BYTE;
10
}
11
else
12
{
13
   high_byte = PINC;
14
   ptr_datenpuffer[i] = (high_byte<<8)+low_byte;
15
   status = LOW_BYTE;
16
}

  
Admin Persönliche Seite #586825
Lesenswert?

Thorsten De buhr wrote:
> int intvalue=0;
> char *low_byte = (char*) &intvalue;
> char *high_byte = (char*) (&intvalue)+1;

Auch das ist nicht portabel. Je nach Prozessor kann es sein dass das 
low_byte hier gar nicht das low byte ist, sondern das high byte.

> Schneller gehts nicht, weil hier nicht gerechnet werden muss. Die ARMs
> haben idR. nen Barrelshifter drin, so dass man da in einem Takt bis zu
> 32Bit shiften kann. Die AVRs glaub ich nicht...

Der Compiler setzt das beim AVR in zwei Byte-Zugriffe um, geschoben wird 
da gar nicht.
Gast #586864
Lesenswert?

>> int intvalue=0;
>> char *low_byte = (char*) &intvalue;
>> char *high_byte = (char*) (&intvalue)+1;

>Auch das ist nicht portabel. Je nach Prozessor kann es sein dass das
>low_byte hier gar nicht das low byte ist, sondern das high byte.

Das was Thorsten vorgeschlagen hat, macht doch eigentlich der Compiler, 
wobei dieser dann auch die richtige Zuordnung (Position der Bytes) 
trifft, oder?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren