Forum: Compiler & IDEs 3x16bit in array speichern


von Andreas (Gast)


Lesenswert?

Hallo,

Ich habe folgendes problem:
1
uint16_t irdata[3];

Dieses array soll nun mit bits gefüllt werden.
LSB ist irdata[0], bitnummer 0
MSB ist irdata[2], bitnummer 16

In einer ISR rauschen nun die bits der reihe nach rein und sollen in
das array gespeichert werden.
1
uint8_t arr_num = (uint8_t)(bit_cnt/16);
2
uint8_t bit_num = (uint8_t)(bit_cnt%16);
3
      
4
if (x>5 && x<7) { // lo-bit
5
  irdata[arr_num] &= ~(1<<bit_num);
6
} else 
7
if (x>0xc) { // hi-bit oder stop-bit
8
  irdata[arr_num] |= (1<<bit_num);
9
} 
10
      
11
bit_cnt++;

Ist dieser weg so richtig ? Denn leider kommen dabei nicht die werte 
herraus, die ich erwarte.

MfG
Andy

von Karl H. (kbuchegg)


Lesenswert?

1
if (x>5 && x<7) { // lo-bit
2
  irdata[arr_num] &= ~(1<<bit_num);
3
} else 
4
if (x>0xc) { // hi-bit oder stop-bit
5
  irdata[arr_num] |= (1<<bit_num);
6
}

und was tust du wenn x weder 6 noch größer 12 ist?


Ich frag mich, ob es nicht einfacher (und auch schneller) wäre, diese 3 
Arraymember ganz einfach wie ein grosses Schieberegister zu benutzen
1
   irdata[2] <<= 1;
2
   if( irdata[1] & 0x8000 )
3
     irdata[2] |= 0x0001;
4
5
   irdata[1] <<= 1;
6
   if( irdata[0] & 0x8000 )
7
     irdata[1] |= 0x0001;
8
9
   irdata[0] <<= 1;
10
   if( x > 0x0C )
11
     irdata[1] |= 0x0001;

von Andreas (Gast)


Lesenswert?

hallo
1
(x>5 && x<7)
> und was tust du wenn x weder 6 noch größer 12 ist?

Ei, das ist natürlich quatsch und nur durch rumprobieren enstanden.
Also x ist tatsächlich entweder exakt 6 oder >0x0C .

Also das mit dem verschieben über mehrere arrays hinaus ist mir nicht
in den sinn gekommen. Das werde ich mal ausprobieren.

Dein beispiel funktioniert leider nicht, aber evtl. kann ich das auch
selbst lösen... mal schauen.

Vielen dank nochmal

von Karl H. (kbuchegg)


Lesenswert?

Andreas schrieb:

> Dein beispiel funktioniert leider nicht,

Ich habs ohne zu testen direkt im Forum geschrieben. Der Schnipsel ist 
also noch nicht mal durch den Compiler gelaufen.

Auf Anhieb seh ich jetzt nichts, wos haken könnte. (*)(**) Aber das 
Prinzip müsste stimmen.

(*) Ausser dem natürlich

   if( x > 0x0C )
     irdata[1] |= 0x0001;


Ich bin davon ausgegangen, dass x irgendein ADC Wert oder sowas 
ähnliches sein wird. Wenn x bei dir nur entweder 6 oder 12 sein kann, 
dann natürlich


   if( x == 0x0C )
     irdata[0] |= 0x0001;


(**) Beim nacheditieren gesehen:
Abhängig von x muss natürlich das unterste Bit in irdata[0] gesetzt 
werden und nicht das unterste in irdata[1]. Ist ein Copy&Paste Fehler

von Andreas (Gast)


Lesenswert?

irdata[0] statt 1, genau das wars. Funktioniert nun bestens ;)

vielen dank nochmal

MfG
Andy

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.