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!!!!
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.
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
Vielleicht meinst Du sowas: http://www.mikrocontroller.net/forum/read-1-148105.html http://www.mikrocontroller.net/forum/read-1-287648.html http://www.mikrocontroller.net/forum/read-1-249223.html
@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.
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.
@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....
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
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; }
ä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...?
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
// 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));
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.
Geht auch. Du änderst halt "byte". Wenn das egal ist. Und bit[x] geht nicht, es muss bit[i] sein ;-)
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
@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
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.