mikrocontroller.net

Forum: Compiler & IDEs Bitstrom in dezimal umwandeln


Autor: Dominik Friedrichs (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich hab hier derzeit einen uint8_t Array mit 44 Elementen, und jedes
enhält eine 1 oder 0 (nicht so günstig gelöst, ich weiß) Nun würde ich
z.B. gerne die Elemente 1-4, also 4bit in eine Dezimalzahl (0-15)
umwandeln, und das möglichst RAM-schonend, da ich schon ca. 85% voll
hab...
Es sind insgesamt 11 x 4bit die jeweils einzeln in dezimal gebraucht
werden, und die ich am Ende gern in einem 11-Element Array hätte, am
besten als String, da ich sie über die USART schicken muss.

Ich hab bereits eine Funktion für Binär->Dezimal, aber die Übergabe per
Array ist schlecht, da ich 44 bytes reservieren muss, nur um 44 bits
abzulegen. Habt ihr da eine Idee, wie man das eleganter lösen könnte?
In einer if-Abfrage werden die 44 Bits nacheinander erkannt (1 oder 0)
und dann in den Array geschrieben - vielleicht könnte man sie schon ab
dem Punkt anders handhaben?

Das ganze ist dazu da, um den Datenstrom von diesen 433MHz
Funkthermometer/Hygrometer-Sendern die z.B. bei Conrad erhältlich sind,
zu dekodieren und an einen PC weiterzuleiten. Ich weiß, ich könnte auch
einfach die 1'en und 0'en über die USART schicken und den PC den Rest
machen lassen (dort wird sich ein Perl-Script über die Daten hermachen),
aber ich hätte das schon gerne fertig dekodiert vom Controller
(ATtiny2313).

Gruß
Dominik

Autor: MSE (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du brauchst der Funktion ja nicht eine vollständige Kopie der Struktur
zu übergeben. Es reicht, wenn Du der Funktion einen Zeiger auf Dein
Array übergibst.

struct uhu{
// was auch immer;
};


void machStrAusUhu( uhu* in, char* out )
{
 // Umwandeln
}


int main()
{
uhu otto;
char str[12];
machStrAusUhu(&otto, str);
// ...
}


Gruß, Michael

Autor: Unbekannter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hoffe man kann es lesen...

Alternative wäre evtl. auch ein Bit-Feld, da könnte man aber je nach
Prozessor/Compiler in der Länge eingeschränkt sein.

Sinn das ganzen sollte aus dem Source klar werden. Viel Spaß damit!



#include <stdio.h>

#include <assert.h>
#include <stdint.h>


#define MAX_BITS 44



typedef struct
{
  uint8_t packed[ (MAX_BITS+7) / 8 ];
} bits_t;


inline static uint8_t bit_mask(uint8_t bit_index)
{
  return 1 << ( bit_index & 0x07 );
}


inline static uint8_t * packed_bits_address(bits_t * bits, uint8_t
bit_index)
{
  return &( bits->packed[bit_index >> 3] );
}


void store_bit(bits_t * bits, uint8_t bit_index, uint8_t bit_value)
{
  assert(bits);
  assert(bit_index < MAX_BITS);
  if (bit_value)
    *packed_bits_address(bits, bit_index) |= bit_mask(bit_index);
  else
    *packed_bits_address(bits, bit_index) &= ~bit_mask(bit_index);
}


uint8_t fetch_bit(bits_t * bits, uint8_t bit_index)
{
  assert(bits);
  assert(bit_index < MAX_BITS);
  if ( *packed_bits_address(bits, bit_index) & bit_mask(bit_index) )
    return 1;
  else
    return 0;
}


unsigned char bits2dec(bits_t * bits, uint8_t bit_index)
{
  uint8_t dec;

  dec  = fetch_bit(bits, bit_index) << 3;
  dec += fetch_bit(bits, bit_index + 1) << 2;
  dec += fetch_bit(bits, bit_index + 2) << 1;
  dec += fetch_bit(bits, bit_index + 3);

  return '0' + dec;
}


int main()
{
  bits_t b;

  store_bit(&b, 0, 0);
  store_bit(&b, 1, 1);
  store_bit(&b, 2, 0);
  store_bit(&b, 3, 0);
  store_bit(&b, 4, 1);
  store_bit(&b, 5, 0);
  store_bit(&b, 6, 1);

  printf("Bits[0:3] = %c\n", bits2dec(&b, 0) );
  printf("Bits[1:4] = %c\n", bits2dec(&b, 1) );
  printf("Bits[2:5] = %c\n", bits2dec(&b, 2) );
  printf("Bits[3:6] = %c\n", bits2dec(&b, 3) );

  return 0;
}

Autor: Dominik Friedrichs (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm, wenn der Ram über 80% gefüllt ist, ist es dann normal das der
Controller nicht mehr ganz normal funktioniert? Die Rückgabewerte der
itoa-Funktion tanzen völlig aus der Reihe, immer genau dann wenn der
Ram über ca. 80% (100bytes) belegt ist.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Hmm, wenn der Ram über 80% gefüllt ist, ist es dann normal das der
> Controller nicht mehr ganz normal funktioniert?

Nein.

Ja.

Du darfst nicht ganz vergessen, dass du außer der statischen
RAM-Belegung noch Platz für den Stack brauchst.

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.