mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Binär umwandlung


Autor: alexander.c (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ich habe folgendes Problem !

Ich verwende eine PIC 18f4550 und programmiere in MPlab(C).

Also ich habe folgende werte :

x[0];
x[1];
x[2];
x[3];
usw bis x[15];

Nun will ich diese werte in eine binär Zahl umwandeln und diese über die 
serielle Schnittstelle verschicken um damit weiterarbeiten zu können .


Also hat jmd eine Idee wie ich bei der umwandlung vorgehen kann ???

für hilfe wäre ich sehr dankbar !!

mfg Alex

Autor: tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Meinst du sowas?
void usart_put_bin16(uint16_t c)
{
  int8_t i;
  char tmp[17];

  for(i = 15; i >= 0; --i) {
    tmp[15-i] = c&(1<<i) ? '1' : '0';
  }
  tmp[16] = '\0';
  
  usart_puts(tmp);
}

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Also ich habe folgende werte :
Und da drin steht (quasi als String) z.B. die Zahlenfolge 
"0101110010101001"?
Was ist das MSB, was das LSB?

> Nun will ich diese werte in eine binär Zahl umwandeln
Diese Zahl ist (wenn MSB links und LSB rechts) binär 0101110010101001 
und das ist dezimal 23721. Und du willst dann also 2, 3, 7, 2, 1 über 
die SIO verschicken?

Autor: Alexander.c (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also im prinzip sieht das so aus ...

x[0]=1; ... wobei hier 0 die laufvariable darstellen soll
x[1]=1;
x[2]=0;
x[3]=1;
usw

dann soll die zusammengefügte zahl 1101.... sein !

mfg alex

Autor: tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Senden:
int8_t i;
for(i = 0; i < 16; i++) {
    meine_sende_funktion_für_ein_zeichen(x[i] ? '1' : '0');
}
Zusammenführen:
int8_t i;
int16_t zahl;
for(i = 0; i < 16; i++) {
    zahl |= x[i];
    zahl <<= 1;
}

Hab ich dich jetzt richtig verstanden?

Autor: Alexander.c (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jop genau so sollte das funktionieren !!

Jedoch das senden wollte ich mit printf() realisiren ... aber das sollte 
nicht das problem darstellen ...

Aber vielen dank für die unterstützung!

mfg alex

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
tobi schrieb:
> Senden:
>
> int8_t i;
> for(i = 0; i < 16; i++) {
>     meine_sende_funktion_für_ein_zeichen(x[i] ? '1' : '0');
> }
> 
> Zusammenführen:
>
> int8_t i;
> int16_t zahl;
> for(i = 0; i < 16; i++) {
>     zahl |= x[i];
>     zahl <<= 1;
> }
> 

So wird aber nach dem letzten Bit nochmal geshiftet!

In dieser Variante wird dagegen zu Anfang einmal überflüssigerweise 
geschoben, dafür das letzte Bit nicht mehr:
int8_t i;
int16_t zahl = 0;
for(i = 0; i < 16; i++) {
    zahl <<= 1;
    zahl |= x[i];
}

> ...

Autor: tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
grml... sowas passiert wenn man nur fix nebenbei was runtertippt -_-

Autor: Alexander.c (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Noch ne frage ...

kann ich die selbe methode verwenden um auch größere zahlen 
zusammenzufügen ...zb 32 bit ?? klarerweiße muss i < 32 festgelegt 
werden ...

aber würde das prizipiell funktionieren ??

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

Bewertung
0 lesenswert
nicht lesenswert
Ja

Autor: Alexander.c (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
super danke .. habt mir sehr viel geholfen =)

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

Bewertung
0 lesenswert
nicht lesenswert
Hast du auch das Prinzip verstanden?

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.