Bitreihenfolge tauschen

Gast #2570512
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
Gast #2570549
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
Gast #2570622
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
Persönliche Seite #2570800
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.
Gast #2571497
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren