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 ?
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 .
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
@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
@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.
...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...
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
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 ?
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.
ich glaube wir "rden" aneinander vorbei. bin etwas neben der kappe gerade...
@dicky: Sieht aber auch sehr interessant aus. Kann ich bestimmt nochmal gebrauchen.
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.
@ Carsten schau dir die beiden unteren Funktionen in der Datei an. Das müßte es eigentlich sein. Bernhard
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.
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
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
@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. ...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.