www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Spiegeln eines Bits


Autor: Gast (Gast)
Datum:

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

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
256 Byte im Code frei? Tabelle.

Autor: Gast (Gast)
Datum:

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

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Random ... (thorstendb) Benutzerseite
Datum:

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


VG,
/r.

Autor: Gast (Gast)
Datum:

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

Autor: Andreas K. (a-k)
Datum:

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

Autor: Random ... (thorstendb) Benutzerseite
Datum:

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

Autor: Gast (Gast)
Datum:

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

Autor: Thomas B. (detritus)
Datum:

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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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.:
neu = 0x80;
alt >>= 1;
while (alt) {
  neu >>= 1;
  alt >>= 1;
}

Autor: Random ... (thorstendb) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
*fg
neu = 0x80;

while (alt >>= 1)  neu >>= 1;

Autor: Gast (Gast)
Datum:

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

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schmal == schonmal
Laout == Layout
usw ... ;)

Autor: Danteln (Gast)
Datum:

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

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.