Hallo. Ich arbeite mit c18 compiler und hänge grad ein bisschen in der Luft. Es geht um folgendes: Wenn ich von einem Register ein bestimmtes Bit ansprechen möchte, schreibe ich REGISTERbits.BIT Das ganze möchte ich jetzt auch für selbstdefinierte 8bit Variablen haben. Also das ich mir eine Variable als unsigned char definiere und dann schreiben kann VARIABLEbits.BIT allerdings soll nun noch BIT über einen #define BIT 0...7 die Bitstelle angeben. Die Frage ist jetzt, wie stelle ich das am besten an, ohne dass ich jedesmal das gesamte Bitmuster laden muss. Es soll allerdings auch möglich sein, die Variable wie gewohnt mit VARIABLE = 0x00; oder ähnlichem zu beschreiben. besten Dank und schöne Grüße Marco
Probiere mal: http://publications.gbdirect.co.uk/c_book/chapter6/bitfields.html Meinst Du so etwas? Marco Schulze schrieb: > Es soll allerdings auch > möglich sein, die Variable wie gewohnt mit VARIABLE = 0x00; oder > ähnlichem zu beschreiben. Das müsstest Du dann mit einem cast machen.
Ok. Ich bedanke mich. Dann werd ich das mal so versuchen €dit: Also das mit dem cast hat er nicht gefressen. Jemand eine andere Idee oder vielleicht ein Programmbeispiel?
Super Thema, genau das selbe Problem hab ich momentan auch^^ Falls jemand zu einer Lösung kommt / gekommen ist bitte hier posten. Ein Ansatz ist eventuell die jeweilige Header-Datei des µC.
Hallo Marco, vielleicht hilft Dir das folgende Codebeispiel etwas weiter. Du kannst natürlich auch ein unbenutztes Register, z.B. eines GPIOs, verwenden (schneller). Falls man mehrere Bitfelder braucht, dann würde ich das in eine Struktur tun.
1 | /* Terminal Out */
|
2 | #include <stdio.h> |
3 | |
4 | #define Bitfield_0 (Bitfield_init & 0x01)
|
5 | #define Bitfield_1 (Bitfield_init & 0x02)
|
6 | #define Bitfield_2 (Bitfield_init & 0x04)
|
7 | #define Bitfield_3 (Bitfield_init & 0x08)
|
8 | #define Bitfield_4 (Bitfield_init & 0x10)
|
9 | #define Bitfield_5 (Bitfield_init & 0x20)
|
10 | #define Bitfield_6 (Bitfield_init & 0x40)
|
11 | #define Bitfield_7 (Bitfield_init & 0x80)
|
12 | #define Bitfield (*(unsigned int*) &Bitfield_init)
|
13 | |
14 | void main(void) |
15 | {
|
16 | unsigned int Bitfield_init = 0x00; /* Initialisierung der Bitmaske*/ |
17 | Bitfield = 0x0F; /* Bitmaske mit etwas füllen */ |
18 | printf("Der Wert von Bitfield ist: %i\n", Bitfield); |
19 | printf("Der Wert von Bitfield ist: %i\n", Bitfield_0); /* Ausgabe des LSB */ |
20 | Bitfield_7 = 0xFF; /* MSB mit etwas füllen */ |
21 | }
|
MfG IsobarX
1 | typedef struct eBitfeld |
2 | {
|
3 | unsigned bit0:1; |
4 | unsigned bit1:1; |
5 | } EBitfeld; |
6 | |
7 | main() |
8 | {
|
9 | EBitfeld e; |
10 | // Initialisieren:
|
11 | e.bit0 = 0; |
12 | e.bit1 = 0; |
13 | // Beide Bits mit einem mal setzen:
|
14 | *(int*)&e = 3; // dreckig, aber geht! Lesbarer: *((int*)&e) |
15 | // Schauen, ob gefunzt:
|
16 | printf ("Bit 0: %d und Bit 1: %d\n", e.bit0, e.bit1); |
17 | }
|
Bevor ich das vergesse, das ist nur ein Ansatz. Die Makros müssen natürlich etwas komplizierter ausfallen, UND-Operator zum löschen eines Bits, ODER-Operator zum setzen der Bits Grüße IsobarX
@IsobarX Also entweder steh ich voll auf dem Schlauch oder du löst ein anderes Problem, als das was mich interessiert. @Phillip Hmm das könnte gehen, ich brauch das mit dem mehrfachen beschreiben eigentlich hauptsächlich zum initialisieren. Wenn der Compiler das so frisst, dann seis drum, ob sauber oder nicht.
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.