16bit Integer aufteilen
Dienstag, 22. Mai 2012
 
 

PIC Mikrocontroller Forum  |  PIC Mikrocontroller  |  CCS Compiler  |  16bit Integer aufteilen « vorheriges nächstes »
Seiten: [1] Nach unten Drucken
Autor Thema: 16bit Integer aufteilen  (Gelesen 1611 mal)
 
Max Pohl
Jr. Member
**
Offline Offline

Beiträge: 65



Profil anzeigen
« am: Januar 21, 2010, 18:13:06 »

Hallo zusammen,
ich möchte eine 16bit integer Variable auf zwei 8bit integer Variablen aufteilen. (lower and upper byte)
Dazu habe ich auf folgender Seite einen Code für den C18 Compiler entdeckt.
http://sprut.de/electronic/pic/c/pic_c/pic_c80_structure.html

Code: (c)
typedef unsigned char   byte;           // 8-bit
typedef unsigned int    word;           // 16-bit

union _WORD
{
    word _word;
    struct
    {
        byte LowByte;
        byte HighByte;
    };
} SuperWord;

Code: (c)
word a;
byte b,c;
a = 12345;
SuperWord._word = a;
b = SuperWord.LowByte;
c = SuperWord.HighByte;

Leider motzt der Compiler bei dieser Scheibweise rum.

"Element is no a member"

Wie muss der Code aussehen damit er funktioniert.
Müssen beide Teile in derselben Funktion sein ?

Oder gibt es gar eine simplere Lösung meines Vorhabens?

Danke schonmal

MfG Max
Gespeichert
Bernd
Globaler Moderator
Hero Member
*****
Offline Offline

Beiträge: 3815



Profil anzeigen
« Antworten #1 am: Januar 22, 2010, 18:06:14 »

Zitat
Leider motzt der Compiler bei dieser Scheibweise rum.

Anonyme Strukturen sind nicht Bestandteil von ANSI-C89 sondern eine compiler-spezifische Erweiterung.

Zitat
Code:
union _WORD
{
    word _word;
    struct
    {
        byte LowByte;
        byte HighByte;
    };                   // <- kein Bezeichner, d.h. anonym
} SuperWord;

Daher:

Code:
union _WORD
{
    word _word;
    struct
    {
        byte LowByte;
        byte HighByte;
    } foo;              // <- beliebiger Bezeichner
} SuperWord;

// Zugriff:
SuperWord._word = a;
b = SuperWord.foo.LowByte;
c = SuperWord.foo.HighByte;

Bei den Datentypen in deinem Code solltest du dich vergewissern, daß beim CCS ein int auch 16 Bit aufnehmen kann. Bei älteren Versionen war das nicht der Fall.

Portabler Ansatz, der bei den meisten Compilern genauso effizient ist:

Code:
#define LOW_BYTE(x)     ((unsigned char)((x)&0xFF))
#define HIGH_BYTE(x)    ((unsigned char)(((x)>>8)&0xFF))

unsigned int i;
unsigned char a, b;

...

a = HIGH_BYTE (i);
b = LOW_BYTE (i);

Viele Grüße

Bernd
Gespeichert

Max Pohl
Jr. Member
**
Offline Offline

Beiträge: 65



Profil anzeigen
« Antworten #2 am: Januar 23, 2010, 19:44:00 »

Vielen Dank es läuft!
Gespeichert
Seiten: [1] Nach oben Drucken 
« vorheriges nächstes »
Gehe zu:  

Powered by MySQL Powered by PHP Made for Mozilla (Firefox) Made for Internet Explorer
Seite erstellt in 0.04 Sekunden mit 18 Zugriffen.
 
Top! Top!