www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 1 Bit Variabel deklarieren


Autor: Daniel Blum (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Daniel Blum (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 !

Autor: Tobi O. (der_ossi)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Daniel Blum (Gast)
Datum:

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

Autor: Henrik J. (henrikj)
Datum:

Bewertung
0 lesenswert
nicht 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?!

Autor: Daniel Blum (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...?

Autor: tex (Gast)
Datum:

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

Autor: GISMO (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: pumpkin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tobi O. (der_ossi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@gismo: ist doch genau das was ich gesagt habe ;)

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Daniel Blum (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!


Autor: let (Gast)
Datum:

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

 - Michael

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sonic (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sonic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: let (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Uwe (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.