Hallo, ich suche einen Lösungsansatz, um schnell die Bits eines Bytes zu tauschen. An einem 8Bit Port des Mikrocontrollers habe ich einen FT245 angeschlossen. Aus layouttechnischen Gründen sind die Bit-Reihenfolgen am FT245 und am Controller verschieden. Mein erster Ansatz wäre es, das Ganze über eine Look-Up-Table zu lösen mit 256 Einträgen (bzw. 2 Stück: Eine für die Ausgabe, eine für die Eingabe). Das könnte ich sogar entweder auf der Mikrocontrollerseite oder aber auf der PC-Seite, wo die Daten entgegengenommen werden, tun.. Das sollte eigentlich funktionieren, ich muss die Tabellen nur noch aufstellen. Meine Frage: gibt es einen anderen sinnvollen Ansatz? Flash-Speicher ist zur Genüge vorhanden, mit RAM würde ich wenn möglich gern sparsam umgehen. Grüße Christian
wenn du es nur auf der PC-Seite tauscht, dann sollte das doch reichen? Beim PC braucht du dir ja über die 256byte ram keine sorgen zu machen.
Ein Byte mit dem Originalwert und dann die Bits umgekehrt mittels einer Schleife in ein zweites Byte übertragen ? Ich würde das mit 2 Bitmasken angehen, Startwert zum auslesen mit 0x80, zum Schreiben mit 0x01 ... Dann Bits schieben ...
Joachim Drechsel schrieb: > Ein Byte mit dem Originalwert und dann die Bits umgekehrt mittels > einer Schleife in ein zweites Byte übertragen ? > > Ich würde das mit 2 Bitmasken angehen, Startwert zum auslesen mit > 0x80, zum Schreiben mit 0x01 ... Dann Bits schieben ... Wenn eins der Bytes nur rückwärts wäre, wäre das die Lösung meiner Wahl. Die Vertauschung ist aber leider komplett durcheinander.. Grüße Christian
Das sind doch nur 16Befehle (Bit testen, Bit setzen). Aber zeig mal die konkrete Zuordnung, da läßt sich bestimmt was vereinfachen. Peter
Vermutlich werd ich es über die LUT umsetzen, das wird am Schnellsten zum Ziel führen. Meine Frage war auch eher aus Interesse, ob es vielleicht einen "eleganteren" Weg gibt.. Die Zuordnung Controller (Cx) --- FTDI (Dx) C0 --- D3 C1 --- D6 C2 --- D5 C3 --- D7 C4 --- D1 C5 --- D2 C6 --- D4 C7 --- D0
Bei der Suche nach 'Bitreihenfolge' werden 63 Threads angezeigt. Auf die Schnelle: Beitrag "Re: Byte umdrehen" Irgendwo steht das auch noch mundgerecht für 8Bit.
Falls es um avr-gcc geht: Neue Versionen haben ein extra built-in für solches Bitgefummel:
1 | unsigned char inv (unsigned char portd) |
2 | {
|
3 | unsigned char portc = __builtin_avr_insert_bits (0x04217563, portd, 0); |
4 | |
5 | return portc; |
6 | }
|
Für die obige Zuordnung wirft das folgende Sequenz raus:
1 | swap r24 |
2 | bst r24,0 |
3 | ror r24 |
4 | bld r24,7 |
5 | mov __tmp_reg__,r24 |
6 | bst r0,0 |
7 | bld r24,2 |
8 | bst r0,2 |
9 | bld r24,3 |
10 | bst r0,3 |
11 | bld r24,7 |
12 | bst r0,6 |
13 | bld r24,0 |
14 | bst r0,7 |
15 | bld r24,6 |
Zunächst wird die Eingabe um 3 rotiert, so daß schon mal Bits 1, 4 und 5 an der richtigen Position sind. Die restlichen Bits werden dann von Hand kopiert.
Ralf G. schrieb: > Bei der Suche nach 'Bitreihenfolge' werden 63 Threads angezeigt. Auf die > Schnelle: > Beitrag "Re: Byte umdrehen" > Irgendwo steht das auch noch mundgerecht für 8Bit. Die Suchfunktion hab ich schon bemüht mit verschiedenen Varianten von Bitreihenfolge, tauschen usw. Dabei kommen auch einige Threads, allerdings geht es da (soweit ich es gefunden habe!) immer nur darum, ein Byte von MSB-first auf LSB-first bzw. umgedreht umzuwandeln. Wenn Du Dir mein Zuordnungsproblem oben anschaust, wirst Du merken, dass das hier aber so wohl nicht gehen wird :-) Johann L. schrieb: > Falls es um avr-gcc geht: Neue Versionen haben ein extra built-in für > solches Bitgefummel: Das klingt natürlich perfekt. Das AVR-Studio 5 basiert meines Wissens nach auf AVR-GCC, das müsste also passen. Ich werd ich mir gleich mal anschauen. Grüße Christian
Christian schrieb: > immer nur darum, > ein Byte von MSB-first auf LSB-first bzw. umgedreht umzuwandeln. Nicht richtig gesucht, hier werden so ziemlich alle Möglichkeiten durchgekaut: Beitrag "bit invertieren"
MWS schrieb: > Nicht richtig gesucht, hier werden so ziemlich alle Möglichkeiten > durchgekaut: > Beitrag "bit invertieren" Du hast Recht. Danke, ich werds mir durcharbeiten :-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.