3x16bit in array speichern

Gast #1255511
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
#1255534
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;
Gast #1255600
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
#1255661
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.