Hi,
ich habe folgendes defniert:
1 | union{
|
2 | volatile struct{
|
3 | unsigned :2;
|
4 | unsigned white:1;
|
5 | unsigned red:1;
|
6 | unsigned blue:1;
|
7 | unsigned green:1;
|
8 | unsigned violett:1;//Magenta
|
9 | unsigned yellow:1;
|
10 | }bits;
|
11 | unsigned int all;
|
12 | }ColorPick;
|
und führe dann später folgendes aus:
1 | //6 Farben
|
2 | for (; temp > 0; temp--)
|
3 | {
|
4 | ColorPick.all >> 1;
|
5 |
|
6 | if (ColorPick.all < 4)
|
7 | ColorPick.all = 0b10000000;
|
8 | }
|
9 | set_pwm((ColorPick.bits.white | ColorPick.bits.red | ColorPick.bits.violett) ? 255 : 0,
|
10 | (ColorPick.bits.white | ColorPick.bits.green) ? 255 : 0,
|
11 | (ColorPick.bits.white | ColorPick.bits.blue | ColorPick.bits.violett) ? 255 : 0, 255);
|
Kurze Erklärung dazu, was ich eingentlich bewecken möchte.
Ich benötige etwas ähnliches wie ein BOOL[6], bei dem immer nur EIN
Eintrag TRUE ist und dieser mittels Schleife weitergeschoben wird.
Möchte aber gerne die einzelnen Bits benennen können. Des Weiteren
befinde ich mich auf einem PIc und möchte nicht 6x uint8_t verschwenden.
Laut Compilerhandbuch ist die erste variable im struct das LSB. Da ich
nur 6 benötige lasse ich ab dem vorletztem LSB "resetten".
Um ein Shift ausfüren zu dürfen, musste ich noch das Union drumherum
basteln.
Nun die Frage an euch: Geht es auch schöner und kompakter?
In jedem Fall möchte ich "red" etc. noch lesen können. ColorPick >> x
wäre auch schön, aber ich sehe keinen Weg das Union zu umgehen und ein
Shift direkt auf das struct machen zu dürfen.
Grüße Oekel