Forum: Mikrocontroller und Digitale Elektronik Zahlen wandeln 3x16bit -> 4x12bit


von Rene S. (Firma: BfEHS) (rschube)


Lesenswert?

Hallo uC-Gemeinde,

ich habe in einem laufenden Projekt eine Herausforderung.
Das Protokoll einer Datenübertragung muss geändert/erweitert werden.
Ich habe allerdings im uC nicht mehr viel Platz und suche deshalb einen 
kleinen ASM-Code.

Umwandlung von 3 x 16 Bit Zahlen in 4 x 12 Bit Zahlen und umgekehrt.
Die Datenübertragung von 3 x 16 Bit ist festgelegt.

 F                 0 F                 0 F                 0
+-------------------+-------------------+-------------------+
|        Old1       |        Old2       |        Old3       |
+---------+---------+---------+---------+---------+---------+
|  HWord  |  LWord  |  HWord  |  LWord  |  HWord  |  LWord  |
+----+----+----+----+----+----+----+----+----+----+----+----+
|    |    |    |    |    |    |    |    |    |    |    |    |
+----+----+----+----+----+----+----+----+----+----+----+----+

 C            0 C            0 C            0 C            0
+--------------+--------------+--------------+--------------+
|     New1     |     New2     |     New3     |     New4     |
+--------------+--------------+--------------+--------------+

Für eine Richtung müsste es so funktionieren:
Old1_HWord = New1 >> 4
Old1_LWord = ((New1 & 0x00F) << 4) + (New2 >> 8)
Old2_HWord = New2 & 0x0FF
Old2_LWord = New3 >> 4
Old3_HWord = ((New3 & 0x00F) << 4) + (New3 >> 8)
Old3_LWord = New4 & 0x0FF

Plattform ASM MCS51/MCS52. Optimiert nach Codegrösse. Geschwindigkeit 
sekundär.

Frage:
- Ist das so richtig?
- Geht das in ASM für MCS51/52 kleiner/einfacher
- Wie sieht das in der entgegengesetzten Richtung aus

Vielen Dank für eure Ideen und Vorschläge,
Grüsse aus dem kalten Berlin
Rene
von Volkmar D. (volkmar)


Lesenswert?

Rene Schube schrieb:
> - Wie sieht das in der entgegengesetzten Richtung aus
Die andere Richtung sieht ähnlich aus (ist aber ungetestet):
1
New1 = (Old1_HWord << 4) | (Old1_LWord >> 4);
2
New2 = (Old1_LWord << 8) | Old2_HWord;
3
New3 = (Old2_HWord << 4) | (Old2_LWord >> 4);
4
New4 = (Old2_LWord << 8) | Old3_HWord;
von Rene S. (Firma: BfEHS) (rschube)


Lesenswert?

Danke für die schnelle Rückmeldung. Ich werde mich mal dran setzten und 
das in ASM austesten.
von karoly (Gast)


Lesenswert?

Hallo,

vielleicht ein kleiner Tipp von mir wenn du es vor hast im Assembler 
umzusetzen: statt 4-mal verschieben würde ich den swap-Befehl verwenden 
der die Nibbles eines Bytes vertauscht, damit wird der gesamtcode auch 
kürzer.
von Rene S. (Firma: BfEHS) (rschube)


Lesenswert?

Danke, das habe ich schon im Hinterkopf.
Ich frimmel den ASM-Code zusammen und stelle den dann hier rein...
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.