www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik char in integer


Autor: Andreas Müller (chillymu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

hat einer eine Idee wie ich ein unsigned char in ein integer umwandeln 
kann.

Ich möchte folgendes tun:
In einem unsigned char ist folgendes Bitmuster enthalten 00010001.

Wie kann ich das am besten in ein integer umwandeln welches 11 enthält.

Hab schon einwenig rumprobiert und versucht im Forum eine Lösung zu 
finden, aber kein Ergebniss bis jetzt. Vielleicht habt ihr eine Idee.

Gruß Andreas

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> hat einer eine Idee wie ich ein unsigned char in ein integer umwandeln
> kann.
unsigned char c;
int i;
i = c;

> Ich möchte folgendes tun:
> In einem unsigned char ist folgendes Bitmuster enthalten 00010001.
>
> Wie kann ich das am besten in ein integer umwandeln welches 11 enthält.

Warum sollte das denn 11 enthalten?

Autor: localhost (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie kommst Du vom Bitmuster 00010001 auf 11? Das verstehe ich nicht. Bei 
mir gibt das 17?

Autor: Andreas Müller (chillymu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habt recht ich meinte hex. 17 ist aber auch ok. ich versuch das mal, was 
rolf vorgeschlagen hat.

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

Bewertung
0 lesenswert
nicht lesenswert
Du kannst im übrigen dein c auch überall dort benutzen, wo du auch i 
benuztt. Auch wenn das 'char' heisst, ist es nichts anderes als ein 
'kleiner Integer', mit dem man genauso rechnen kann, wie mit jedem 
anderen int, unsigned int, long, etc. auch.

Autor: Random ... (thorstendb) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
[scherz]
In jedem Integer steckt ein kleiner char, der da raus will **LOL**
[/scherz]

Autor: Andreas Müller (chillymu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hall leute,

ich habe das Programm von Rolf ausprobiert und irgendetwas macht mir da 
einen Strich durch die Rechnung.

Mein Programm sieht folgendermaßen aus:
int test,b;
unsigned char ucResult;
unsigned char a = 0b00010001;
char tMSG_Buffer[20];

for (b = 0; b < 8; b++)
{
  ucResult <<= 1;  /* shift in data byte */

  if (PIND & (1 << PIND1)){
    ucResult = 1;
    Qttemp[i] = '1';
  }
  else{
    ucResult = 0;
    Qttemp[i] = '0';
  }
  i++;
}

test = ucResult;
sprintf(tMSG_Buffer, "\n\r%d\n\r",test);
at128_sys_func_uart_write_string(tMSG_Buffer);

test = a;
sprintf(tMSG_Buffer, "\n\r%d\n\r",test);
at128_sys_func_uart_write_string(tMSG_Buffer);

sprintf(tMSG_Buffer, "\n\r");
at128_sys_func_uart_write_string(tMSG_Buffer);

return 0;

Ergebnis:

1
17

Warum wird mir erst 1 und dann 17 ausgegeben? Bin eigentlich sicher das 
in ucResult das gleiche drin steht.
Wie kann ich mir das bitmuster von ucResult schnellstmöglich ausgeben 
lassen?

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Bin eigentlich sicher das
> in ucResult das gleiche drin steht.
Ich nicht.

for (b = 0; b < 8; b++)
{
  ucResult <<= 1;  /* shift in data byte */

  if (PIND & (1 << PIND1)){
    ucResult = 1;
    Qttemp[i] = '1';
  }
  else{
    ucResult = 0;
    Qttemp[i] = '0';
  }
  i++;
}

darasu folgt doch das in ucResult nur eine 0 oder eine 1 stehen kann

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was du eigentlich haben möchtest:
  if (PIND & (1 << PIND1)){
    ucResult |= 1;
    Qttemp[i] = '1';
  }
  else{
    Qttemp[i] = '0';
  }

Autor: Andreas Müller (chillymu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du hast ja recht. Mein Fehler.

Richtig muss es ja heißen:
for (b = 0; b < 8; b++)
{
  ucResult <<= 1;  /* shift in data byte */

  if (PIND & (1 << PIND1)){
    ucResult |= 1;
    Qttemp[i] = '1';
  }
  else{
    ucResult |= 0;
    Qttemp[i] = '0';
  }
  i++;
}

Dann gibt der auch 17 aus.

Danke euch für den Denkanstoß.

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
was macht ihr denn?

Wenn ich das richtig verstehe hat er zwei bcd zahlen in einem Byte

was spricht gegen

uint8 bcd = 0b00010001;

uint8 binaer = ((bcd>>8)*10) + (bcd&0xF)

Autor: Andreas Müller (chillymu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
was willst du uns damit sagen?

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ups, richtig wär:
uint8 binaer = ((bcd>>4)*10) + (bcd&0xF)

Autor: Andreas Müller (chillymu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mal noch ne neue Frage. Wo wir gerade beisammen sind.

Wenn ich dieses unsigned char in zwei teile teilen möchte wie machich 
das am besten.

Beispiel:

unsigned char a = 0b01110111;
unsigned char b, c;

teilen in b = 00000111 und c = 00000111

Habt ihr da eine Idee?

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

Bewertung
0 lesenswert
nicht lesenswert
Andreas Müller schrieb:
> Mal noch ne neue Frage. Wo wir gerade beisammen sind.
>
> Wenn ich dieses unsigned char in zwei teile teilen möchte wie machich
> das am besten.
>
> Beispiel:
>
> unsigned char a = 0b01110111;
> unsigned char b, c;
>
> teilen in b = 00000111 und c = 00000111
>
> Habt ihr da eine Idee?

b = ( a >> 4 ) & 0xFF;   // die obere Hälfte
c = a & 0xFF;            // die untere Hälfte

Autor: Jean Player (fubu1000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
ziemlich schlechtes Beispiel was du da gewählt hast(in beiden steht ne 
7).
Aber ich nehme mal an b soll Low Nipple enthalten und c High Nipple.

b = a & 0x0F;
c = a >> 4;

gruß

Autor: Andreas Müller (chillymu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ergibt aber 7 und 64 eigentlich müsste da doch 7 und 7 herauskommen.

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

Bewertung
0 lesenswert
nicht lesenswert
Andreas Müller schrieb:
> Das ergibt aber 7 und 64 eigentlich müsste da doch 7 und 7 herauskommen.

Code herzeigen.
Du hast was falsch gemacht.

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
der Karl heinz hat ein F zu viel im 2 &.
das erste & kann ganz wegelassen werden

Autor: Jean Player (fubu1000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas Müller schrieb:
> Das ergibt aber 7 und 64 eigentlich müsste da doch 7 und 7 herauskommen.

Der Karl ist noch nit ganz wach (er hat sich sicher verschrieben mit 
0xFF meinte er 0x0F). Nimm mein Beispiel das klappt.

gruß

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

Bewertung
0 lesenswert
nicht lesenswert
Mea culpa.
Ich hab was falsch gemacht.

(Man sollte eben nicht gleichzeitig im Forum antworten un dnebenher auch 
noch seinen eigenen Code debuggen)

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erzähl dochmal, was das ganze überhaupt soll.


Intern rechnet die CPU immer binär.
Hinschreiben kann man in C Zahlen dezimal, oktal oder hexadezimal.

Ausgegeben werden Zahlen in ASCII (Text-LCD) oder 7-Segment.

Ein packed BCD braucht man daher nirgends und macht sich mit der 
Konvertiererei nur selber das Leben schwer.

Laß es einfach den C-Compiler so machen, wie es ihm am besten paßt.


Peter

Autor: Andreas Müller (chillymu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also jungs, dass von Jean Player funktioniert super. Danke euch.

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
da er das zeug von nem Port einließt, dachte ich, dass er zwei BCD 
ziffern reinbekommt und da einen Int dras machen will, deshalb auch mein 
Codevorschlag:
uint8 binaer = ((bcd>>4)*10) + (bcd&0xF)

Autor: Andreas Müller (chillymu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wollte ich nicht. aber danke für die hilfe

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.