www.mikrocontroller.net

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


Autor: Carsten (Gast)
Datum:

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

Autor: R. Marx (Gast)
Datum:

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

Autor: dicky (Gast)
Datum:

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

Autor: Carsten (Gast)
Datum:

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

Autor: Carsten (Gast)
Datum:

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

Autor: Carsten (Gast)
Datum:

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

Autor: dicky (Gast)
Datum:

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

Autor: dicky (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sorry. meinte wenn > 57 NICHT > 67, hatte mich vertippt.

Autor: R. Marx (Gast)
Datum:

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

Autor: Carsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie oben bereits geschrieben...
...peinlich grins

Autor: dicky (Gast)
Datum:

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

Autor: dicky (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich glaube wir "rden" aneinander vorbei. bin etwas neben der kappe
gerade...

Autor: Carsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@dicky:
Sieht aber auch sehr interessant aus.
Kann ich bestimmt nochmal gebrauchen.

Autor: Carsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...passt schon...
Ich hatte Ladehämmungen.

Autor: dicky (Gast)
Datum:

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

Autor: Koopi (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
@ Carsten

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

Bernhard

Autor: Carsten (Gast)
Datum:

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

Autor: daniel (Gast)
Datum:

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

Autor: thkais (Gast)
Datum:

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

Autor: thkais (Gast)
Datum:

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

Autor: Hannes Lux (hannes)
Datum:

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

...

Autor: daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke ,

es hat geklappt!Super!

Autor: Hannes Lux (hannes)
Datum:

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

...

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.