Forum: Mikrocontroller und Digitale Elektronik char in integer


von Andreas M. (chillymu)


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

von Rolf Magnus (Gast)


Lesenswert?

> hat einer eine Idee wie ich ein unsigned char in ein integer umwandeln
> kann.
1
unsigned char c;
2
int i;
3
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?

von localhost (Gast)


Lesenswert?

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

von Andreas M. (chillymu)


Lesenswert?

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

von Karl H. (kbuchegg)


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.

von Random .. (thorstendb) Benutzerseite


Lesenswert?

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

von Andreas M. (chillymu)


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:
1
int test,b;
2
unsigned char ucResult;
3
unsigned char a = 0b00010001;
4
char tMSG_Buffer[20];
5
6
for (b = 0; b < 8; b++)
7
{
8
  ucResult <<= 1;  /* shift in data byte */
9
10
  if (PIND & (1 << PIND1)){
11
    ucResult = 1;
12
    Qttemp[i] = '1';
13
  }
14
  else{
15
    ucResult = 0;
16
    Qttemp[i] = '0';
17
  }
18
  i++;
19
}
20
21
test = ucResult;
22
sprintf(tMSG_Buffer, "\n\r%d\n\r",test);
23
at128_sys_func_uart_write_string(tMSG_Buffer);
24
25
test = a;
26
sprintf(tMSG_Buffer, "\n\r%d\n\r",test);
27
at128_sys_func_uart_write_string(tMSG_Buffer);
28
29
sprintf(tMSG_Buffer, "\n\r");
30
at128_sys_func_uart_write_string(tMSG_Buffer);
31
32
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?

von Peter (Gast)


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

von Stefan E. (sternst)


Lesenswert?

Was du eigentlich haben möchtest:
1
  if (PIND & (1 << PIND1)){
2
    ucResult |= 1;
3
    Qttemp[i] = '1';
4
  }
5
  else{
6
    Qttemp[i] = '0';
7
  }

von Andreas M. (chillymu)


Lesenswert?

Du hast ja recht. Mein Fehler.

Richtig muss es ja heißen:
1
for (b = 0; b < 8; b++)
2
{
3
  ucResult <<= 1;  /* shift in data byte */
4
5
  if (PIND & (1 << PIND1)){
6
    ucResult |= 1;
7
    Qttemp[i] = '1';
8
  }
9
  else{
10
    ucResult |= 0;
11
    Qttemp[i] = '0';
12
  }
13
  i++;
14
}

Dann gibt der auch 17 aus.

Danke euch für den Denkanstoß.

von Vlad T. (vlad_tepesch)


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)

von Andreas M. (chillymu)


Lesenswert?

was willst du uns damit sagen?

von Vlad T. (vlad_tepesch)


Lesenswert?

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

von Andreas M. (chillymu)


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?

von Karl H. (kbuchegg)


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

von Jean P. (fubu1000)


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ß

von Andreas M. (chillymu)


Lesenswert?

Das ergibt aber 7 und 64 eigentlich müsste da doch 7 und 7 herauskommen.

von Karl H. (kbuchegg)


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.

von Vlad T. (vlad_tepesch)


Lesenswert?

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

von Jean P. (fubu1000)


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ß

von Karl H. (kbuchegg)


Lesenswert?

Mea culpa.
Ich hab was falsch gemacht.

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

von Peter D. (peda)


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

von Andreas M. (chillymu)


Lesenswert?

Also jungs, dass von Jean Player funktioniert super. Danke euch.

von Vlad T. (vlad_tepesch)


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)

von Andreas M. (chillymu)


Lesenswert?

wollte ich nicht. aber danke für die hilfe

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.