Zerspannungsmechaniker schrieb:
> Ich hatte gehofft, das man statt Bitpopelei da was in der Art
>
1 | > struct status {
|
2 | > unsigned char b0:1;
|
3 | > unsigned char b1:1;
|
4 | > unsigned char b2:1;
|
5 | > unsigned char b3:1;
|
6 | > unsigned char b4:1;
|
7 | > unsigned char b5:1;
|
8 | > unsigned char b6:1;
|
9 | > unsigned char b7:1;
|
10 | > };
|
11 | >
|
> mit einer struct machen könnte.
ist genauso Bitpopelei
Wo liegt den das Problem.
Schreib dir deine Ausgangslage hin
PD3 PD2 PC5 PC4 PC3 PC2 PC1 PC0
und überleg dir welche Bitblöcke du beim Einlesen wie schieben musst,
damit genau diese Bitfolge rauskommt. Ist doch kein wirkliches Problem.
Du liest von PIND ein, dann hast du
PD7 PD6 PD5 PD4 PD3 PD2 PD1 PD0
interessiert (in Ergebnis nachsehen) bist du an PD3 und PD2. Also setzt
du gezielt erst mal alle anderen Bits auf 0. Dann hast du
0 0 0 0 PD3 PD2 0 0
Jetzt schaust du wieder aufs Ergebnis und vergleichst. Wenn du dein
0-gesetztes Zwischenergebnis um 4 Stellen nach links schiebst, sind die
beiden Bits dort wo sie sein sollen.
PD3 PD2 0 0 0 0 0 0
und sind fertig um ins Ergebnis übernommen zu werden.
Und jetzt im ganzen C-Satz:
uint8_t bitsD = PIND;
bitsD &= ~( 1 << PD3 | 1 << PD2 ); // auf 0 setzen
bitsD <<= 4;
fertig zum Zusammenführen mit den Bits vom C-Port.
Beim Schreiben genau anders rum. Du hast 8 Bit und musst du nach diesem
Schema auf die Portbits verteilen. Auch da gibt es wieder Bitblöcke die
gemeinsam behandelt werden können.