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ß
> 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.
Kannst du das nicht gleich bei der Addressierung spiegeln? nicht Zugriff auf (1<<i) sondern auf (1<<(7-i)). VG, /r.
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 :)
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.
>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.
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.
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 | }
|
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ß
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.