Forum: Mikrocontroller und Digitale Elektronik Display mit 160 Segmenten refreshen. Wie? Struct?


von Deet (Gast)


Lesenswert?

Hallo zusammen!

Ich habe hier ein Display, welches 160 Segmente besitzt. Auf dem LCD 
sind Zahlen und Symbole, welche wiederum aus ihren einzelnen Segmenten 
bestehen.

Um das komplette Display zu aktualisieren, muss man also 160 Bit 
hinschicken und dann reinlatchen.

Aber wie macht man das am besten? Also quasi eine Variable mit 160Bit...

Mit einem Struct, welches man als Pointer einfach Bit für Bit 
abarbeitet? Ich habe momentan noch ein kleines Versätndnisproblem, wie 
es mit den Zahlen ist, also wenn ich beispeilsweise eine einzelne Zahl 
anzeigen will.

Quasi so:


Zahl 8 :              X  X  X  X  X  X  X
Segment:  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 ...

Wie kann ich denn jetzt am sinnvolsten genau disen Bereich in meinen 
160Bit manipulieren?


Hat da jemand schonmal was ähnliches gehabt?

von Volker S. (volkerschulz)


Lesenswert?

Mit einem Byte-Array? Ein paar zusaetzliche Informationen bezueglich 
Plattform und verwendeter Sprache waeren vielleicht sinnvoll... ;)

Volker

von Thomas T. (knibbel)


Lesenswert?

Hallo,

es gibt (wie eigentlich überall) mehrere Möglichkeiten:

A) Die Aufbereitung der Daten (Ziffern & Symbole) erfolgt im 
Hauptprogramm. Dann musst deine Routine (im Unterprogramm) nur noch die 
160 Bits aus dem Speicher lesen (sorry, bin Assemblerprogrammierer) und 
zum Display übertragen. Dies hätte den Vorteil, dass die Daten schnell 
zum Display geschickt werden können und die Übertragungsroutine z.B. per 
Timerinterrupt aufgerufen werden könnte.

Ich denke aber folgende Methode ist für dich geeigneter:

B) Du legst dir einen Speicherbereich (ein Array) an, wobei jedes 
Element für eine komplette Ziffer steht (oder für 8 Symbole). Wenn du 
dann das Display updaten willst, dann kostet das etwas Rechenleistung, 
weil du für jedes Bit, welches du überträgst, nachsiehst, ob das 
entsprechende Segment an oder aus ist.

Beispiel:
Zahl 8 :              X  X  X  X  X  X  X
Segment:  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 ...

Du willst das Bit für das Segment 5 senden, also schaust du nach, ob in 
dem Speicher für diese Ziffer das entsprechende Bit für das Segment an 
oder aus ist. Und dann sendest du entsprechend eine 1 oder 0.

Hoffe das hilft fürs Erste...

Gruß,
Thomas

von Deet (Gast)


Lesenswert?

Sprache ist C in IAR und es handelt sich um einen ML2002-IC.

Byte-Array OK, aber eine Ziffer geht halt auch mal über ein Byte hinaus, 
daher die Frage, wie ich das realisieren könnte?

von Nachtaktiver (Gast)


Lesenswert?

Einige Randbedinungen musst du schon festlegen.

Deine Segmente unterteilst du in struct Arrays und legst dir einen 
passenden Schriftsatz an.

Passend dazu schreibst du dir eine Funktion welche gezielt einen 
eingeteilten Segmentbereich mit einen beliebigen Zeichen beschreibt bzw.
die entsprechenden Teile deines struct Arrays beschreibt.

Gleichzeitig schreibst du dir eine Funktion welche das komplette
Display aktualisiert.


Aber:
Was ist das eigentlich für ein Display? Vorallen, wie habe ich mir
"160 Segmente" vorzustellen?

von Volker S. (volkerschulz)


Lesenswert?

Deet schrieb:
> Byte-Array OK, aber eine Ziffer geht halt auch mal über ein Byte hinaus,
> daher die Frage, wie ich das realisieren könnte?

In diesem Falle musst Du natuerlich die Bits in zwei Bytes manipulieren.
Zu manipulierendes Bit = X
Betrifft Byte Y = floor(X/8)
Betrifft Bit Z = X-(8*Y)

Es wird natuerlich jeweils bei 0 angefangen zu zaehlen. Und dann wird 
Bit Z in Byte Y durch eine bitweise Operation gesetzt oder nicht 
gesetzt.

Volker

von Deet (Gast)


Lesenswert?

Nachtaktiver schrieb:
> Was ist das eigentlich für ein Display? Vorallen, wie habe ich mir
> "160 Segmente" vorzustellen?

Das Display hat mehrere Zahlen und Zeichen. Jede Zahl teilt sich in 7 
Segmente auf und die alphnumerischen haben halt entsprechend mehr. 
Insgesamt sind es 160 Segmente.

von Nachtaktiver (Gast)


Lesenswert?

Ah... click

Dann habe ich ein wenig Mist von mir gegeben. Hatte an ein Klassischen
Graphisches LCD gedacht.

von Deet (Gast)


Lesenswert?

Nachtaktiver schrieb:
> Dann habe ich ein wenig Mist von mir gegeben. Hatte an ein Klassischen
> Graphisches LCD gedacht.

Nee leider nicht :-( Und das Problem ist halt, dass es nicht eine Ziffer 
pro Byte ist, sondern die fortlaufend durchgehen von Segment 1 bis 160.

Danke schonmal für eure Rückmeldungen, das muss ich mir jetzt mal zu 
Gemüte führen.

von Peter D. (peda)


Lesenswert?

- leg ein Array von 20 Byte (= 160 Bit) an.
- erstelle eine Funktion, die das Array ans LCD ausgibt
- erstelle eine Funktion, die ein Segment in diesem Array setzt oder 
löscht

Diese Funktion rufst Du dann entsprechend der Ziffer für jedes Segment 
auf.
Dazu ist ein weiteres Array (im Flash) nötig, welches das Segmentmuster 
pro Ziffer oder Zeichen enthält.

Oftmals sind die Segmente eines Digits in gleicher Order, dann kannst Du 
mit dem Digit-Offset auswählen, an welche Stelle die Ziffer kommt.


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.