Forum: Mikrocontroller und Digitale Elektronik 2 Bytes tauschen


von Mario (Gast)


Lesenswert?

Hallo,

wie kann ich in C 2 Bytes untereinander tauschen?


Der Hintergrund ist das die Funktion eeprom_read_word aus der #include 
<avr/eeprom.h> Bibliothek als Rückgabetyp little endian hat.

Hab sowas versucht aber es wird nur das LSB verschoben...
1
uint64_t uiVal;
2
uiVal =  256* eeprom_read_word(EE_ADR_SERIAL_NUM);

Scheint trivial aber komme da nicht weiter .-(

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Mit einer Hilfsvariablen.
1
uint16_t wert;
2
uint16_t ziel;
3
4
wert = eprom_read_word(EE_ADR_SERIAL_NUM);
5
ziel = ((wert & 0xFF) << 8) | (wert >> 8);

von Peter II (Gast)


Lesenswert?

Mario schrieb:
> wie kann ich in C 2 Bytes untereinander tauschen?

Das einfachste ist doch wohl
1
uint8_t tmp = a;
2
a = b;
3
b = tmp;


> Der Hintergrund ist das die Funktion eeprom_read_word aus der #include
> <avr/eeprom.h> Bibliothek als Rückgabetyp little endian hat.
er liefert das, was im eeprom drin steht, wenn es dort richtig drin 
steht liefert er es auch richtig. Da muss nicht getauscht werden.

von Joe F. (easylife)


Lesenswert?

oder eeprom_read_byte() benutzen.

von Mario (Gast)


Lesenswert?

Rufus Τ. F. schrieb:
> uint16_t wert;
> uint16_t ziel;
>
> wert = eprom_read_word(EE_ADR_SERIAL_NUM);
> ziel = ((wert & 0xFF) << 8) | (wert >> 8);

läuft vielen Dank!

von Mario (Gast)


Lesenswert?

Peter II schrieb:
> er liefert das, was im eeprom drin steht, wenn es dort richtig drin
> steht liefert er es auch richtig. Da muss nicht getauscht werden.

Im EEPROM steht es in dieser Reihenfolge: 0x 270E

wenn ich es auslese mit eeprom_read_word(EE_ADR_SERIAL_NUM)

wird es zu 0x 0E27 (wird auf dem PC ausgegeben über USB).

Womit könnte es zusammen hängen?

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Hier ist auch eine schöne Methode beschrieben:
https://www.mikrocontroller.net/articles/AVR_Assembler_Makros#2_Register_ohne_Zwischenspeicher_vertauschen
Zwar Assembler, XOR sollte aber auch in höheren Sprachen möglich sein

MfG

von Peter II (Gast)


Lesenswert?

Mario schrieb:
> Im EEPROM steht es in dieser Reihenfolge: 0x 270E

Warum steht es so drin? Wie schreibt du es denn rein?

von Mario (Gast)


Lesenswert?

Peter II schrieb:
> Warum steht es so drin? Wie schreibt du es denn rein?


so schreibe ich es rein:
1
eeprom_write_word(EE_ADR_SERIAL_NUM,  ucRxBuffer[6] | 256 * ucRxBuffer [7]);

von Peter II (Gast)


Lesenswert?

Mario schrieb:
> so schreibe ich es rein:
> eeprom_write_word(EE_ADR_SERIAL_NUM,  ucRxBuffer[6] | 256 * ucRxBuffer
> [7]);

dann dreht es doch dort gleich richtig.
1
uint16_t tmp = ucRxBuffer[6] << 8 | ucRxBuffer[7];
2
eeprom_write_word(EE_ADR_SERIAL_NUM,  tmp);

von Axel S. (a-za-z0-9)


Lesenswert?

Mario schrieb:
> Peter II schrieb:
>> Warum steht es so drin? Wie schreibt du es denn rein?
>
> so schreibe ich es rein:
1
eeprom_write_word(EE_ADR_SERIAL_NUM,  ucRxBuffer[6] | 256 * ucRxBuffer[7]);

Aha. Du schreibst es also anders herum rein, als du es nachher auslesen 
willst. Warum machst du das? Warum schreibst du die Daten - wenn sie 
denn ohnehin in einem byteweisen Buffer vorliegen - überhaupt mit 
eeprom_write_word() statt zweimal eeprom_write_byte()?

von Peter II (Gast)


Lesenswert?

Axel S. schrieb:
> anders herum rein, als du es nachher auslesen
> willst. Warum machst du das? Warum schreibst du die Daten - wenn sie
> denn ohnehin in einem byteweisen Buffer vorliegen - überhaupt mit
> eeprom_write_word() statt zweimal eeprom_write_byte()?

das finde ich eigentlich ok. Wenn ich was als Word auslesen will, würde 
ich es auch als Word reinschreiben. Die Umwandlung vom Protokoll hat 
nichts mit der Speicherung zu tun. Würde ich nicht mal an der gleichen 
stelle machen.

von Wolfgang (Gast)


Lesenswert?

Peter II schrieb:
> Die Umwandlung vom Protokoll hat nichts mit der Speicherung zu tun.

Offensichtlich wandelst du die beiden Bytes aus dem Protokoll doch 
falsch in Word um, bevor du es ins EEROM schreibst, sonst würde es auch 
richtig wieder raus kommen.

von Peter II (Gast)


Lesenswert?

Wolfgang schrieb:
> Peter II schrieb:
>> Die Umwandlung vom Protokoll hat nichts mit der Speicherung zu tun.
>
> Offensichtlich wandelst du die beiden Bytes aus dem Protokoll doch
> falsch in Word um, bevor du es ins EEROM schreibst, sonst würde es auch
> richtig wieder raus kommen.

ich wandele überhaupt nichts um, ich versuche zu helfen. Bitte darauf 
achten wer was schreibt.

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.