Forum: Mikrocontroller und Digitale Elektronik EA DOG Grafik LCD Konzeptfrage


von Christoph S. (mcseven)


Lesenswert?

Hi,

ich hab ein kleines Problem: Das EA DOGM132 kann man über SPI ja nicht 
auslesen. Wie mache ich nun am geschicktesten die Diaplayverwaltung? Mir 
würden spontan diese Dinge einfallen (Page = 8Bit-Teil einer Spalte):

- Kein DisplayRAM, einfach jede Page schreiben (Nachteil bei Page-
  übergreifenden Operationen, deswegen eher nicht)
- DisplayRAM als Byte Array "usigned char vram[4][132]"
- DisplayRAM als 32bit Long Array "usigned long vram[132]"

Auch beim Beschreiben tu ich mir mit dem Konzept etwas schwer:
- Nach jeder Grafikoperation den geänderten Teil erneut schreiben
  (zusätzliche Rechenzeit zum Berechnen dieses Teils)
- Nach jeder Grafikoperation einfach den gesamten Bildschirm neu
  schreiben
- Feste Wiederholrate, in einem 10Hz (z.B.) Intervall das Display
  komplett neu schreiben, Timer wird vor einer Grafikoperation
  ausgeschaltet, und danach wieder eingeschaltet.

Es sollte auf Geschwindigkeit optimiert sein, Platz hab ich mit nem 
Mega64 (zur Not 2561) genug.

Danke

von Sumada (Gast)


Lesenswert?

Ciao Christoph

Ich habe bereits ein 64x128 Display von dieser Serie Angesteuert.
Ich habe auf dem Microcontroller ein Array erstellt, welches 8x128 8bit 
Integerzahlen speichert. Je nach uC könnte das Probleme geben, da die 
Kapazität nicht ausreicht. Item.
Ich habe bei jeder Displayänderung das Displayarray gelöscht und neu 
beschrieben. Danach via SPI an das Display übermittelt.
Ist zwar etwas unschön, da man nur den zu ändernden Teil umschreiben 
müsste, aber ich war unter Zeitdruck und wollte das so schnell und 
einfach wie möglich beenden. Das mit den 10Hz würde ich dir abraten, da 
mindestens eine frequenz von 25Hz benötigt wird, damit das menshcliche 
Auge kein Flackern erkennt.

Ich weiss nicht ob dir das geholfen hat. Ich aber hoffe es.

mfg

von Christoph S. (mcseven)


Lesenswert?

Hi,

danke für Deine Antwort... Wenn ich 132x4 bytes übertragen will, dann 
sind das 528 Bytes, bei 4MBit macht das theoretisch 950 
Aktualisiserungen / Sekunde :) das sollte also mit 25Hz gehen, ich hab 
dann nur mit Interruptjitter zu kämpfen, die MCU soll ja nebenher was 
anderes auch machen (soll ein wecker werden). Und vom RAM her ist in nem 
AtMega64 genug Platz, und den VRAM zu realisieren...

Wie hast Du das gelöst, wenn du zB einen Text ausgeben willst von y=4 
bis y=12 also über 2 Bytes/Pages? Denn wenn ich ein Array von 132 Longs 
(32bit) hätte, dann könnte ich "einfache" Shiftoperationen machen, sonst 
müßte ich das von Hand in C programmieren und das wird bestimmt nicht so 
schnell, wie die nativen Compilerfunktionen, oder?

Bye, Chris

von Sebastian B. (mircobolle)


Lesenswert?

Hallo,

ich weiß nicht ob dir diese Info was hilft.
Aber ich habe ein 2x16 DOG Display dieser Serie.

Mein Display-Treiber ist in C für einen MC9S08QE128 geschrieben (target 
eigentlich egal..)

In einem Teil meines Systems muss ich zur Anzeige eines Test-Sequenz 
Fortschritts, die aktuelle Schritt Nummer auf dem Display anzeigen.
Z.b: 1. Zeile "Pruefsequenz run" 2. Zeile" Step: 001 / 230"

Ich merke mir einfach die Start x Position meiner zu aktualisierden Zahl 
in diesem Fall der Bereich wo "001" steht und ueberschriebe diesen 
Bereich zyklisch, in dem ich den internen AdressCounter genau auf diese 
Display-Adresse setzt und dann die Zeichen inkrementell von dort aus 
ausgebe... ist der schnellste Weg...

die Schritte brauchen minimal eine Dauer von 10 ms(!) -- also 100 Hz, 
dies ist aber ein Problem für mein Display, da dies die Daten so schnell 
über SPI nicht verarbeiten kann (380 kHz SPI Baudrate - trotz 
Wartezeit).. deshalb gebe ich nicht jeden Zwischenschritt aus... ist für 
das Auge sowieso nicht sichtbar... beispielsweise.. gebe ich nur alle 
100 ms eine Wert-Änderung aus.. 10 Hz..

und wegen Flackern... Helligkeitsintensitätsänderungen unter 50 Hz 
(Fernsehbild) nimmt das Auge als flackern wahr..

Was mir aber aufgefallen ist: Wenn ich die Lichtintensität meines 
Displays auf maximum stelle (habe eine pwm-display dimm schaltung 
eingebaut) dann werden "häufige" Änderungen des gesamten bildschirms 
eher als "fleckige" oder "unsaubere" pixel sichtbar.. also ein 
komplettes Zeichen mit nur einsern.. wird nicht sauber aktualisiert... 
während der aktualisierung entstehen "schmutz" effekte.. wie gesagt ist 
das aber nur bei voller aussteuerung der helligkeit sichtbar...

viele grüße
sebastian

von Sumada (Gast)


Lesenswert?

Also ich habe alles in C geschrieben.
Für den Text musst du Arrays machen mit jedem Buchstaben (es ist zu 
Empfehlen wenn du sie nach ASCI-Zahlen anordnest). Danach musst du eine 
Subroutine erstellen in der du mit einer for-schlaufe an einem 
beliebigen Ort den Wert in dem Array des Buchstabens in das Displayarray 
überspielst.
Du kannst natürlich auch mit pointers arbeiten, ist aber schwieriger.

Einfachste Formen wie eine Gerad oder ein Rechteck sind auch ziemlich 
simpel. wenn du aber dann eine schräge Linie erstellen willst, wird das 
ziemlich aufwendig, also zeitlastig.

Wenn du das Programm mit zusätzlichen Interrupts Arbeiten lässt, ist das 
im Grunde ja kein Problem, da nach dem Interrupt an der gleichen 
Position weitergearbeitet wird. Was sollte den dein Display anzeigen? 
Eine analoge uhr, oder eine Digitale? Bei beiden sollte eigetlich ein 
Update von 1s reichen. dann ist es kein Flimmern mehr das Kopfschmerzen 
verursacht (was am Morgen beim ersten Blick auf den Wecker unschön wäre, 
wer will schon so den Tag beginnen? :)), sondern ein leichtes hüpfen.

Und so ein schreibvorgang dauert ja auch nicht alle Welt, da sollte es 
ausreichen, wenn du alle 40ms kurz ein Update rüberschickst, und bei 
einer änderun das array auf den neusten Stand bringst. Wenn du das so 
machst, würde ich aber nur wenige bis keine Interrupt-Serviceroutinen 
verwenden, weil es dann ziemlich unübersichtlich wird.

Ist ein wenig ein gestuss. wenn du nach kommst dann freut es mich :D
mfg

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.