Forum: Compiler & IDEs Bitreihenfolge tauschen


von Christian (Gast)


Lesenswert?

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

von Peter II (Gast)


Lesenswert?

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.

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

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 ...

von Christian (Gast)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

Das sind doch nur 16Befehle (Bit testen, Bit setzen).

Aber zeig mal die konkrete Zuordnung, da läßt sich bestimmt was 
vereinfachen.


Peter

von Christian (Gast)


Lesenswert?

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

von Ralf G. (ralg)


Lesenswert?

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.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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.

von Christian (Gast)


Lesenswert?

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

von MWS (Gast)


Lesenswert?

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"

von Christian (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.