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)
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.
ASCII = BCD + 48 Ich hoffe, dass das jetzt nicht zu trivial ist: Bytes Empfangen, 48 von jedem abziehen. dave
> 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.
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.
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
@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.
@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.
Rufus, du meinst PACKED BCD.. http://www.danbbs.dk/~erikoest/bcd.htm ^^hier steht auch was drüber dave
Ahhhh, Du hast natürlich recht! Es kostet aber auch immer ein wenig Überwindung 3,3 Bit in 8 Bit zu kodieren. :-)
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
> 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.
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
"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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.