Forum: Mikrocontroller und Digitale Elektronik Falsch verdrahtet...trotzdem was zu machen?? HILFE!


von Steffen81 (Gast)


Lesenswert?

Hallo, ich lese 16 Bit über die Ports C und F ein. Nur leider ist das
MSB an der Stelle PC0 und das LSB an der Stelle PF7. Was nun...??
(Platine ist schon fertig)
PC0 (MSB)
PC1 (MSB-1)
...
PC7 (MSB-7)
PF0 (MSB-8)
...
PF7 (LSB)
Wie kann ich die 16Bit trotzdem richtig einlesen?? Danke für HILFE!!!

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Hi

einfach einlesen und in Software dann die Bits entsprechend drehen? Das
Drehen geht dann alternativ über eine große Look-Up Tabelle, zwei kleine
und ein swap oder über eine Menge Schieboperationen.

Matthias

von Ingo (Gast)


Lesenswert?

Bsp. (als Ergänzung zu dem was Mathias gesagt hat):

1 PORTC und PORTF in Software tauschen.
2 Dann für beide Bytes (C und F)
  21 CALL GetNibble
  22 Ergebnis zwischenspeichern
  23 Obere 4 Bit nach unten schieben
  24 CALL GetNibble
  25 Ergebnis 4 Bit nach oben schieben
  26 Zwischenergebnis einmaskieren (ODER mit zwischenErgebnis)

SUB GetNibble
  G1 Untere 4 Bit ausmaskieren (UND mit 0x0F)
  G2 Aus Look Up Tabelle mit 16 Einträgen das geswapte Nibble auslesen

Die Tabelle sieht dann so aus
uint8_t nibbleTab[] =
{
 0b00001111,
 0b00001110,
 ...
 0b00000001,
 0b00000000
};

von Steffen81 (Gast)


Lesenswert?

Danke...hat vielleicht einer nen Tipp, wie das schnell und schmerzlos in
C geht?

von Steffen82 (Gast)


Lesenswert?

Man, die angebotenen Ideen in C zu übersetzen sollte dir doch wirklich
möglich sein...

von Steffen81 (Gast)


Lesenswert?

Sorry...wenn ich es geschafft hätte, hätte ich nicht nochmal gepostet!

von tsalzer (Gast)


Lesenswert?

hi,
bei einem verdrehten Port kann man doch so  einlesen..
 wert = 256 - PORT, oder geht das jetzt nicht?

ts

von Die Waldfee (Gast)


Lesenswert?

Also, sorry, aber wenn Du den ausführlichen Vorschlag von Ingo nicht
umsetzen kannst, dann kann Dir echt keiner weiterhelfen.

von Kurt (Gast)


Lesenswert?

Sehr primitiv - aber es geht (in Codevision):

if (PINC.0 == 0) ..... = 1 ; else.... = 0;
.
.
.
.
.

SG Kurt

von Potzenplotz (Gast)


Lesenswert?

Matthias und Ingo..... viel geschrieben und wieder einmal nichts
gesagt.
Kuschelt ihr miteinnander ?

SG Potzenplotz

von Rahul (Gast)


Lesenswert?

x = PINF;
y = 0xFF;
for(i=0;i<8;i++)
{
 if (x & (1<<i))) y &= ~(1<<(7-i));
}

nicht schön, könnte aber gehen, wobei in y gedrehte Varinte des PINF
steht... (stehen müsste)
Die Methode ist relativ langsam. Wenn man 8 Vergleiche hintereinander
schreibt, müsste schneller gehen...
Etwa so:
if (x & (1<<0)) y &= (1<<7);
if (x & (1<<1)) y &= (1<<6);
if (x & (1<<2)) y &= (1<<5);
if (x & (1<<3)) y &= (1<<4);
if (x & (1<<4)) y &= (1<<3);
if (x & (1<<5)) y &= (1<<2);
if (x & (1<<6)) y &= (1<<1);
if (x & (1<<7)) y &= (1<<0);

Dabei ersetzt der Compiler die (1<<n) durch Konstanten...

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.