Forum: Mikrocontroller und Digitale Elektronik Bitweise Byte auslesen?


von Klaus2 (Gast)


Lesenswert?

Hallo zusammen,

aus einem C Forum habe ich folgendes abgekupfert und, ja, ohne es genau 
zu kapieren.

Ich habe ein 5 Byte Array aus dem ich gerne bitweise die Bitwerte in 
"result" zurückgeben möchte.

  if( (myByte >> i) & 1 ) {

    result = 1;

    }

myByte enthält jeweils das Byte, welches auch korrekt ausgelesen wird 
(LED geht an "if(myByte)". Nur die Bitwerte kriege ich da noch nicht 
raus-geshiftet...

Danke, Klaus.

von H.Joachim S. (crazyhorse)


Lesenswert?

Das Schnipsel ist ein bisschen dünne...
Was ist mit i?
Ein array sehe ich nicht.
Vielleicht fehlt nur der else-Zweig?

von Detlef K. (adenin)


Lesenswert?

1
 if( (myByte >> i) & 1 ) {
2
3
    result = 1;
4
5
    }


Yo, Mann.
Also der Teil des Codes sieht ja gut aus. ^^

... und wo ist der Rest?

von Klaus2 (Gast)


Lesenswert?

Diese Bitroutine...
1
int read_eeprom_bitwise(void) {
2
3
  unsigned char result=0, characters=0, bit1=0, bit2=0;
4
5
  characters=sizeof(pgmSignatureArray_01);  //Anz. der Datenwerte im array ermitteln
6
  
7
  if(i<=characters) {
8
        
9
    myByte = pgm_read_byte(&pgmSignatureArray_01[i]);  //Daten aus array an Adr. "i" kopieren
10
11
    }
12
13
14
  //if(myByte) PORTB ^= (1 << LED_G);
15
16
  
17
  bit1 = (myByte >> k);
18
  bit2 &= 0b00000001;
19
  
20
  if( 1 ) {
21
22
    result = 1;
23
24
    }
25
26
  k++;
27
28
  if(k==8) {i++; k=0;}
29
30
  if(i==characters) {i=0;}
31
32
  return 0;
33
34
  }



Wird hier in der main aufgerufen...
1
if(mode==1 && flag_1==1){    // LED_RHP gibt Bitmuster aus
2
3
  read_eeprom_bitwise();
4
  if(result) {PORTB ^= (1 << LED_RHP);}
5
  flag_1=0;
6
7
  }

i + k werden sauber hochegzählt, aber result scheint nur einfach nicht 
global verfügbar - bööps.

Klaus.

von Klaus2 (Gast)


Lesenswert?

...ach, f*ck, result war doppelt deklariert.

So, nunh noch das rätsel, wieso bit2 nicht enthält, was es soll (if (1) 
ist nun if(bit2)).

Klaus.

von HildeK (Gast)


Lesenswert?

Naja, Werte werden in C nicht über die Parameterliste zurückgegeben, nur 
Zeiger.
Ich hätte genommen:
1
.
2
.
3
  return result;
4
.
5
.
und
1
.
2
.
3
result = read_eeprom_bitwise();
4
.
5
.

von Klaus2 (Gast)


Lesenswert?

...sooo, noch ein Fewhlerchen behoben.

bit1 = (myByte >> k);
bit2 = bit1 & 0b00000001;

Den Funktionsaufruf hab ich so übernommen, stimmt. "return 0" ist nicht 
schön.

Klaus.

von Klaus2 (Gast)


Lesenswert?

Scheiße, es geht :)
1
  myByte = (myByte >> k);
2
  myByte &= 0b00000001;
3
  
4
  if( myByte ) {
5
6
    result = 1;
7
8
    }
9
10
  else result = 0;

Das war der letzte Hirnfurz...

Danke, Klaus.

von Samuel C. (dragonsam)


Lesenswert?

Mach doch einfach
1
result = (myByte >> k) & 0x01;

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.