Forum: Mikrocontroller und Digitale Elektronik Bits in Variable per #define ansprechen


von Marco S. (sharkman)


Lesenswert?

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

von bitte löschen (Gast)


Lesenswert?

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.

von Marco S. (sharkman)


Lesenswert?

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?

von michl (Gast)


Lesenswert?

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.

von IsobarX (Gast)


Lesenswert?

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

von bitte löschen (Gast)


Lesenswert?

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
}

von IsobarX (Gast)


Lesenswert?

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

von Marco S. (sharkman)


Lesenswert?

@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
Noch kein Account? Hier anmelden.