www.mikrocontroller.net

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


Autor: Oli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Oli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tippgeber (Gast)
Datum:

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

Autor: Tippgeber (Gast)
Datum:

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

Autor: g457 (Gast)
Datum:

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

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

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

HTH

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: oli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: gtf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In ASM geht’s so:
Von C hab ich kein Plan :-)
BIN_2_ASCII_DEC:
    Push  temp1
    ldi    temp1, -1 + '0'  
B2AD_1:  
    inc    temp1          //
    subi  temp0, 100        //
    brcc  B2AD_1          //
    st    X+, temp1        //
    ldi    temp1, 10 + '0'      //
B2AD_2:  
    dec    temp1
    subi  temp0, -10
    brcs  B2AD_2
    subi  temp0, -'0'
    st    X+, temp1
    st    X+, temp0
    Pop    temp1
  ret

Autor: vuyfv (Gast)
Datum:

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

Gast

Autor: Albrecht H. (alieninside)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: oli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

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

Bewertung
0 lesenswert
nicht 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_ka...

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.