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
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
Tip: sowas sollte man programmieren. Wenn man das nicht kann sollte man sich informieren. Selbstständig!
Nachtrag: ich hab mir bei meiner Antwort genausoviel Mühe gegeben, wie du um die Lösung herauszufinden
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
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.
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
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 |
Du willst aber nicht im Ernst mit dem Kenntnisstand im CANBUS Deines Autos umherfunken?? Gast
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?
@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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.