Forum: Mikrocontroller und Digitale Elektronik Spiegeln eines Bits


von Gast (Gast)


Lesenswert?

Hallo,
es wurde schon einige mal darüber geschreiben wie man ein Byte Spiegeln 
kann.
Ich stehe gerade vor dem Problem das ich beim Layout bin und einen 
ganzen Bus Spiegeln müsste (was viel Platzt auf der Platiene brauchen 
würde).
Bei mir ist aber immer nur maximal 1Bit des Bytes gesetzt also
0000 0001 wird zu 1000 0000
0000 0010 wird zu 0100 0000 usw.

Gibt es hier eine bessere Lösung als durch eine for Schleife?
Ist hier ein Switch angebracht?
Oder sollte ich das Layout doch so machen das es Logisch passt?

Ach so es ist ein Atmega32

Gruß

von Andreas K. (a-k)


Lesenswert?

256 Byte im Code frei? Tabelle.

von Gast (Gast)


Lesenswert?

> 256 Byte im Code frei? Tabelle.
ich bräuchte ja nur 8 Werte, mit einem:

uint8_t neuwert, altwert;
uint8_t tabelle[] = {0x00, 0x80, 0x40, ....};

neuwert = tabelle[altwert];

würde ich ja viel mehr verbrauchen als ich benötige...
Werte wie 0000 0011 kommen bei mir ja nicht vor. Es ist immer nur 1 Bit 
gesetzt.

von Andreas K. (a-k)


Lesenswert?


von Random .. (thorstendb) Benutzerseite


Lesenswert?

Kannst du das nicht gleich bei der Addressierung spiegeln?
nicht Zugriff auf (1<<i) sondern auf (1<<(7-i)).


VG,
/r.

von Gast (Gast)


Lesenswert?

Das ist es Ich kann ja auch rechtsschiften....
man bin ich blöd...
ich mach jetzt also nicht

PORTC = (0x01<<i);
sondern
PORTC = (0x80>>i);

ich danke euch :)

von Andreas K. (a-k)


Lesenswert?

Sicher sinnvoller. Aber ist dir klar, dass diese Operation auf AVRs auch 
bloss eine Schleife ist?

von Random .. (thorstendb) Benutzerseite


Lesenswert?

autsch der AVR hat keinen Barrel Shifter (wie die ARMs) :-)
Aber sollte doch immernoch schneller sein, als ne for-schleife?
Gleich mal compiler anwerfen :-)

VG,
/r.

von Gast (Gast)


Lesenswert?

>Sicher sinnvoller. Aber ist dir klar, dass diese Operation auf AVRs auch
>bloss eine Schleife ist?
ja es gibt ja nur einen einfachen rechts und links shift. Aber das ist 
nicht so schlimm die paar ca 16 Takte hab ich Zeit.

Oder gibt es wohlmöglich noch eine bessere Möglichkeit?
für neue Infos bin ich immer offen.

von Thomas B. (detritus)


Lesenswert?

Nach links schieben geht auch mit Multiplikation mit 2. Das kann auf 
AVRs mit Hardware-Multiplizierer ab ner gewissen Grenze schneller sein 
als mehrmals shiften.

von Stefan E. (sternst)


Lesenswert?

Ich sehe nicht so ganz, wie du mit "PORTC = (0x80>>i);" das spiegeln 
realisieren willst. Du kannst für i ja nicht direkt den Ausgangswert 
einsetzen. Du müsstest i erstmal ermitteln. Dann kannst du bei diesem 
"Ermitteln" auch gleich das Spiegeln erledigen. Z.B.:
1
neu = 0x80;
2
alt >>= 1;
3
while (alt) {
4
  neu >>= 1;
5
  alt >>= 1;
6
}

von Random .. (thorstendb) Benutzerseite


Lesenswert?

*fg
1
neu = 0x80;
2
3
while (alt >>= 1)  neu >>= 1;

von Gast (Gast)


Lesenswert?

Hallo,
danke nochmal für die Antworten, die haben mir schmal viel geholfen!!!

Ich hab nur noch eine Frage wie ihr es besser findet.
Laout so gestalten das das Programm einfacher (bzw. ersichtlicher) wird 
oder Layout einfacher gestalten (bessere Leitungsführung)?
Vielleicht noch dazu die Info das es keine (oder wenige) änderungen im 
Programm geben wird, wenn es einmal korrekt läuft ;)

Gruß

von Gast (Gast)


Lesenswert?

schmal == schonmal
Laout == Layout
usw ... ;)

von Danteln (Gast)


Lesenswert?

Verstehe dein Problem nicht so ganz?
Ich weiß ja nicht, wie sehr du dich mit der Thematik auskennst, aber 
wenn du immer nur ein Bit ändern must bzw. auf deinem Bus immer nur ein 
Bit gesetzt ist, dann würde ich das einfach Programmtechnisch lösen!!!
Wie schon von anderen erwähnt bzw. von dir durch Shiften nach links bzw. 
nach rechts oder etwas anderes was deine Anforderungen abdeckt. Wo ist 
das Problem sich 8 Werte in einer Tabelle abzulegen?
Ein Tipp noch:
Rechnen würde ich untelassen da dies immer viel zu viel zeit in Anspruch 
nimmt. Aber das steht bei diesem Problem ja auser Frage! :=)
Also noch viel Erfolg!

LG...Kai

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.