Forum: Mikrocontroller und Digitale Elektronik Ascii Dec in einzlne Ziffern zerlegen


von Chris T. (chris0086)


Lesenswert?

Hallo Leute, zuerstmal wünsch ich euch frohe Weihnachten.

Da ich zwischen den Mahlzeiten ein wenig Zeit hab bin ich natürlich am 
programmieren.
Und nun hab ich eine Frage:
Also folgendes:
Ich habe einen Hexwert als Char vorliegen z.Bsp.44 Hex. Das sind Decimal 
68, da es sich um eine Temperatur handelt sind das 68°C. Diese 68° muss 
ich in zwei einzelne Chars zerlegen, also 6 und 8.
Wie bekomm ich das hin?
Habe schon wild rum geschiftet und -30 gerechnet aber der nimmt immer 
den Hexwert irgendwie und ich komm nicht auf das richtige Ergebnis.
Habt ihr da eine kleine Lösung parat?
atoi() hat auch nicht funktioniert.
Steh grad a bissl aufm Schlauch

von MWS (Gast)


Lesenswert?

Einmal durch 10 teilen, einmal Modulo 10.

von Peter (Gast)


Lesenswert?

char* s = "44";
unsigned char c = (s[0] - '0') * 16 + s[1] - '0'
printf("%d", c );

von Chris T. (chris0086)


Lesenswert?

Das Printf bringt mit nix
Das ganze läuft auf Atmega162 und die einzelnen Zeichen, also 6 und 8 
sollen dann per USART als 36 und 38 Hex versendet werden.

von Simon K. (simon) Benutzerseite


Lesenswert?

Vielleicht solltest du dir erst mal klar werden, was du überhaupt 
willst.
So Sätze wie "Der nimmt da immer den Hex-Wert" sind dermaßen sinnfrei.

Wer nimmt nen Hex-Wert? Und seit wann unterscheidet ein Mikrocontroller 
zwischen Zahlensystemen...

von Peter (Gast)


Lesenswert?

schön das du das jetzt auch schon sagst.
Aber mit Printf geht es auch.

char* s = "44";
char out[4] = {0};
unsigned char c = (s[0] - '0') * 16 + (s[1] - '0')
sprintf( out, "%d", c );

sende(out);

von Wayne M. (vibra)


Lesenswert?

in assembler gehts auch
1
; Bcd - zahlen in 2 ASCII char ---   wert in aa - ergebnis in r6 und r7  h/l Byte
2
;  
3
bcdasc:
4
    mov   temp,aa    ; aa aufheben
5
    lsr  temp
6
    lsr  temp
7
    lsr  temp
8
    lsr  temp    ;Msb ins Lsb schieben
9
    ori    temp,0x30  ;$30 dazuodern erzeugt ascii 30 -39 da nur zahl 0-9
10
    mov    r6,temp
11
    andi  aa,0x0f    ;löschen des Msb
12
    ori    aa,0x30
13
    mov    r7,aa
14
    ret

frohes Fest

von g457 (Gast)


Lesenswert?

Christian Hohmann schrieb:
> Ich habe einen Hexwert als Char vorliegen z.Bsp.44 Hex. Das sind Decimal
> 68, da es sich um eine Temperatur handelt sind das 68°C. Diese 68° muss
> ich in zwei einzelne Chars zerlegen, also 6 und 8.


..ich verstehe das so:
1
char cIn = 0x44;
2
char cHi = '0' +(cIn /10);
3
char cLo = '0' +(cIn %10);
4
5
tu_was_mit_zehnergrad_im_klartext(cHi);
6
tu_was_mit_einergrad_im_klartext(cLo);

..alternativ..
1
char cIn = 0x44;
2
char cHi = cIn /10;
3
char cLo = cIn %10;
4
5
tu_was_mit_zehnergrad_absolut(cHi);
6
tu_was_mit_einergrad_absolut(cLo);

(Ungetestet, teipos und co bitte entfernen)

HTH

von Chris T. (chris0086)


Lesenswert?

>char* s = "44";
>char out[4] = {0};
>unsigned char c = (s[0] - '0') * 16 + (s[1] - '0')
>sprintf( out, "%d", c );

>sende(out);

Wo hab ich denn da meine 6 und 8 stehen?
Entschuldigung für meine unglückliche Ausdrucksweise.
Hier mal der Code wo die 6 und 8 rein kommen sollen, hoffe das hilft 
weiter
1
Value= 0x44; //Wird eigentlich der Funktion übergeben
2
if(TempIndex == 29) //BoilerTemperatur
3
{
4
         Sendstring[13]=0x32; // 2 Teilnehmer
5
6
           Sendstring[15]=('6'); <--- hier soll die 6 rein
7
  Sendstring[16]=('8'; <-- hier soll die 8 rein
8
9
  for(j=0; j<=18 ;j++) //Status senden
10
  {
11
    USART2_Transmit(Sendstring[j]);
12
  }

Die Werte sollen also in dem Array gespeichert werden

von Tom M. (tomm) Benutzerseite


Lesenswert?

Christian Hohmann schrieb:
> Sendstring[15]=('6'); <--- hier soll die 6 rein
> Sendstring[16]=('8'; <-- hier soll die 8 rein

Irgendwie hast du nen Knoten... %-)

Noch ne Variante:
1
sprintf(Sendstring[15], "%02u", Value);

Der Format String (%02u) bedeutet: 2 Stellige Unsigned-Int Zahl, ggf. 
mit führenden Nullen auffüllen.

Die Version mit Division und Modulo ist wahrscheinlich effizienter.

von Chris T. (chris0086)


Lesenswert?

Wo steht nach dem sprintf denn der Wert 6 drin?
Die 6 muss in den Sendstring[15] also muss ich dem String ja die 6 
zuweisen
Steht also nach
1
sprintf(Sendstring[15], "%02u", Value);
in Sendstring[15] die 6 drin?

von Peter (Gast)


Lesenswert?

> >char* s = "44";
> >char out[4] = {0};
> >unsigned char c = (s[0] - '0') * 16 + (s[1] - '0')
> >sprintf( out, "%d", c );
> >sende(out);
>
> Wo hab ich denn da meine 6 und 8 stehen?

Du hast geschrieben:

> Ich habe einen Hexwert als Char vorliegen z.Bsp.44 Hex.

wo kommt da eine 6 vor? In out steht dann die 68 drin und das wolltest 
du ja.

von g457 (Gast)


Lesenswert?

Oben hab ich Dir die Lösung zwar schon mal geschrieben, jetzt servier 
ichs Dir mal in den Quellcode rein:

> Value= 0x44; //Wird eigentlich der Funktion übergeben
[..]
>    Sendstring[15]=('6'); <--- hier soll die 6 rein
>    Sendstring[16]=('8'; <-- hier soll die 8 rein

..wird damit zu..

     Sendstring[15]=('0' +(Value /10)); <--- hier ist die 6
     Sendstring[16]=('0' +(Value %10)); <--- hier ist die 8

Falls Du jemals Temperaturen über 100°C haben ★solltest★, dann musst Du 
das noch abfangen!

HTH und HF

von Peter (Gast)


Lesenswert?

@g457
leider wissen wir nicht ob die 44 als sting vorliegt.

von g457 (Gast)


Lesenswert?

Peter schrieb:
> @g457
> leider wissen wir nicht ob die 44 als sting vorliegt.

Doch, das wissen wir, dass sie das nicht tut:

Christian Hohmann schrieb:
> Value= 0x44; //Wird eigentlich der Funktion übergeben

HTH und ich hoffe, dass das die Unklarheiten jetzt beseitigt hat :-)

von Peter (Gast)


Lesenswert?

was aber diesem hier wiederspricht
> Ich habe einen Hexwert als Char vorliegen z.Bsp.44 Hex

von g457 (Gast)


Lesenswert?

Peter schrieb:
> was aber diesem hier wiederspricht
>> Ich habe einen Hexwert als Char vorliegen z.Bsp.44 Hex

Wieso? In Einklang mit obiger Zuweisung:

char Value = 0x44

Feddisch.

HTH :-)

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.