Forum: Mikrocontroller und Digitale Elektronik kmh in hex nach einzelne ascii wandeln


von Oli (Gast)


Lesenswert?

Hallo,

ich möchte eine Zahl kmh die in Hex vorliegt in ascii´s aufsplitten. ich 
kann meinem Display nur ascii senden. Nun möchte ich die hex Zahl in 
Einer, Zehner und Hunderter ausplitten und in jeweils ein ascii 
unwandeln um es dann zum Display zu schicken. Ich benutze ACR GCC. Hat 
jemand einen Tip wie man sowas lösen könnte?
Gruss
Oli

von Oli (Gast)


Lesenswert?

noch ein Nachtrag: mein Display zeigt nur die jewilligen Stellen in 
ascii an. Soll heissen: 0x30 ist eine 0 , 0x31 ist eine 1 u.s.w.! Das 
heißt, dass wenn ein 0x39 erreicht ist ein übertrag auf die Zehner ascii 
Stelle kommen muss.
oli

von Tippgeber (Gast)


Lesenswert?

Tip: sowas sollte man programmieren. Wenn man das nicht kann sollte man 
sich informieren. Selbstständig!

von Tippgeber (Gast)


Lesenswert?

Nachtrag: ich hab mir bei meiner Antwort genausoviel Mühe gegeben, wie 
du um die Lösung herauszufinden

von g457 (Gast)


Lesenswert?

Komfortable (speicherhungrige) Version: sprintf(x, "kuckst Du Doku für 
Details");

quick'n'dirty-Version (weniger speicherhungrig) in Pseudocode:
1
lcd_write('0' +((input     ) /100));
2
lcd_write('0' +((input %100) /10 ));
3
lcd_write('0' +((input %10 )     ));

quick'n'dirtyVersion mit wenig Speicher in Pseudocode:
1
lcd_write("0x");
2
x = (input >>  8) & 0x0F;
3
lcd_write((x < 10) ? ('0' +x) : ('A' +x -10));
4
x = (input >>  4) & 0x0F;
5
lcd_write((x < 10) ? ('0' +x) : ('A' +x -10));
6
x = (input      ) & 0x0F;
7
lcd_write((x < 10) ? ('0' +x) : ('A' +x -10));

HTH

von Hc Z. (mizch)


Lesenswert?

Die Schwierigkeit ist ja, dass schon das Problem nicht richtig 
beschrieben wurde.  Und eine Lösung fällt selten besser aus als die 
Erfassung des Problems.

Du wirst den Wert kaum „hex“ vorliegen haben, sondern läßt ihn Dir 
vermutlich z.Zt. bloß hex anzeigen, z.B. im Debugger.  Er wird binär 
vorliegen (oder in BCD, z.B. von einem Messinstrument, aber da mir das 
unwahrscheinlich scheint, lasse ich das außen vor), z.B. als 16- oder 
8-Bit-Variable.

Also hättest Du nun das Quell-Zahlenformat zu klären und dann nach einer 
Umwandlungsfunktion zu suchen, die Dir das ins Zielformat wandelt.  Das 
Zielformat hast Du auch nur recht krude beschrieben; es wird wohl ein 
C-String sein.

Wenn das geklärt ist, wirst Du vermultlich bei utoa() oder einer anderen 
Funktion der itoa()-Familie landen oder (wenn Programm-Speicherplatz 
keine Rolle spielt) bei sprintf.

von oli (Gast)


Lesenswert?

Danke schon mal für die Antworten. Also es ist ein Opel TID. Dem kann 
ich per Can , Ascii senden. Jede  Stelle auf dem Display ist ein 
Zeichen(ascii).
Die  Kmh sind in einer Can Nachricht und werden als Hex verschlüsselt. 
Ich lese diese Hex aus und will sie dem Dispaly in einer Can Nachricht 
schicken. Wie ich eine Hex in ein int wandele, könnte ich noch 
hinbekommen. Nur wie splite ich die Hex so, dass z.b. bei hex 0x32, was 
ja 50 Kmh ist, die 5 als ascii 0x35 und die 0 als 0x30 habe?
Ich hoffe es war verständlicher?
Oli

von gtf (Gast)


Lesenswert?

In ASM geht’s so:
Von C hab ich kein Plan :-)
1
BIN_2_ASCII_DEC:
2
    Push  temp1
3
    ldi    temp1, -1 + '0'  
4
B2AD_1:  
5
    inc    temp1          //
6
    subi  temp0, 100        //
7
    brcc  B2AD_1          //
8
    st    X+, temp1        //
9
    ldi    temp1, 10 + '0'      //
10
B2AD_2:  
11
    dec    temp1
12
    subi  temp0, -10
13
    brcs  B2AD_2
14
    subi  temp0, -'0'
15
    st    X+, temp1
16
    st    X+, temp0
17
    Pop    temp1
18
  ret

von vuyfv (Gast)


Lesenswert?

Du willst aber nicht im Ernst mit dem Kenntnisstand im CANBUS Deines 
Autos umherfunken??

Gast

von Albrecht H. (alieninside)


Lesenswert?

oli schrieb:
>...
> Ich hoffe es war verständlicher?

Nein eigentlich nicht! Und Leute, die dir evt. helfen wollen, wissen 
jetzt nicht so richtig, ob sie dir nun die Antwort auf deine Frage geben 
sollen, (was dir vermutlich nicht helfen wird, da die Frage 
möglicherweise auf Grund falscher Annahmen deinerseits, unpräzise 
gestellt ist), oder ob sie dir eine Antwort auf eine von dir nicht 
gestellte Frage geben sollen, die dir aber möglicherweise weiterhelfen 
würde.


> Danke schon mal für die Antworten. Also es ist ein Opel TID. Dem kann
> ich per Can , Ascii senden. Jede  Stelle auf dem Display ist ein
> Zeichen(ascii).
> Die  Kmh sind in einer Can Nachricht und werden als Hex verschlüsselt.

Ist das wirklich so? Kommen da wirklich 4 Bytes in ASCII: "0", "x", "3", 
"5" an? Oder sind es gar nur zwei Bytes in ASCII: "3", "5"? Und falls 
ja, gibt es ein Trennzeichen?

Oder glaubst du nur, dass da eine Hex-Zahl in ASCII-Verschlüsselung 
ankommt, weil es dir irgend ein Programm so anzeigt und tatsächlich sind 
das aber nur einzelne Bytes, die man sowohl als Binär-, Oktal-, Dezimal- 
oder Hexadezimal-Zahl interpretieren kann?

> Ich lese diese Hex aus

Wie, mit was, in was für eine Variable?

> und will sie dem Dispaly in einer Can Nachricht
> schicken. Wie ich eine Hex in ein int wandele, könnte ich noch
> hinbekommen.

Wie würdest du das machen?

> Nur wie splite ich die Hex so, dass z.b. bei hex 0x32, was
> ja 50 Kmh ist, die 5 als ascii 0x35 und die 0 als 0x30 habe?

Wenn du die "Hex-Zahl", bereits in eine Integer-Zahl umgewandelt hast, 
dann stellt sich doch die Frage gar nicht mehr, wie du eine "Hex-Zahl" 
splitten kannst, denn dann hast du ja gar keine "Hex-Zahl" mehr sondern 
ein Integer-Zahl und die Frage würde lauten: Wie splitte ich eine 
Integer-Zahl in ihre dezimalen Bestandteile auf. Also z.B. wie finde ich 
heraus, dass in der Zahl "12" einmal die "1" und einmal die "2" drin 
ist?

von oli (Gast)


Lesenswert?

@Albrecht
genau die Frage stelle ich mir ja! wie kann ich die Hex oder Integer bei 
z.b. 55 in "5" und "5" zerlegen? Also quasi in einer,zehner und 
Hunderter.
Die Kmh werden ursprünglich nicht auf dem Display angezeigt. Nur ich 
will sie mir da anzeigen lassen. Das Display verlangt aber pro Stelle 
ein ascii.
Ich sende dieses ascii als z.b. 0x65 als A. Es geht also darum die 55 in 
einer und zehner hunderter zu zerlegen und als jeweils ascii zu haben.
oli

von Karl H. (kbuchegg)


Lesenswert?

oli schrieb:
> @Albrecht
> genau die Frage stelle ich mir ja! wie kann ich die Hex oder Integer bei
> z.b. 55 in "5" und "5" zerlegen? Also quasi in einer,zehner und
> Hunderter.

Na so schwer ist das nicht.
Du hast das in der Grundschule schon gelernt.

Eine Mutter hat 37 Äpfel und 10 Kinder.
Wieviele Äpfel kriegt jedes Kind, wenn alle gleich viele kriegen?
   Genau 3
Wieviele Äpfel bleiben der Mutter?
   Genau 7


Hmm.  37 .... 3 und 7,  37 ..... 3 und 7
Ob es da einen Zusammenhang gibt? Ob das wohl so ist, weil
37 = 3*10 + 7 ist?


    int i = 37

    int j = i / 10;     // j ist 3
    int k = i % 10;     // k ist 7


http://www.mikrocontroller.net/articles/FAQ#Wie_kann_ich_Zahlen_auf_LCD.2FUART_ausgeben.3F

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.