Bits umtauschen (spiegeln)

Gast #4800022
Lesenswert?

Es weihnachtet wieder einmal und ich habe mein 16x10 LED Display 
vorgekramt.
ATmega128
es werden 2x8Bit (PortA linke hälfte, PORTC rechte hälfte)) breit pro 
Zeile dargestellt und das alles 10x (PORTD mit 74HCT42 0-9 
decodiert)nach unten widerholt.(PORTD=10->alles aus)
Seinerzeit(tm) hatte ich das mit den Fastavr-"Compiler" (ähnlich BASCOM) 
zusammengebastelt und ging eigentlich auch ganz gut.
Durch eine damalige Unachtsamkeit beim Routing sind jedoch alle Portbits 
vom PORTA und PORTC vertauscht.
aus PA.0->PA.7 wurde PA.7->PA.0 usw. schnief

Ich habe das damals softwaremäßig so gelöst:
1
Function umkehr(n As Byte) As Byte
2
Local m As Byte
3
m = 0
4
If n.0 Then : Set m.7 : End If
5
If n.1 Then : Set m.6 : End If
6
If n.2 Then : Set m.5 : End If
7
If n.3 Then : Set m.4 : End If
8
If n.4 Then : Set m.3 : End If
9
If n.5 Then : Set m.2 : End If
10
If n.6 Then : Set m.1 : End If
11
If n.7 Then : Set m.0 : End If
12
Return m
13
End Function

Ich bin nun dabei ,das ganze nach C zu portieren, weil ich dieses 
FASTAVR nicht mehr finde hust, stehe aber vor dem gleichen 
Hardwareproblem, denn hier hat sich ja nichts geändert.

Geht das in C etwas eleganter zu lösen?

Danke
Axelr.
Angehängte Dateien:
Gast #4800045
Lesenswert?

Danke soweit, kann jetzt weiter testen!
(ich hatte die Sufu verwendet, dachte ich - hmmm)

Aber: das die "__builtin_avr_insert_bits" die Reihenfolge tauscht: 
da´rauf muss man erstmal kommen...

um nur einige Möglichkeiten für alle aufzuzeigen
http://www.avrfreaks.net/forum/nibble-rotate-how
Gruß
Axel und vielen Dank
1
    result <<= 1;
2
    if (n & 1)
3
    result |= 1;
1
    result <<= 1;
2
    result |= n & 1;
1
b = __builtin_avr_insert_bits(0x01234567,a,0);
1
Dim Inbyte As Byte
2
Dim Outbyte As Byte
3

4
Dim I As Byte
5
Dim J As Byte
6

7
I = 0
8
J = 7
9

10
Do
11
   Outbyte.i = Inbyte.j
12
   Decr J
13
   Incr I
14
Loop Until J < 0

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren