www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ASCII - BCD Wandler


Autor: Manfred Nagel (Gast)
Datum:

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

Autor: Christof Krüger (Gast)
Datum:

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

Autor: dave (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ASCII = BCD + 48

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


dave

Autor: Rufus T. Firefly (Gast)
Datum:

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

Autor: dave (Gast)
Datum:

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

dave

Autor: Manfred Nagel (Gast)
Datum:

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

Autor: dave (Gast)
Datum:

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

Autor: Rufus T. Firefly (Gast)
Datum:

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

Autor: Zotteljedi (Gast)
Datum:

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

Autor: Zotteljedi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hoppla, natürlich meine ich:

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

Autor: dave (Gast)
Datum:

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

dave

Autor: Zotteljedi (Gast)
Datum:

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

Autor: Markus_8051 (Gast)
Datum:

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

Autor: Zotteljedi (Gast)
Datum:

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

Autor: dave (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

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.