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
|
Forum: Mikrocontroller und Digitale Elektronik 2 8bit in eine 16bit ZahlHallo 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.
MfG 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 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
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; 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 > >
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:
ich möchte nicht klugschei.... weil ich davon noch absolut keine ahnung hab, aber ist das so richitg
"Speicher" ist doch der Name und _Word der Typ oder? allerdings funktioniert
auch nicht:-( 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 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 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. 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 @Christoph Herzog Vielleicht ist mein kostenloser Grundlagen-C-Kurs etwas für Dich http://et-tutorials.de/mikrocontroller/ 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 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. 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). Ähm Leute:
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:
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.
|
|