F: Können einzelne Pins verschiedener Ports eines Mikrocontrollers einem Register zugeordnet und ihre Werte beim Ändern des Registerwerts geändert werden?
Szenario: Ich habe einige Pins von jedem Port (8-Bit) des Mikrocontrollers belegt. Jetzt möchte ich ein Gerät anschließen, das einen 8-Bit-Bus benötigt (angenommen, D0 bis D7 IN SEQUENCE), das heißt, ich benötige 8 Pins vom Controller, damit ich sie eins zu eins anschließen kann
portx0 -> D0 // x is the name of port followed by bit location on that port
portx1 -> D1
...
portx7 -> D7
aber ich habe nicht einen ganzen Port mit 8 Pins, den ich mit diesem Gerät verbinden kann, sondern ich habe einige Pins von portx, einige von porty und einige von portz. Das neue Verbindungsszenario ist wie folgt: (Verbindung vom Mikrocontroller zum Gerät)
portx0 -> D0
portx1 -> D1
portx2 -> D2
porty4 -> D3
porty5 -> D4
porty6 -> D5
porty7 -> D6
portz1 -> D7
In diesem Zustand, wenn ich einen Wert senden möchte, sagen
unsigned char dataReg = 0xFA;
An meinem Gerät vom Controller muss ich bitweise Operationen an dem zu sendenden Wert durchführen und jeden Pin gemäß dem Wert im Register einzeln einstellen. Beispielsweise
portx0 = ((dataReg & 0x01) >> 0 ); // Masking and shifting as bit position
portx1 = ((dataReg & 0x02) >> 1 );
portx2 = ((dataReg & 0x04) >> 2 );
porty4 = ((dataReg & 0x08) >> 3 );
porty5 = ((dataReg & 0x10) >> 4 );
porty6 = ((dataReg & 0x20) >> 5 );
porty7 = ((dataReg & 0x40) >> 6 );
portz1 = ((dataReg & 0x80) >> 7 );
Kommen wir nun zur Hauptfrage, um diese individuellen Berechnungen für jedes Bit an verschiedenen Ports zu vermeiden. Können einzelne Pins verschiedener Ports eines Mikrocontrollers auf ein Register abgebildet und ihre Werte beim Ändern des Registerwerts geändert werden?