Forum: Mikrocontroller und Digitale Elektronik Steckerpinbelegung per Software ändern


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Stephan (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
so vielleicht?
DMX973 = (data >>1) | (data <<1);

von Stephan (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


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

von Stefan (Gast)


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

DMX973=mapping[data];

von Roland .. (rowland)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
>ich kann die Stecker aber nicht umbelegen.

Warum nicht ?

von Stephan (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.