mikrocontroller.net

Forum: Compiler & IDEs 3x16bit in array speichern


Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich habe folgendes problem:
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.
uint8_t arr_num = (uint8_t)(bit_cnt/16);
uint8_t bit_num = (uint8_t)(bit_cnt%16);
      
if (x>5 && x<7) { // lo-bit
  irdata[arr_num] &= ~(1<<bit_num);
} else 
if (x>0xc) { // hi-bit oder stop-bit
  irdata[arr_num] |= (1<<bit_num);
} 
      
bit_cnt++;

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

MfG
Andy

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

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
   irdata[2] <<= 1;
   if( irdata[1] & 0x8000 )
     irdata[2] |= 0x0001;

   irdata[1] <<= 1;
   if( irdata[0] & 0x8000 )
     irdata[1] |= 0x0001;

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

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo
(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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas (Gast)
Datum:

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

vielen dank nochmal

MfG
Andy

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.