Hiho, hab da mal eine Frage bezüglich eines GLCD Displays... und zwar dreht es sich um dieses Pollin DG-16080 Dingens (Ja... Touch funktionierte). Soweit funktioniert das Display auch wunderbar. Allerdings jedoch ist es etwas träge im Bildaufbau. Schon so das man es sehen kann. Gerade wenn man den Screen softwareseitig auf clear setzt (Da laß ich höhe mal breite 0x00 durchlaufen). Aber wie gesagt man sieht es. Gibt es eine Möglichkeit den Screen zu "buffern" und dann auf einen Schlag zu Ausgabe zu geben?! Bietet der LC7981 Controller solch eine Möglichkeit?! Oder sogar Hardwaremäßig? Wozu ist der Reset Pin und der CS gut (Pin 15 und 16)? Dort habe ich Reset hardwareseitig auf high und CS auf low. Jemand einen Hinweis?
Hi, also so wie es ist nicht allerdings war hier in nen terat dazu was wie man den kompletten Speicher nutzen kann eventuell geht es damit. cs,reset sind nur zum resetten b.z.w. halt Chip selekt wird dir dabei auch erstmal nicht weiterhelfen.
@Rene also wenn du den Bildaufbau sehen kannst, dann machst du was falsch. Ich kann bei meinem DG16080 den Bildinhalt löschen und neue Daten darstellen ohne dabei eine nennenswerte Verarbeitungszeit feststellen zu können. Wie löschst du den Bildinhalt? - doch nicht etwa pixelweise! Wertet deine LCD-Routine das Busy-Bit aus oder verwendest du Delay's? Sascha
Sascha Weber schrieb: > @Rene > > also wenn du den Bildaufbau sehen kannst, dann machst du was falsch. > > Ich kann bei meinem DG16080 den Bildinhalt löschen und neue Daten > darstellen ohne dabei eine nennenswerte Verarbeitungszeit feststellen zu > können. > > Wie löschst du den Bildinhalt? - doch nicht etwa pixelweise! > Wertet deine LCD-Routine das Busy-Bit aus oder verwendest du Delay's? > > Sascha Nunja, es nun, wie gesagt, nicht so das ich es direkt sehen kann, es flackert halt kurz, das nervt aber :D Ich warte die Busyflag mit einem delay ab von 3x nop, Das auslesen der Bussyflag würde über der Verarbeitsungszeit liegen - aber so ansastzweise bin ich bei ca. 1µs für die Flag. Den Bildschirminhalt lösche ich byteweise (0x00) also in 1600 Schritten :/
Du könntest einen µC mit etwas mehr Ram nehmen (z.B. atmega32) und das Bild in diesen Ram abspeichern. Dann kannst du das Bild periodisch aktualisieren indem du das Bild einfach überschreibst. z.B in C etwa so: ISR: { for(i=0;i<1600;i++) writeByte(bild[i]); } void setRamPixel(int x, int y) { ... bild[i]=...; }
Rene K. schrieb:
> Den Bildschirminhalt lösche ich byteweise (0x00) also in 1600 Schritten
setzt du die Cursorposition für jedes Byte neu? Oder gibst du die 20Byte
pro Zeile hintereinander aus?
Hab bei mir gerade mal gemessen das löschen des Bildinhaltes dauert 15ms
und der Bildaufbau siehe Anhang 180ms.
ATMega644 läuft mit 18MHz.
Sascha
Daniel T. schrieb: > Du könntest einen µC mit etwas mehr Ram nehmen (z.B. atmega32) und das > Bild in diesen Ram abspeichern. Dann kannst du das Bild periodisch > aktualisieren indem du das Bild einfach überschreibst. Sehr schön danke, eine nette idee! Einfach selber einen Framebuffer bauen. µC ist sowieso ein ATMega32. Sascha Weber schrieb: > setzt du die Cursorposition für jedes Byte neu? Oder gibst du die 20Byte > pro Zeile hintereinander aus? Nein nein, ich schreibe die 1600byte hintereinander rein, da er ja eh jede Zeile bei Ende springt:
1 | void lcd_clear(void) { |
2 | unsigned int i; |
3 | |
4 | lcd_Cmove(0, 0); |
5 | |
6 | for (i = 0; i < 1600; i++) lcd_graphics_draw_byte(0x00); |
7 | }
|
Sascha Weber schrieb: > Hab bei mir gerade mal gemessen das löschen des Bildinhaltes dauert 15ms > und der Bildaufbau siehe Anhang 180ms. > ATMega644 läuft mit 18MHz. Nuja, messen könnte ich es ja mal mit meinem Logicanalyzer. Mein Atmega läuft mit 16Mhz, jedoch wird es halt durch die Bussyflag nicht deutlich schneller, auch kann ich das schreiben gegenüber einem 8Mhz Quarz nicht deutlich steigern, da ich dann die fallenden E-Flanke in der Zeit anpassen muß.
Hallo, ich habe nochmal eine Frage an die Profis hier: Ich kann mit der Funktion von Benedikt, zum "springen" zu einer Adresse im Display:
1 | void GLCD_SetAdress(unsigned char x, unsigned char y) |
2 | {
|
3 | unsigned short adress; |
4 | adress=y*20+x; |
5 | GLCD_writecom(0x0A); // write adress low |
6 | GLCD_writedata(adress&255); |
7 | GLCD_writecom(0x0B); // write adress high |
8 | GLCD_writedata(adress/256); |
9 | }
|
..nur bis zur Zeile 7 springen danach geht es nicht mehr, bzw. wird ab hier dann nichts mehr geschrieben =( Wenn ich aber keine Zeile anwähle sondern einfach nur wild aufs LCD drauf los schreibe schreibt er sauber das ganze Display voll aufgrund des inkrementieren um 1 je Datensatz. Meine Initialisierung sieht so aus:
1 | void GLCD_Init_C(void) |
2 | {
|
3 | GLCD_RES=0; |
4 | Delay10KTCYx(1); |
5 | GLCD_RES=1; |
6 | |
7 | GLCD_writecom(0x00); // Mode Con |
8 | GLCD_writedata(0x3C); // Character Mode, Cursor blink |
9 | |
10 | GLCD_writecom(0x01); // Character Pitch |
11 | GLCD_writedata(0x77); // 8x8 Chars |
12 | |
13 | GLCD_writecom(0x02); // Number of Characters |
14 | GLCD_writedata(19); // 19 Zeichen <---> |
15 | |
16 | GLCD_writecom(0x03); // Set Duty |
17 | GLCD_writedata(0x4F); // 80-1 |
18 | |
19 | GLCD_writecom(0x04); // Cursor Position |
20 | GLCD_writedata(0x07); // Line 1 |
21 | |
22 | GLCD_writecom(0x08); // Start Adresse Low |
23 | GLCD_writedata(0x00); // 0 |
24 | |
25 | GLCD_writecom(0x09); // Start Adresse High |
26 | GLCD_writedata(0x00); // 0 |
27 | |
28 | GLCD_writecom(0x0A); // Cursor lower adress |
29 | GLCD_writedata(0x00); // 1 |
30 | |
31 | GLCD_writecom(0x0B); // Cursor upper adress |
32 | GLCD_writedata(0x00); // 1 |
33 | }
|
1. Wo ist der unterschied zwischen Cursor Adresse und Start Adresse? schönen Abend! Nico PS: Ich hatte den Beitrag mal in einem anderen Thread gestellt der war aber schon ziemlich alt ich hoffe hier nimmt sich einer Zeit mir zu helfen =/
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.