Umwandlung 16-Bit-Zahl in H-Byte und L-Byte

Gast #3126308
Lesenswert?
• ▲
▼
Hallo,

kann jemand sagen, was die einfachste Möglichkeit ist, in C mit dem 
AVR-Studio eine 16-Bit-Zahl in ihr H-Byte und L-Byte aufzuschlüsseln?

Als Beispiel:

uint16_t sechzehn = 43760;

uint8_t lowbyte;
uint8_t highbyte;

Nehme an, das LOW Byte erhält man so:

lowbyte = sechzehn;

Wenn man den Inhalt der Variable sechzehn dann um 8 Binärstellen 
verschiebt, bekommt man das HIGH Byte auf die gleiche Weise, oder?

shift um 8 Stellen
highbyte = sechzehn;

Stimmt das so? Wenn ja, woher weiß man, in welche Richtung verschoben 
werden muss?

Letzte Frage: ist das in Bezug auf verbrauchte Rechentakte auch der 
schnellste Weg oder gibt es noch einen schnelleren (bzw. einfacheren)?
Gast #3126354
Lesenswert?
• ▲
▼
Viele der "kleinen" können es nur einmal zur gleichen Zeit. D.H. 8 
Befehle nur für die Schiebung.

Kein Problem, wenn man sowieso Urlaub hat.

An der Arbeit würde ich dann schon eher mit casts rumfummeln.

Das gute, alte Wort besteht ja immer noch aus 2 Bytes auch wenn es seit 
neuestem meist uint?_t gerufen wird.
Gast #3126369
Lesenswert?
• ▲
▼
Danke für die Antworten!


Pink Shell schrieb:
> uint16_t baud;
>    ...
>    UBRRH = (uint8_t) (baud >> 8);
>    UBRRL = (uint8_t) baud;

Das (uint8_t) castet die "untersuchte" Variable, nehme ich an...

(baud >> 8) verändert die Variable baud nicht?



Wie viele Takte benötigen die beiden Operationen?
UBRRH = (uint8_t) (baud >> 8);
UBRRL = (uint8_t) baud;

Nehme an, die untere Zeile benötigt einen Takt. Und die obere?
Gast #3126372
Lesenswert?
• ▲
▼
Überschnitten!

amateur schrieb:
> Viele der "kleinen" können es nur einmal zur gleichen Zeit. D.H. 8
> Befehle nur für die Schiebung.
>
> Kein Problem, wenn man sowieso Urlaub hat.
>
> An der Arbeit würde ich dann schon eher mit casts rumfummeln.

8 Takte nur für das Bit-Schieben??? Geht das irgendwie schneller?
Persönliche Seite #3126376
Lesenswert?
• ▲
▼
wern schrieb:
> Überschnitten!
>
> amateur schrieb:
>> Viele der "kleinen" können es nur einmal zur gleichen Zeit. D.H. 8
>> Befehle nur für die Schiebung.
>>
>> Kein Problem, wenn man sowieso Urlaub hat.
>>
>> An der Arbeit würde ich dann schon eher mit casts rumfummeln.
>
> 8 Takte nur für das Bit-Schieben??? Geht das irgendwie schneller?

Das is Unsinn. Schieben kostet genau einen Takt und das Schieben um 8 
kostet natürlich gar keine Instruktion, da auf Byteebene zugegriffen 
wird.
Gast #3126404
Lesenswert?
• ▲
▼
amateur schrieb:

> Viele der "kleinen" können es nur einmal zur gleichen Zeit. D.H. 8
> Befehle nur für die Schiebung.

Nein. Sogar C-Compiler sind heutzutage clever genug, zu erkennen, daß 
sie im Spezialfall des Vielfachen der grundlegenden Datenbreite der 
Architektur nicht bitweise schieben müssen, sondern eben in den größeren 
Häppchen dieser Datenbreite "umkopieren" können. Im konkreten Fall wird 
natürlich nichtmal was kopiert, sondern einfach nur auf das richtige 
Byte zugegriffen und fertig ist der Lack.
Gast #3126433
Lesenswert?
• ▲
▼
Danke für die vielen Antworten!

Dann sind meine Fragen von oben so weit geklärt.



Was mich noch interessieren würde, bei AVR-Registern, die ein H und ein 
L Byte haben, wird zuerst das H und dann das L Register geschrieben und 
der AVR setzt erst dann die beiden Werte um.
Oder?

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.