Forum: Mikrocontroller und Digitale Elektronik ASCII in Hex und zurück


von Carsten (Gast)


Lesenswert?

Hallo Forum...
ich bin's schon wieder :-)
Ich bekomme über die UART einen Text und möchte diesen gerne im EEPROM
abspeichern.
Jetzt geht ldi Temp,"A" natürlich nicht.
Wie kann ich ein ASCII-Zeichen in Hex verwandeln und nachher wieder
zurück ?

von R. Marx (Gast)


Lesenswert?

Hallo Carsten,

so ganz habe ich dein Problem nicht verstanden.
Speicher doch einfach das empfangene Zeichen wie es ist. Es ist ja
ein Byte als eine Hexzahl .

von dicky (Gast)


Lesenswert?

für die zeichen 0..F hast du 4 bits. die ascii tabelle ist eine 7 bzw 8
bit angelegenheit. um also alle zeichen von 0..255 (wenn du mit 8 bit
arbeitest) hexadezimal darstellen willst, musst du pro "ascii"
zeichen 2 zeichen in der hexadezimalen darstellung senden.

einmal durch 16 teilen > dann kommen die obersten 4 bits raus
wenn der wert < 10, dann 48 aufaddieren, sonst 55 aufaddieren

dann zu untersten 4 bits, da kannst du einfach die 4 obersten bits auf
0 setzen mit logisch "AND", also and 0x0F.
wenn diese zahl < 10, dann 48 aufaddieren sonst 55 aufaddieren.

beispiel:

0 = 00
1 = 01
10 = 0A
16 = 10

von Carsten (Gast)


Lesenswert?

@R.Marx:
Nene, ich bekomme ein ASCII-Zeichen (Bsp.AXY...) und dieses soll ins
EEPROM.
Das kann ich aber doch nicht einfach so als A da rein pumpen.?

@dicky:
Ich versuche das mal zu verstehen. Ich melde mich wieder. Danke

von Carsten (Gast)


Lesenswert?

@dicky:
...warte mal...
wie Teile ich denn A durch 16 ?
Ich habs zwar noch nicht versucht aber ich könnte mir vorstellen das es
son roten Punkt im AVR Studio gibt.

von Carsten (Gast)


Lesenswert?

...ich bin ja so blöd.
Klar kommen die Zeichen als Hex an. Ist ja erst das Display, bzw. der
Terminal, der ein ASCII draus macht.
Vergesst bitte schnell dieses Posting...

von dicky (Gast)


Lesenswert?

ja ist anfangs etwas komplex.
du musst die hexdezimale schreibweise gut draufhaben, wenn du damit
arbeiten willst.

dez hex
0 0
1 1
2 2
. .
. .
9 9
10 A
11 B
12 C
13 D
14 E
15 F

mehr geht nicht. wenn du dich auf ascii zeichen (hier 8 bit)
beschränkst, musst du 2 zeichen a´ 4 bit (0..F) übertragen, das erste
ist das höherwertige, das 2. das niederwertige. das heisst die
reihenfolge ist wichtig und darf nicht durcheinanderkommen, daher
werden strings ins hex-schreibweise gerne von steuerzeichen eingerahmt
oder haben eine bestimmte länge wie motorolas-s-records oder andere
formate.

dekodieren:
erstes zeichen = höchstwertiges nibble.
wenn > dez 67 (zahl 9), dann 65 abziehen und mit 16 malnehmen, sonst 48
abziehen und mit 16 malnehmen

zweites zeichen:
wie vor, aber nicht mit 16 malnehmen.

beide werte addieren, fertig.



das erste hex-zeichen

von dicky (Gast)


Lesenswert?

sorry. meinte wenn > 57 NICHT > 67, hatte mich vertippt.

von R. Marx (Gast)


Lesenswert?

Vielleicht mache ich mich ja gerade lächerlich aber:

Du bekommst z.B. "A" über das UART, dann hast du doch einen Hex -
Wert bei "A" 0x41 im Empfangsregister stehen, oder ?

von Carsten (Gast)


Lesenswert?

Wie oben bereits geschrieben...
...peinlich grins

von dicky (Gast)


Lesenswert?

darf nicht wahrsein, schon wieder falsch.

also besser so:
wenn < 58, dann 48 abziehen und beim ersten zeichen mit 16 malnehmen,
sonst 55 abziehen und beim ersten zeichen mit 16 malnehmen.

von dicky (Gast)


Lesenswert?

ich glaube wir "rden" aneinander vorbei. bin etwas neben der kappe
gerade...

von Carsten (Gast)


Lesenswert?

@dicky:
Sieht aber auch sehr interessant aus.
Kann ich bestimmt nochmal gebrauchen.

von Carsten (Gast)


Lesenswert?

...passt schon...
Ich hatte Ladehämmungen.

von dicky (Gast)


Lesenswert?

ausserdem telefoniert gerade meine frau mit voip stundenlang (kost ja
nix), und das hat auf dem router vorrang, da wir ein sehr langesames
dsl haben dauert das jetzt hier alles eine ewiiiiiigkeit. bin nachher
nochmal da. ciao.

von Koopi (Gast)


Angehängte Dateien:

Lesenswert?

@ Carsten

schau dir die beiden unteren Funktionen in der Datei an. Das müßte es
eigentlich sein.

Bernhard

von Carsten (Gast)


Lesenswert?

Das könnte es sein. Danke für die Mühen aber C kann ich so ohne weiteres
nicht lesen.
Mit meinen VB-Kenntnissen muss ich da erst das Wörterbuch zu Rate
ziehen.
Würde mich mal in Assembler interessieren.
Eigentlich hat sich mein Problem ja auch in soweit gelöst, dass ich ja
nur empfangene Daten ins EEPROM schreiben will und nachher wieder
auslesen und per UART versenden will.
Da es sich im MC immer um Hex-Daten handelt, brauche ich ja auch nichts
zu konvertieren.
Da hab ich mich wieder mal von meinem Display blenden lassen. Der MC
empfängt schliesslich keine ASCII-Daten.
Aber dieser Threat zeigt zumindest, dass es offensichtlich
Anwendungsfälle gibt.

von daniel (Gast)


Lesenswert?

hallo an allen,


ich habe folgendes problem:

Hex-Daten in ASCII-Daten konvertieren und dan über den UART schicken,
nur ohne Konvertierung kommt nur "scheisse" an.Und das ganze muss
leider alles unter Assembler laufen.

hat jemand eine Idee.


danke im voraus

von thkais (Gast)


Lesenswert?

Umwandlung einer Hex-Zahl in eine 2-Stellige ASCII-Zahl:

Die Hex-Zahl wird in r16 erwartet, die Subroutine "data" wird dann
zweimal mit einem Ascii-Zeichen in r16 aufgerufen. Ist ein Schnipsel
aus einer Subroutine für einen Hex-Dump über die serielle
Schnittstelle. Wichtig! Die Subroutine "data" muß mit "ret"
abgeschlossen sein.

send_hex:
  push r16            ;für zweiten Durchgang sichern
  swap r16            ;Zuerst High-Nibble ausgeben
  rcall send_nibble   ;umrechnen und ausgeben
  pop r16             ;gesicherte Daten zurückholen
send_nibble:
  andi r16,$0F        ;nur untere 4 Bit verwenden
  cpi r16,$0A         ;Zahl >= 10?
  brcs send_nibble1   ;falls nein, dann Sprung
  subi r16,$F9        ;Addiert $07
send_nibble1:
  add r16,$D0         ;Addiert $30
  rjmp data           ;Ausgabe eines ASCII-Zeichens in R16

von thkais (Gast)


Lesenswert?

Hmpf: Fehler, das "add r16,$D0" muß natürlich "subi r16,$D0" heißen.

von Hannes L. (hannes)


Lesenswert?

@Carsten:

Mir ist immer noch nicht klar, was du für ein Problem hast, ich denke,
es ist nur ein "Knoten im Kopf".

- Du empfängst mittels UART Bytes.
- Diese sind vermutlich ASCII-Zeichen (aber immer noch Bytes).
- Diese sollen ins EEPROM geschaufelt werden.

Dann tu es doch, gib das Byte an eedr aus und gib die Impulse zum
Schreiben.

Du schreibst, ldi r16,"A" geht nicht... Stimmt, du musst nämlich
schreiben: ldi r16,'A'. Dann geht es auch. Aber in den .db-Direktiven
bleibt es bei "text". Mag etwas doof sein, ist aber so.

Solltest du aber wirklich eine Konvertierung von/nach HEX suchen, so
melde dich nochmal.

Übrigens:
Ein Byte ist erstmal ein Byte.
Dass es von der Programmieroberfläche HEX angezeigt wird, ändert daran
nichts.
Kein Computer braucht HEX.
Bytes werden nur HEX angezeigt, damit wir Menschen sie besser auswerten
können.

...

von daniel (Gast)


Lesenswert?

Danke ,

es hat geklappt!Super!

von Hannes L. (hannes)


Lesenswert?

Vielleicht hätte ich mal aufs Datum schaun sollen... (Wer lesen kann ist
klar im Vorteil...)

...

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.