Hey Leute ich will bei einer 16 Bit Variable auf einzelne Bits oder die
gesamte Variable zugreifen ich habe das so gemacht:
warum geht dass nicht ? mit WINAVR
typedef union
{
unsigned char bit_1:1; // 1. Bit
unsigned char bit_2:1; // 2. Bit
unsigned char bit_3:1; // 3. Bit
unsigned char bit_4:1; // 4. Bit
unsigned char bit_5:1; // 5. Bit
unsigned char bit_6:1; // 6. Bit
unsigned char bit_7:1; // 7. Bit
unsigned char bit_8:1; // 8. Bit
unsigned char bit_9:1; // 9. Bit
unsigned char bit_10:1; // 10. Bit
unsigned char bit_11:1; // 11. Bit
unsigned char bit_12:1; // 12. Bit
unsigned char bit_13:1; // 13. Bit
unsigned char bit_14:1; // 14. Bit
unsigned char bit_15:1; // 15. Bit
unsigned char bit_16:1; // 16. Bit
unsigned short bitfield;// ganze Variable
}manchester_bitfield;
Das "char" ist hier nicht das Problem. Eher schon, dass alle 16 Bits an der selben Stelle stehen. Bitfields sind tendentiell eher Problem als Lösung. Masken sehen nicht so elegant aus, dafür funktionieren sie. Und kommen ohne solche schauderhaften overlay unions aus.
Du vermischt hier zwei Dinge, ein Bitfeld und eine Union. Das geht so nicht, da eine Union die Überlagerung aller einzelnen Elemente ist (das wäre hier also eine Überlagerung aller einzelnen Bits), Du aber willst ein Bitfeld und eine andere Variable überlagern. Das sollte so gehen:
1 | typedef union |
2 | {
|
3 | struct
|
4 | {
|
5 | unsigned short bit_1:1; // 1. Bit |
6 | unsigned short bit_2:1; // 2. Bit |
7 | unsigned short bit_3:1; // 3. Bit |
8 | unsigned short bit_4:1; // 4. Bit |
9 | unsigned short bit_5:1; // 5. Bit |
10 | unsigned short bit_6:1; // 6. Bit |
11 | unsigned short bit_7:1; // 7. Bit |
12 | unsigned short bit_8:1; // 8. Bit |
13 | unsigned short bit_9:1; // 9. Bit |
14 | unsigned short bit_10:1; // 10. Bit |
15 | unsigned short bit_11:1; // 11. Bit |
16 | unsigned short bit_12:1; // 12. Bit |
17 | unsigned short bit_13:1; // 13. Bit |
18 | unsigned short bit_14:1; // 14. Bit |
19 | unsigned short bit_15:1; // 15. Bit |
20 | unsigned short bit_16:1; // 16. Bit |
21 | };
|
22 | unsigned short bitfield;// ganze Variable |
23 | } manchester_bitfield; |
Das Bitfeld ist in einer anonymen Struktur verpackt und damit sollte es funktionieren. Im übrigen ist es ratsam, Bits korrekt durchzunumerieren. C ist nicht Pascal, also ist das erste Bit "Bit 0" und nicht "Bit 1", ebenso wie das letzte Bit nicht "Bit 16", sondern "Bit 15" ist. Einfach angewöhnen, das hilft spätere Fehler zu vermeiden.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.