> Deine neue Belegung sieht so aus
>
> 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
> +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
> | | | | | | | | | | | | | | | | |
> +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
> PD7 PD6 PD5 PD4 PD3 PD2 PC1 PC0 PB7 PB6 PB5 PB4 PB3 PB2 PB1 PB0
> | PORTD | PORTC | PORTB |
>
> Und dafür musst du dir jetzt eine neue Veschiebesequenz suchen.
> Ist doch nicht so schwer.
Wurde unterbrochen :-)
Wie geht das?
Kümmern wir uns erst mal nur um die oberen 8 Bit.
Wie entstehen die?
Da sind erst mal die 8 Bits vom PORTD
PD7 PD6 PD5 PD4 PD3 PD2 PD1 PD0
und dann noch die 8 Bits vom PORTC
PC7 PC6 PC5 PC4 PC3 PC2 PC1 PC0
und die sollen jetzt so 'zusammengemischt' werden, dass sich ein 8 Bit
Wert ergibt, der aus
PD7 PD6 PD5 PD4 PD3 PD2 PC1 PC0
besteht.
Die Strategie sieht so aus. Wir würden gerne 2 geeignet aufbereitete
Werte zusammenodern. Damit aber zb der Wert von PC6 das Endergebnis
nicht beeinflusst, wird dieses Bit gezielt auf 0 gesetzt. Denn das
Ergebnis von 0 oder irgendeinem_anderen_Bit hängt dann nur noch von
irgendeinem_anderen_Bit ab. Die 0 ist bei einer Oder Operation für das
Ergebnis nicht relevant.
Wir wollen also 2 Werte haben, deren Bits so aussehen
PD7 PD6 PD5 PD4 PD3 PD2 0 0 <- vom PORTD
0 0 0 0 0 0 PC1 PC0 <- vom PORTC
denn wenn diese beiden Werte zusammengeodert werden, dann enstehen genau
die 8 Bit deren Werte wie gewünscht von den Port Werten abhängen.
Also erhebt sich die Zwischenfrage: Wie erreicht man zb
PD7 PD6 PD5 PD4 PD3 PD2 0 0
Das wiederrum ist einfach. Mit einer Und Operation können Bits gezielt
auf 0 gesetzt werden. Alle Bits die übrig bleiben sollen, werden in
einer Maske auf 1 gesetzt, alle Bits die gezielt auf 0 gesetzt werden
sollen, werden in der Maske auf 0 gesetzt. Verundet man also
PD7 PD6 PD5 PD4 PD3 PD2 PD1 PD0
und 1 1 1 1 1 1 0 0
---------------------------------------
dann erhält man
PD7 PD6 PD5 PD4 PD3 PD2 0 0
genau so wie wir es brauchen.
Dasselbe nochmal mit den Bits vom PORTC
PC7 PC6 PC5 PC4 PC3 PC2 PC1 PC0
und 0 0 0 0 0 0 1 1
-----------------------------------------
0 0 0 0 0 0 PC1 PC0
damit können wir die 8 Bits generieren, die die oberen 8 Bits des 16 Bit
Ergebnisses ausmachen.
In C Schreibweise
( PORTD & 0xFC ) | ( PORTC & 0x03 )
Diese 8 Bit werden um 8 Stellen nach links geschoben, damit die unteren
8 Bit frei werden, um darin dann denn Inhalt vom PORTB noch
hineinzuodern (einzumischen).
Also lautet die Operation in Summe: (der Übersichtlichkeit halber in
mehrere Anweisungen aufgeteilt)
1 | outreg = ( PORTD & 0xFC ) | ( PORTC & 0x03 );
|
2 | outreg = outreg << 8;
|
3 | outreg = outreg | PORTB;
|
Oder wenns denn sein muss, alles in einem
1 | outreg = ( ( ( PORTD & 0xFC ) | ( PORTC & 0x03 ) ) << 8 ) | PORTB;
|
Jetzt bist du drann um die Umkehrung zu codieren. Aus dem 16 Bit Wert,
die entsprechenden Bits zu extrahieren und an die entsprechenden Ports
zu schreiben.