Forum: Mikrocontroller und Digitale Elektronik Steckerpinbelegung per Software ändern


von Stephan (Gast)


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?

von STK500-Besitzer (Gast)


Lesenswert?

so vielleicht?
DMX973 = (data >>1) | (data <<1);

von Stephan (Gast)


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

von Roland .. (rowland)


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;

: Bearbeitet durch User
von STK500-Besitzer (Gast)


Lesenswert?

so schlecht lag ich beim Schuss aus der Hüfte ja gar nicht.

von Stefan (Gast)


Lesenswert?

Mit einer Mapping-Tabelle (array) geht das schneller, belegt allerdings 
256 bytes Ram.

DMX973=mapping[data];

von Roland .. (rowland)


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.

: Bearbeitet durch User
von spontan (Gast)


Lesenswert?

>ich kann die Stecker aber nicht umbelegen.

Warum nicht ?

von Stephan (Gast)


Lesenswert?

Suuupercoool! Dankeschön!

spontan schrieb:
> Warum nicht ?

Den kann man später sehen und das sieht nicht aus wenn da was von Hand 
rumgefrickelt wurde!

STK500-Besitzer schrieb:
> so schlecht lag ich beim Schuss aus der Hüfte ja gar nicht.

Joa, für nach Null Uhr schon dicht dran!

von Chr. M. (snowfly)


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"

: Bearbeitet durch User
von Fabian O. (xfr)


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.

: Bearbeitet durch User
von Amateur (Gast)


Lesenswert?

Was passiert eigentlich, wenn man auf ein Flachbandkabel einen 
zusätzlichen Stecker, nun aber von oben, aufpresst? Die Nase natürlich 
in die richtige Richtung.

von Reinhard Kern (Gast)


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

von Max D. (max_d)


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

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.