Forum: Mikrocontroller und Digitale Elektronik ASCII - BCD Wandler


von Manfred Nagel (Gast)


Lesenswert?

Ich besitze einen Messwertaufnehmer mit einer seriellen Schnittstelle
(GND-RXD-TXD) über die ein aktueller Messwert mittels vier ASCII
Zeichen, gefolgt von einem Carriage Return ausgegeben wird. Ich bin auf
der Suche nach einer Applikation, mit der ich diese Zeichenfolge als
Zahlenwert auf einer 4-stelligen LED-7-Segmentanzeige darstellen kann.
Es besteht kein mathematischer Zusammenhang zwischen Zeichenfolge und
gefordertem Anzeigewert, d.h. jeder einzelnen Zeichenfolge müsste in
einem Speicher ein bestimmter Zahlenwert (LED-Anzeigewert) zugeordnet
werden.
Diese "Wertetabelle" muss nach Ausschalten der Betriebsspannung
erhalten bleiben muss.
Hat jemand eine Idee ??? (bin leider noch Mikrocontroller-Neuling)

von Christof Krüger (Gast)


Lesenswert?

Ich verstehe leider noch nicht ganz, was du willst:

Sind die ASCII-Zeichen schon die Zahlen die 1:1 ausgegeben werden
sollen?
Oder sind das nur irgendwelche Eingaben, denen dann genau eine Ausgabe
zugeordnet werden kann?

Klingt generell nicht schwer, mit einem AVR leicht schaffbar. Welchen
du da nimmst, hängt ganz davon ab, was du für Anzeigen hast und wieviel
Platz du hast um z.b. noch externe Bauteile anzuschliessen etc.

von dave (Gast)


Lesenswert?

ASCII = BCD + 48

Ich hoffe, dass das jetzt nicht zu trivial ist:
Bytes Empfangen, 48 von jedem abziehen.


dave

von Rufus T. Firefly (Gast)


Lesenswert?

> ASCII = BCD + 48

Naja, Dave, das ist eine inkorrekte Vereinfachung.

Nehmen wir mal die BCD-Zahl 0x1234 (zwei Bytes), so ist die erwartete
ASCII-Repräsentation davon 0x31 0x32 0x33 0x34 (halt '1', '2',
'3' und '4').

Ein Byte einer BCD-Zahl enthält also zwei Stellen der Dezimalzahl.

von dave (Gast)


Lesenswert?

Aber BCD = Binary Coded Digit = Ne Ziffer in Binär, oder falsch?

dave

von Manfred Nagel (Gast)


Lesenswert?

Die ASCII - Zeichen stehen in keinem Zusammenhang mit den anzuzeigenden
Zahlen der LED-Anzeige. Es muss also jeder
einzelnen ASCII-Zahlenfolge am Eingang (also z.B. 1013) ein einzelner
LED - Zahlenwert als Ausgang (z.B. 9875 )  -im Speicher hinterlegt in
einer Art Wertetabelle- zugeordnet werden.

Die LED - Anzeigen sind ganz normale 13mm hohe 7-Segmentanzeigen mit
2,5 Volt und 10 mA/Segment     (von Conrad o.ä.)

Die Größe der Schaltung spielt keine Rolle.

von dave (Gast)


Lesenswert?

Wir waren grad bei ner andren Diskussion ;)

Mit was programmierst du denn, Manfred?

Und "Wertetabelle erhalten bleiben" damit meinst du nicht die Daten,
die empfangen wurden, hoff ich.
Wertetabelle sind ja 10 bytes, die dann die entsprechenden Segmente
beinhaltet.

Ich würds so machen (Assembler):
 Byte empfangen
 48 abziehen (können wir uns noch streiten)
 Z-Pointer auf die Wertetabelle setzten
 Empfangener Wert zu Z addieren
 mit LPM entsprechenden Wert rauslesen
 und ausgeben

wertetabelle:
.db 0b01111111, 0b00000011   ; wert für 0 + 1
.db ...
.db ..


dave

von Rufus T. Firefly (Gast)


Lesenswert?

@Dave: BCD steht für "binary coded decimal" und beschreibt die
Unterbringung von zweistellinge Dezimalzahlen in einem Byte -
darstellbar sind so Zahlen von 0 bis 99.

von Zotteljedi (Gast)


Lesenswert?

@dave:

Ja, aber eine Ziffer in vier Bit, nicht in einem Byte (acht Bit). Du
mußt also, um in C zu sprechen, um von ASCII zu BCD zu kommen

u_char value[] = "15";
u_char bcd;

bcd = value[0] - '0' << 4;
bcd |= value[1] - '0';

rechnen.

@all:

Das mit der 7-Segment-Anzeige habe ich erst kürzlich für einen Tiny12
programmiert, das sieht z.B. so aus:

bcd_to_7seg:
  ldi ZH, high(table << 1)  ; Tabelle in den
  ldi ZL, low(table << 1)    ; Z-Pointer laden
  add ZL, WORK      ; Offset addieren
  lpm          ; r0 <- table[WORK]
  mov WORK, r0      ; WORK <- r0
  ret

table:
.db   0b00111111, 0b00000110, 0b01011011, 0b01001111
.db  0b01100110, 0b01101101, 0b01111101, 0b00100111
.db  0b01111111, 0b01101111, 0b01110111, 0b01111100
.db  0b00111001, 0b01011110, 0b01111001, 0b01110001

wobei man noch darauf achten muß, daß die Tabelle nicht über eine
Speichergrenze rutscht, andernfalls muß man nach dem add auf Überlauf
etc. testen, und den ZH anpassen. Ziffer als Binärwert (also nach dem -
'0') wird in WORK reingegeben, Ergebnis kommt in WORK zurück.

von Zotteljedi (Gast)


Lesenswert?

Hoppla, natürlich meine ich:

bcd = (value[0] - '0') << 4;

von dave (Gast)


Lesenswert?

Rufus, du meinst PACKED BCD..
http://www.danbbs.dk/~erikoest/bcd.htm
^^hier steht auch was drüber

dave

von Zotteljedi (Gast)


Lesenswert?

Ahhhh, Du hast natürlich recht! Es kostet aber auch immer ein wenig
Überwindung 3,3 Bit in 8 Bit zu kodieren. :-)

von Markus_8051 (Gast)


Lesenswert?

Ich finde es faszinierend, wie hier auf einem so dünnen Fundament, das
Manfred gelegt hat, schon Lösungsvorschläge und gar Programme entstehen
können. Hat Mani schon geschrieben, welchen µC er verwenden will. Aus
seinem ersten Posting ging noch nicht einmal hervor, daß es sich bei
den ASCII-Daten nur um Ziffern handelt. Da wäre die Tabelle sehr groß
geworden. Aber auch jetzt wird sie ja wohl an dioe 20kBytes groß werden
(ohne packed BCD).

Gibt es da wirklich keine weitere Möglichkeit der Reduzierung? Hallo
Manfred, was sind das für Werte? Ich kann mir kaum vorstellen, daß es
da überhaupt keinen mathematischen zusammenhang gibt. Wo soll denn dann
die benötigte Tabelle herkommen? Könnte man zur Reuzierung irgendwelche
Wert/Ziffernkombinationen ausschließen? Oder führen manche
Ursprungsdaten zum gleichen Anzeigewert?

Gruß,
Markus_8051

von Zotteljedi (Gast)


Lesenswert?

> Ich finde es faszinierend, wie hier auf einem so dünnen Fundament,
> das Manfred gelegt hat, schon Lösungsvorschläge und gar Programme
> entstehen können.

Ich würde es nicht Fundament, sondern Auslöser nennen. Es sind ja
möglicherweise gar keine Lösungvorschläge und Programme zu seinem
Problem, sondern hier ist eine Diskussion entstanden, was in Foren
nicht unüblich ist. Da es auch keine komfortable Möglichkeit gibt einen
Diskussion-Thread abzuspalten (bzw. überhaupt erstmal Threads zu haben)
wird das nun leider chaotisch, und bald denkt niemand mehr über Manfred
nach... That's life, oder so ähnlich.


> Ich kann mir kaum vorstellen, daß es da überhaupt keinen
> mathematischen zusammenhang gibt.

Den fehlenden mathematischen Zusammenhang habe ich zwischen 'Ziffer'
und 'Darstellung der Ziffer als 7-Segment-Code' interpretiert, und da
ist eine Map das einzig sinnvolle. Wenn man eine bijektive Abbildung als
mathematischen Zusammenhang durchgehen lässt, dann gibt's natürlich
einen, aber ihm ging es wohl um einen Weg es zu berechnen, und das sind
lange und hässliche boolsche Terme.

von dave (Gast)


Lesenswert?

Also ich hab das jetzt so verstanden:

Er hat nen Gerät (Messgerät wahrscheints), das ihm immer 4
ASCII-Zeichen schickt, höchst wahrscheinlich Zahlen. Diese will er auf
7-Segment-Anzeigen darstellen und dazu müssen die ASCII in 7-Segment
umgewandelt werden und ausgegeben werden.
So als Quelle: "Es muss also jeder
einzelnen ASCII-Zahlenfolge am Eingang (also z.B. 1013)" + "Die LED -
Anzeigen sind ganz normale 13mm hohe 7-Segmentanzeigen mit
2,5 Volt und 10 mA/Segment"

Unsere Diskussion ging NUR ums Thema, und es gibt ja auch schon
Lösungssvorschläge.

Aber um diese zu konkretisieren bedarf es wohl noch einem aufklärendem
Post von Manfred ;)

Schöne Weihnachten

dave

von Peter D. (peda)


Lesenswert?

"Die ASCII - Zeichen stehen in keinem Zusammenhang mit den
anzuzeigenden Zahlen der LED-Anzeige. Es muss also jeder einzelnen
ASCII-Zahlenfolge am Eingang (also z.B. 1013)"


Das klingt extrem merkwürdig.
Wenn sich einer schon die Mühe macht ASCII-Zahlen auszugeben, dann
besteht in der Regel ein mathematischer Zusammenhang und es ist dann
wesentlich einfacher diesen zu programmieren, als umständlich eine
Tabelle mit 10000 Einträgen einzutippen.


Wenn die ASCII-Zeichen schon auf Ziffern beschränkt sind, dann einfach
die Ziffern in einen Binärwert 0..9999 umwandeln und diesen als Offset
auf die Kodetabelle nehmen.
Die Tabelle enthält dann die gewünschten Ausgabewerte (16 Bit), die man
dann in einzelne Ziffern und diese wiederum in 7-Segment wandelt.

Aber wie gesagt, dann viel Vergnügen beim Schreiben der 10000
Tabelleneinträge und nicht vertippen !


Peter

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.