Forum: Mikrocontroller und Digitale Elektronik 1 Bit Variabel deklarieren


von Daniel Blum (Gast)


Lesenswert?

Moin !
Kurze Frage: Falls ich eine Variabl, die nur 1Bit groß ist deklarieren 
möchte, wie mach ich das am besten?

bit x = 0;

erkennt mein Keil Compiler nicht an?
mfg Daniel

von Karl H. (kbuchegg)


Lesenswert?

In C?

Das geht nicht. Die kleinste Einheit ist in C ein Byte.
Allerdings kann man auf jedes einzelne Bit eines Byte
zugreifen, indem man Maskierungen benutzt. Ganz genau
so, wie du in einem Register ein Bit setzt um eine
Funktionalität ein oder auszuschalten.

von Daniel Blum (Gast)


Lesenswert?

Hi !
In C...das muss doch auch irgendwie gehen?
Also ich bin mir ziemlich sicher, dass es geht?
Genau wie char x , muss das auch als bit x funktionieren?
Mit meinem CodeVision AVR C Compiler geht das auch in C !

von Tobi O. (der_ossi)


Lesenswert?

da es genau abzuwägen gilt, ob der Verwaltungsaufwand durch die 
Ersparnis von Speicherplatz gerechtfertigt ist.

Den von Dir gewünschten Datentyp gibt esv nicht! Du kannst Dir ein 
Hilfskonstrukt basteln, wobei ich Dir zum Basistyp unsigned char raten 
würde. Du dimensionierst Dein Array der Länge n dann eben auf n/8+1 und 
speicherst das Element mit ungeraden Indizes im ersten Bit, die mit 
geraden Indizes kommen in die restlichen 7.

oder du machst dir ne bool varialbe die kann auch nur 1 oder 0 sein 
:D:D:D:D

von Daniel Blum (Gast)


Lesenswert?

da habe ich auch schon mal was von gehört !?
bool x = 0;
Definition so ok ?

von Henrik J. (henrikj)


Lesenswert?

Mit bool oder boolean hatte ich es auch schon probiert. Will der 
Compiler aber nicht. Habs damals im WinAVR ausprobiert. Aber mag ja 
sein, dass es mittlerweile geht?!

von Daniel Blum (Gast)


Lesenswert?

Nee ..habe ich gerade mal ausprobiert..nichts geht?
bool,Bool, BOOL erkennt der Compiler nicht an !
Das kann doch nicht so unständlich sein...?

von tex (Gast)


Lesenswert?

wenn Du mehr als ein Boolean brauchst, kannst Du ein char definieren und 
die Bits dann einzeln setzen, löschen und auswerten.

von GISMO (Gast)


Lesenswert?

Mensch bevor ihr irgend etwas Postet sollt ihr mal erst suchen, um die 
Falsh Antworten oder besser gesagt falsche information zu reduzieren. Es 
geht natürlich, man kann in C(gcc) ein bit Variable deklarieren siehe 
dazu gcc tutorial diese Seite Bitfelder 
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial


struct {
   unsigned char bStatus_1:1; // 1 Bit für bStatus_1
   unsigned char bStatus_2:1; // 1 Bit für bStatus_2
   unsigned char bNochNBit:1; // Und hier noch mal ein Bit
   unsigned char b2Bits:2;    // Dieses Feld ist 2 Bits breit
   // All das hat in einer einzigen Byte-Variable Platz.
   // die 3 verbleibenden Bits bleiben ungenutzt
} x;

von pumpkin (Gast)


Lesenswert?

jawollo.

öhm, und bool (boolean) nimmt unter C imho auch ein ganzes byte weg - 
der zustand darf aber nur TRUE oder FALSE sein. da muss man sich was 
eigenes basteln (siehe GISMO's beitrag).

pumpkin

von Tobi O. (der_ossi)


Lesenswert?

@gismo: ist doch genau das was ich gesagt habe ;)

von Peter D. (peda)


Lesenswert?

Daniel Blum wrote:
> Moin !
> Kurze Frage: Falls ich eine Variabl, die nur 1Bit groß ist deklarieren
> möchte, wie mach ich das am besten?
>
> bit x = 0;
>
> erkennt mein Keil Compiler nicht an?


Tut mit leid, aber ich kann nicht in Deinen Kopf sehen.

Welcher Keil ?
Welches Target ?
Welche Fehlermeldung ?


Der Keil C51 für 8051-er kennt jedenfalls den bit Typ.
Und der 8051 hat auch direkte Bitbefehle (setzen, löschen, umdrehen, 
testen usw.).



Peter

von Karl heinz B. (kbucheg)


Lesenswert?

> Es geht natürlich,

Das kommt drauf an wie man es sieht.
Natürlich sind das Bitvariablen. Sie verbrauchen allerdings
immer noch 1 Byte an Speicherplatz (alle zusammen). Du hast
damit als Vorteil gegenüber einer Maskierungslösung lediglich,
dass dir der Compiler die lästige Maskierung und Bitschieberei
abnimmt. Das Problem dabei ist: Die Maskiererei und Bitschieberei
passiert unter Decke und so mancher Programmierer ist sich des
Aufwands den der dem Programm mit einem simplen

   bStatus = 1;

aufbürdet, gar nicht bewusst.

von Peter D. (peda)


Lesenswert?

Karl heinz Buchegger wrote:
> Das Problem dabei ist: Die Maskiererei und Bitschieberei
> passiert unter Decke und so mancher Programmierer ist sich des
> Aufwands den der dem Programm mit einem simplen
>
>    bStatus = 1;
>
> aufbürdet, gar nicht bewusst.


Nun, beim 8051 passiert das direkt in Hardware, er hat ja 128 
Bitvariablen mit diesen Befehlen:

SETB bit
CLR bit
CPL bit
JB bit
JBC bit
JNB bit
MOV C, bit
MOV bit, C
ORL C, bit
ORL C, /bit
ANL C, bit
ANL C, /bit

Bitzugriffe sind also überhaupt kein Aufwand für den Compiler.

Diese Befehle gehen natürlich auch auf die Ports und andere 
bitadressierbare IO-Register.

Man hatte sich damals (1982) ne Menge äußerst cleverer Gedanken gemacht, 
um Steuerungen effektiv zu programmieren.


Peter

von Daniel Blum (Gast)


Lesenswert?

@Peter

KEIL µVision3

ARM7 STR7

#20: identifier "bit" is undefined

Naja, wenn er bit nicht kennt, dann gibt er natürlich diese 
Fehlermeldung aus.
Ich dachte es wäre relativ simpel sowas zu deklarieren, wie beim 
CodeVision AVR Compiler, da gibt es das "bit" halt auch!


von let (Gast)


Lesenswert?

@Peter
Die neueren AVRs können so etwas auch mit den GPIORs.
Genau das tut der CodeVision mit Bitvariablen.

 - Michael

von crazy horse (Gast)


Lesenswert?

tja, bei Einzelbitverarbeitung ist der 8051 schon ne Klasse für sich. 
Wie sieht das eigentlich bei den moderneren Derivaten aus, die nicht 
mehr mit clk/12 arbeiten? Profitieren die Einzelbitbefehle genauso wie 
der Rest?
Und wie sieht es beim AVR mit den GPIORx aus? Gibts irgendwo eine 
Übersicht, welche Typen diese I/O-Bitregister haben (können direkt mit 
SBI,CBI,SBIS,SBIC benutzt werden)? Bis jetzt sind sie mir nur beim 
Tiny2313 bewusst untergekommen. Die vereinfachen das Einzelbit-handling 
schon eneorm.

von Sonic (Gast)


Lesenswert?

Probiers doch mal mit:
const char VARIABLE = 1;
wäre dann bit 0 und
const char VARIABLE = 8;
wäre bit 7.
Vorausgesetzt du programmierst in C.

von Sonic (Gast)


Lesenswert?


von let (Gast)


Lesenswert?

@crazy horse

Von der CV Homepage:
Support for placing bit variables in the General Purpose I/O Registers 
(GPIOR) available in the new chips (ATtiny2313, ATmega48/88/168, 
ATmega165/169/325/3250/329/3290/645/6450/649/6490, 
ATmega1280/1281/2560/2561/640, ATmega406)


 - Michael

von Peter D. (peda)


Lesenswert?

crazy horse wrote:
> tja, bei Einzelbitverarbeitung ist der 8051 schon ne Klasse für sich.
> Wie sieht das eigentlich bei den moderneren Derivaten aus, die nicht
> mehr mit clk/12 arbeiten? Profitieren die Einzelbitbefehle genauso wie
> der Rest?


Natürlich, warum sollte es da anders sein ?

Allerdings könne die auch nicht hexen, d.h. die Befehle laufen parallel 
ab (Ausführung eines Befehls + holen des nächsten Befehls).

Das ergibt dann auch diesen lustigen Effekt, wenn man einen Portpin 
setzt und direkt danach testet, daß er noch den alten Zustand hat.


Peter

von Uwe (Gast)


Lesenswert?

Hi!
GPIOR ist die neue Form und wenn vorhanden nehme ich die auch. Meistens 
ist ein uC aber nicht zu 100% ausgelastet und man hat irgendwo ein 
Register was eigentlich nicht benötigt wird und auch keine Aktionen 
erzeugt. UBRRL wenn ohne UART,EEAR/EEDR wenn kein EE 
verwendet,OCR1AL......
sind zb. solche. Da verstecke ich meistens meine "Programmbits". Das ist 
zwar nicht unbedingt ein sauberer Stiel, aber recht hilfreich.
Wenn man die Sache auch noch vernünftig deklariert bleibt es auch 
lesbar.

MFG Uwe

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.