Forum: Mikrocontroller und Digitale Elektronik 2 8bit in eine 16bit Zahl


von Christoph H. (obbedair)


Lesenswert?

Hallo
kurze Frage  ich möchte die zwei 8bit-Zahlen in eine 16-bit Zahl 
wandeln.
ist das so richtig, leider kann ich in meinem Programm nicht 
kontrollieren obs stimmt.
1
Ergebnis = ( ECCPR1H << 8 );
2
Ergebnis = Ergebnis + ECCPR1L;

MfG

von Michael (Gast)


Lesenswert?

Falls das C sein soll:
Ohne Type cast ist das wahrscheinlich falsch. Außerdem kann Schieben je 
nach Prozessor recht ineffizient sein.
Einfacher ist es mit einer union

von Christoph H. (obbedair)


Lesenswert?

ja ,sorry das ist C.

Hab mich jetzt mal bissel bei sprut belesen.

Aber ich versteh noch nicht ganz wie ich die zwei byte jetzt quasi zu 
einem Word machen kann. wenn ich das eine byte beschreibe und danach das 
zweite dann hab ich doch das erste wieder überschrieben?

wäre es vielleicht so richtig
1
union _Word
2
    { 
3
    int Ergebnis;
4
    struct
5
         {
6
         char ECCPR1L;
7
         char ECCPR1H;
8
         };
9
    }Speicher;

von Guten Morgen (Gast)


Lesenswert?

union _Word
    {
    int Ergebnis;
    struct
         {
         char ECCPR1L;
         char ECCPR1H;
         };
    }Speicher;

int Test;
Speicher WordVariable;
char Var1;
char Var2;

WordVariable.ECCPRIL = Var1;
WordVariable.ECCPRIH = Var2;

Test = WordVariable.Ergebnis;

von Klaus T. (gauchi)


Lesenswert?

Michael schrieb:
>  Außerdem kann Schieben je nach Prozessor recht ineffizient sein.

Stimmt, aber vermutlich wird kaum ein Compiler das als 8 left-shifts 
umsetzen


Christoph Herzog schrieb:
> wäre es vielleicht so richtig
>
>
1
> union _Word
2
>     { 
3
>     int Ergebnis;
4
>     struct
5
>          {
6
>          char ECCPR1L;
7
>          char ECCPR1H;
8
>          };
9
>     }Speicher;
10
>

Das kann funktionieren. Wenn der verwendete Prozessor ein Little-Endian 
ist. (Ist inzwischen fast von auszugehen, aber es wird im Originalpost 
nicht erwähnt)

Prinzipiell gefällt mir die ursprüngliche Variante am besten, es muss 
eben nur ein typecast rein:
1
Ergebnis = ((uint16_t) high << 8) | low

von Christoph H. (obbedair)


Lesenswert?

ich möchte nicht klugschei.... weil ich davon noch absolut keine ahnung 
hab, aber ist das  so richitg
1
Speicher WordVariable;

"Speicher" ist doch der Name und _Word der Typ oder?

allerdings funktioniert
1
_word Speicher;
auch nicht:-(

von Christoph H. (obbedair)


Lesenswert?

Klaus T. schrieb:
> Ergebnis = ((uint16_t) high << 8) | low

Könnteste du das bitte ein wenig näher erklären. wofür steht das 
uint16_t
und | ist ein oder? quasi um den untern teil der 16 bit zubeschreiben?

vielen dank

von Werner (Gast)


Lesenswert?

Christoph Herzog schrieb:
> und | ist ein oder? quasi um den untern teil der 16 bit zubeschreiben?

C-Grundlagen lernen!!

> ECCPR1L
klingt nach Hardware-Register, das geht nicht mit union

von Christoph H. (obbedair)


Lesenswert?

habt ihr einen Link wo ich mir die Grundlagen mal bissel aneignen kann.
bis jetzt hab ich nur sprut und pic-projekte.de entdeckt.

oki das |ist quasi ein bitweises oder

und ja es geht um Hardware-register.

von Schieber (Gast)


Lesenswert?

Warum muß das hier denn alles so kompliziert gelöst werden ??

Du definierst eine unsigned int-Variable namens Ergebnis und baust diese 
dann aus den beiden 8-Bit Werten wert1 (High-Byte) und wert2 (Low-Byte) 
zusammen:

unsigned int Ergebnis;

Ergebnis = wert1 * 256 + wert 2;    // Fertig !!

Das kann jeder C-Compiler der Welt verarbeiten.

Gute Compiler machen aus dem Teil ´* 256´ dann noch automatisch ein 
Links-Shift, weil das dann schneller geht als die echte Multiplikation, 
also

Ergebnis = (wert1 << 8) + wert2;

Womit wir dann wieder beim Anfang des Threads sind, der doch richtig war 
!!
Nur Ergbnis muß als unsigned int def. werden

Schieber

von ET-Tutorials (Gast)


Lesenswert?

@Christoph Herzog
Vielleicht ist mein kostenloser Grundlagen-C-Kurs etwas für Dich
http://et-tutorials.de/mikrocontroller/

von Andreas (Gast)


Lesenswert?

Moin,
wieso reicht dir das Angebot nicht?

Hier gibt es einen PIC(18) Tutorial:
http://pic-projekte.de/pic_tutorial.html

Und hier eins für PIC Programmierung in C:
http://pic-projekte.de/pic_c.html

Gruß
Andreas

von Lehrmann M. (ubimbo)


Lesenswert?

Wenn du dir mal die Links anschaust: 
http://pic-projekte.de/pic_c.html#8to16
da steht: "Zwei 8-Bit Variablen in eine 16 Bit umwandeln" und darunter 
ein fertiger Code für C18.

von Matthias Melcher (Gast)


Lesenswert?

Alles beschrieben funktioniert natürlich nur mit vorzeichenlosen Werten.

Die union Konstruktion funktioniert nicht mit Hardware variablen, da in 
der struct ja nur neue Namen vergeben werden. Sind die schon belegt, 
meckert der Compiler. Schneller ist die union allemal.

Aber auch wenn der Compiler x*256 zu x<<8 optimiert, so wird er doch 
Probleme haben, das + zu optimieren. Je nach CPU ist | bedeutend 
schneller als +, wobei in diesem speziellen Fall beide Operationen zum 
gleichen Ergebnis führen.

Also lieber:

Ergebnis = (((uint16_t) high) << 8) | low;

Es ist ausserdem wichtig, dass "high" zuerst in eine 16 bit Zahle 
gewandelt wird, und dann erst nach links geshiftet wird. Daher nochmal 
zwei Klammern (auch wenn sie nicht unbedingt nötig wären).

von Matthias L. (Gast)


Lesenswert?

Ähm Leute:
1
Ergebnis = ( ECCPR1H << 8 );
2
Ergebnis = Ergebnis + ECCPR1L;

Das H und das L impliziert doch, das ein HIGH und ein LOW Register ist.
Und da gehe ich davon aus, dass es auch ein 16bit-Pondon gibt:
1
Ergebnis = ECCPR1;

Der Compiler kümmert sich dann schon.

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
Noch kein Account? Hier anmelden.