Steckerpinbelegung per Software ändern

Gast #3454803
Lesenswert?

Hallo!

Meine verzwickte Lage: ein Display(Lascar 973b) und ein 
Entwicklungsboard (STK600)ist per 8-pol-Flachbandkabel verbunden.
Dieses Kabel verbinden einen kompletten Port des µC mit einem (/dem) 
kompletten Port des Displays. Dadurch sollen Bytes direkt parallel 
versendet werden.

Das Problemchen: die Steckerbelegung des Displayanschlusses ist eine 
andere als die des Entwicklungsboards: hier linksrechtslinksrechts... 
dort rechtslinksrechtslinksrechtslinks... Würde man Bit 1/2; 3/4; 5/6; 
7/8 tauschen, wäre alles gut, ich kann die Stecker aber nicht umbelegen.

Die folgende, separierte, vorhandene Prozedur (kleiner Teil einer dicken 
library) sendet ein Byte an das DMX973 definierte PORTB.
1
#define DMX973 PORTB
2

3
void dmx973_byte (unsigned char data )
4
{
5
    DMX973 = data;
6
}

Frage: wie baue ich in das Makro eine Maskierung und Verschiebung ein, 
um die betreffenden Bits auszutauschen?
Gast #3454813
Lesenswert?

An dieser Stelle vlt schon.

Nur leider zieht sich die Schreibweise "DMX973 = data;" durch die 
gesamte Bibliothek, daher müsste ich den Code an allen Stellen umändern.
Gern würde ich dies daher in die Makrodefinition einbauen...
#3454916
Lesenswert?

STK500-Besitzer schrieb:
> DMX973 = (data >>1) | (data <<1);

Nein, das macht nicht die geforderte Vertauschung, Beispiel:

Datenbyte:    11001100

Liksshift:    10011000
Rechtsshift:  01100110

Veroderung:   11111110

Gefordert wäre aber als Ausgabe wider das Ursprungsbyte, da Bit 0/1, 
2/3, 4/5, 6/7 getauscht werden sollen.

Korrekt wäre:
Datenbyte:    11001100

Liksshift:    10011000
Liksmaske:    10101010
VerundungL:   10001000

Rechtsshift:  01100110
Rechtsmaske:  01010101
VerundungR:   01000100

VerundungL:   10001000
VerundungR:   01000100
Veroderung:   11001100

Ergibt also wider das Ursprungsbyte, bzw. eben getauschte Bits.

Schreibweise in C:

DMX973 = ((data >> 1) & 0x55) | (data << 1) & 0xAA;
#3455008
Lesenswert?

Roland ... schrieb:
> DMX973 = ((data >> 1) & 0x55) | (data << 1) & 0xAA;

Die Klammer des zweiten Ausdrucks fehlt noch:
DMX973 = ((data >> 1) & 0x55) | ((data << 1) & 0xAA);

Zwar bindet das UND laut C++ Buch stärker als das ODER und der 
Shiftoperator stärker als das UND, was ja genau der geforderten 
Reihenfolge entsprechen würde, dennoch finde ich ein Klammer der 
Ausrücke eindeutiger, eben für den, der den Code lesen muss.
#3455609
Lesenswert?

Mechanisch würde das auch gehen mit einem Stück Flachbandkabel,
hinten und vorne den Wannestecker drauf und den Teil wo die beiden
Wannenstecker dann aufeinandertreffen mit Stiftleisen verbinden.

Ist zwar auch nicht schön aber sieht nicht aus wie handgefrickelt.
http://www.mikrocontroller.net/attachment/89150/DSCF1115.jpg
Beitrag "Wannenstecker spiegelverkehrt angordnet"
#3456164
Lesenswert?

Stephan schrieb:
> Nur leider zieht sich die Schreibweise "DMX973 = data;" durch die
> gesamte Bibliothek, daher müsste ich den Code an allen Stellen umändern.
> Gern würde ich dies daher in die Makrodefinition einbauen...

Wenn Du einen C++-Compiler nimmst, könntest Du aus DMX973 ein Objekt 
machen und einen entsprechenden Zuweisungsoperator definieren. Imo ist 
es aber sinnvoller, aus dem Makro eine Inline-Funktion zu machen und die 
ganzen Stellen zu ersetzen, dann hast Du eine saubere Lösung.
Gast #3456216
Lesenswert?

Amateur schrieb:
> Was passiert eigentlich, wenn man auf ein Flachbandkabel einen
> zusätzlichen Stecker, nun aber von oben, aufpresst?

Nichts, Rien, Nada.

Wenn man die Reihen vertauschen will, muss man das Kabel in Paare 
auftrennen und jedes Paar für sich verdreht einführen.

Gruss Reinhard
#3456220
Lesenswert?

Selbst "richtige" Anwendungen mit enormen Stückzahlen drehen in nem 
Flachbandkabel die Adern einzeln um. Man muss sich nur mal ein altes 
Floppy kabel ansehen, da sind z.b. auch zwei adern gedreht zwischen den 
beiden Steckern. Ich würde also eher das Kabel passend umbelegen anstatt 
in Software irgendwie was hinzufrickeln (wobei man sagen muss, dass es 
bei einem Disp noch OK sein kann es in Software zu machen, die datenrate 
ist oft klein genug um die Auswirkungen klein zu halten).....

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