D: È possibile mappare singoli pin di porte diverse di un microcontrollore su un registro e modificarne i valori quando si modifica il valore del registro?
Scenario: ho esaurito alcuni pin di ciascuna porta (8 bit) del microcontrollore. Ora voglio interfacciare un dispositivo che necessita di un bus a 8 bit (supponiamo da D0 a D7 IN SEQUENZA), vale a dire che ho bisogno di 8 pin dal controller in modo da poterli connettere in un modo uno a uno
portx0 -> D0 // x is the name of port followed by bit location on that port
portx1 -> D1
...
portx7 -> D7
ma non ho un'intera porta di 8 pin che posso collegare con questo dispositivo, piuttosto ho alcuni pin di portx, alcuni di porty e alcuni di portz. Il nuovo scenario di connessione è il seguente (connessione rispettivamente dal microcontrollore al dispositivo)
portx0 -> D0
portx1 -> D1
portx2 -> D2
porty4 -> D3
porty5 -> D4
porty6 -> D5
porty7 -> D6
portz1 -> D7
In questa condizione se voglio inviare un valore dire
unsigned char dataReg = 0xFA;
sul mio dispositivo dal controller devo eseguire operazioni bit-saggio sul valore da inviare e impostare ciascun pin in base al valore nel registro individualmente. Per esempio
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 );
Ora, arrivando alla domanda principale, per evitare questi singoli calcoli su ciascun bit su porte diverse, è possibile associare a un registro i singoli pin di diversa porta di un microcontrollore e modificarne i valori quando si modifica il valore del registro?