www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Byte in Bit's zerlegen in C


Autor: Sascha Dürkes (plutoonline)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich stehe ma wieder voll auf dem schlauch, kann mir jemand einen
denkanstoß geben wie ich ein Byte in Bits zerlegen kann.
Oder gibt es da in C vielleicht sogar eine fertig routine?

Danke schonmal!!!!

Autor: Alban (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hilft das ein wenig:

http://www.mikrocontroller.net/articles/Bit_manipulation

Wenn nicht, schreib doch mal was du genau willst. Willst du wissen ob
ein Bit gesetzt ist oder must du Bits umsortieren.

Autor: Marcus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn du es entweder als byte oder als einzelne bits ansprechen willst,
mach es mit einer union:

struct bit_def {
        char    b0:1;
        char    b1:1;
        char    b2:1;
        char    b3:1;
        char    b4:1;
        char    b5:1;
        char    b6:1;
        char    b7:1;
};
union byte_def{
    struct bit_def bit;
    char    byte;
};

habe ich nur schnell aus meiner register.inc gezogen, am besten
googelst du noch mal nach union und structure...

mfg

Autor: Profi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Sascha Dürkes (plutoonline)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@All
Also nochmal etwas genauer, ich habe ein Byte und möchte die 8
einzelbits in eine Struktur bringen so das ich auf jedes Einzelbit
dirket zugreifen kann. Ich habe mir so etwas wie ein Array vorgestellt,
wo alle Bits von 0-7 abliegen z.B. BIT[0..7].


@Marcus
Das sieht echt gut aus, ich weiss nur nicht ob das so für mich
anwendbar ist. Das mit dem char verwirrt mich ein wenig.
Ich habe das Byte nämlich als INT vorliegen.

Autor: Marcus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
char    bX:1; gibt dir an, das du das X'te bit (deswegen die 1 danach)
innerhalb eines char wertes einzeln ansprichst.


hier ein beispiel für 16bit, ebenfalls aus der sfr.h meines
controllers:

union{
    struct{
        char    ide15:1;           /* for Slot15 */
        char    ide14:1;           /* for Slot14 */
        char    ide13:1;           /* for Slot13 */
        char    ide12:1;           /* for Slot12 */
        char    ide11:1;           /* for Slot11 */
        char    ide10:1;           /* for Slot10 */
        char    ide9:1;            /* for Slot9 */
        char    ide8:1;            /* for Slot8 */
        char    ide7:1;            /* for Slot7 */
        char    ide6:1;            /* for Slot6 */
        char    ide5:1;            /* for Slot5 */
        char    ide4:1;            /* for Slot4 */
        char    ide3:1;            /* for Slot3 */
        char    ide2:1;            /* for Slot2 */
        char    ide1:1;            /* for Slot1 */
        char    ide0:1;            /* for Slot0 */
    }b;
    struct{
        char    low;                /* Low  8 bit */
        char    high;               /* High 8 bit */
    }byte;
    unsigned short  word;
}c0idr_addr, c1idr_addr;


hier siehst du auch noch die unterteilung in das high und das low byte
eines integer wertes...
du kannst also das wort, das high oder low byte oder jedes bit einzeln
ansprechen.

Autor: Sascha Dürkes (plutoonline)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Marcus

Sorry das ich so Dumm frage, aber ich bin C-Neuling und ich hab noch
nicht so den rechten Durchblick....

Wie kann ich dann den Wert der Bit's z.B. in einer Schleife auslesen.
Und wie kann ich das Byte zuweisen?


Fragen über Fragen....

Autor: Marcus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bei den beiden obigen variablen c0idr_addr und c1idr_addr ginge es
folgendermaßen:


bit zugriff:

c0idr_addr.b.idrX = 1...0;  (X von 0...15, je nachdem welches bit du
haben willst)


byte zugriff:

c0idr_addr.byte.X = 0x00...0xFF; (X low oder high)


word zugriff:

c0idr_addr.word = 0x0000...0xFFFF;



mfg, Marcus

Autor: Sascha Dürkes (plutoonline)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab mich vielleicht ein bischen unglücklich ausgedrückt, aber so
wird das ja nicht funktionieren, oder doch?

for(int i=0;i>=7;i++)
  {
   c0idr_addr.b.idri = 1;
  }

Autor: Marcus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ähm... nein... wenn dann würde es so gehen

...
   c0idr_addr.b.idr[i] = 1;
...

zumindest würde es bei einem array so gehen, aber bei einer variablen
gehts so glaube auch nicht.
befürchte das musst du alles per hand erledigen...

...hab grad noch mal nachgehört... ist wohl compiler-sache, obs klappt
oder nicht... was der dann da für einen code draus macht steht wieder
auf einem anderen blatt...

vllt. weiss jemand anderes ja genaueres...?

Autor: Kon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

also wenn du grundsätzlich wissen willst, wie man aus einem Byte-Wert
erfährt welche Bits gesetzt sind, dann solltest du die mal Umrechnung
von Dezimal nach Binär ansehen z.B. hier:
http://www.ulthryvasse.de/db1.html#ch212

Aber vielleicht beschreibst du etwas ausführlicher das "Problem" und
bekommst evtl. einen Lösungsansatz für dein Problem.

Beste Grüße Kon

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
// wenn das die Variablen sind
unsigned char mein_byte;
unsigned char mein_bit[8];
unsigned char i;

// könnte man die Aufgabe so lösen
for(i=0; i<8; i++)
    mein_bit[i] = (mein_byte & (1<<i));

Autor: Sascha Dürkes (plutoonline)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab mir jetzt mit eueren Anregungen folgendens ausgedacht,
könnte das so funktionieren.

for(uint8_t i = 0; i <= 7; i++)
      {
  if (byte%2== 0)
  {bit[x]=0;}
  else
  {bit[x]=1;}
  byte >>= 1;
      }

als Ergebnis soll das Byte in dem Array bit[0..7] stehen.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Geht auch. Du änderst halt "byte". Wenn das egal ist. Und bit[x] geht
nicht, es muss bit[i] sein ;-)

Autor: D.v.L. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich weiß ja nicht, was Du mit den einzelnen Bits anfangen willst.
Denkbar wäre folgende Abfrage:

// Bit 0 ist gesetzt
if (byte_xyz & 0x01) {
}

// Bit 0 ist nicht gesetzt
if ((byte_xyz & 0x01) == 0) {
}

Als Abfragewerte mußt Du 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40 und
0x80 einsetzen und schon sind alle 8 Bits abgefragt. Funktioniert auch
mit 16-Bit-Werten.

Dirk

Autor: TheMason (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@sascha :

ich würde es so machen :

bit prüfen :

  ((wert >> bitnummer) & 1)  // ergibt 0 oder 1

bit setzen :

  wert = wert | (1 << bitnummer)

bit löschen

  wert = wert & ~ (1 << bitnummer)

dann brauchst du keine struct/union und kannst den code überall laufen
lassen. deine bitnummer läuft dann von 0 - 7 (bei einem byte) und von 0
- 16 bei einem integer wert
hoffe ich konnte dir etwas helfen

gruß
rene

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.