Hallo, ich habe Probleme mein Graphik Display von Reichelt (Art Nr. LCD 64128A LED) anzusteuern. Das Display wird von 2 KS0180 Chips gesteuert. Zum ansteuern nehme ich die Procyon AVRLib. Der ATMEGA644P läuft auf 20Mhz. An sich funktioniert das Zeichen jedoch scheint er probleme zu haben, wenn er den chip wechselt. Wie dieser Fehler auftritt passiert völlig willkürlich. In dem Anhang habe ich Fotos beigelegt, die zeigen was passiert wenn ich das Display in 2 for schleifen fülle. Das erste Bild wird gezeichnet wenn ich das Display den Spalten nach fülle, und das 2. wenn ich es den Reihen nach fülle. Kennt jemand dieses Problem ? Scheinbar ist es ein Problem mit dem Treiber, denn das Display kann diese freien Punkte durch aus anzeigen. Wenn ich das display langsam fülle merke ich, das beim übergang auf den 2.Chip in dieser Reihe die Pixel scheinbar willkürlich an und ausgeschalten werden. Vielen Dank schonmal :-)
>Das Display wird von 2 KS0180 Chips gesteuert. Zum ansteuern nehme ich >die Procyon AVRLib. Der ATMEGA644P läuft auf 20Mhz. Das sind Timing Probleme. Mach die Ansteuerung langsamer.
Hmm das hat das Problem nicht behoben, wenn ich den Fuse auf den Internen Oszilator umstelle, kommt genau das gleiche Bild
Hier haben wir mal zwischen jedem Punkt eine Pause von 1ms eingefügt. Da sieht man das Phänomen mal in Zeitlupe. Einfach nur eigenartig. (1,5 MB Clip) http://www.xotoxic.de/upload/100_2402.MOV.MP4
Hallo, benutzt du eine Funtion zum setzen EINES Pixels ? Irgendwie scheint er am Übergang zum nächsten Controller die Daten falsch aus dem Display auszulesen, man sieht ja das sich nach unten gleich mehrere Pixel ändern, da die Byte's bei diesem Typ senkrecht angeordnet sind. Hast du alle Definitionen der Lib richtig angepasst? Poste doch mal deinen Code. Sascha
Am rechten Rand passiert übrigens ähnliches, wenn ich das auf dem Film richtig gesehen habe.
Klaus Wachtler schrieb: > Am rechten Rand passiert übrigens ähnliches, wenn ich das > auf dem Film richtig gesehen habe. Ja also es ist immer die letzte Spalte eines Controlers, die fehlerhaft dargestellt wird. Zum auffüllen benutze ich die SetDot Funktion:
1 | for (int x=0;x<128;x++) |
2 | {
|
3 | for(int y=0;y<64;y++) |
4 | {
|
5 | glcdSetDot(x,y); |
6 | }
|
7 | }
|
Ja und was die Einstellungssache betrifft... viel mehr als den Port einzustellen gibts ja da nich, und die Displaygröße is auch richtig eingestellt. BTW: Es liegt wirklich am Treiber, ich habe den Treiber von Fabian Maximilian Thiele getestet, da funktioniert es. Werde jetzt wahrscheinlich auf diese lib umsteigen. Muss sie nur noch dazu bringen unter 20Mhz zu laufen Trotzdem vielen Dank für eure freundliche Hilfe :-)
Hab auch grad mal die Procyon AVRLib an meinem KS0108 Display ausprobiert. Der ATMEGA644 läuft auf 16Mhz. Exakt das gleiche Problem! Wenn man das Programm so ändert:
1 | u08 glcdDataRead(void) |
2 | {
|
3 | u08 data; |
4 | u08 controller = (GrLcdState.lcdXAddr/GLCD_CONTROLLER_XPIXELS); |
5 | #ifdef GLCD_PORT_INTERFACE
|
6 | cli(); |
7 | glcdBusyWait(controller); // wait until LCD not busy |
8 | sbi(GLCD_CTRL_PORT, GLCD_CTRL_RS); |
9 | outb(GLCD_DATA_DDR, 0x00); |
10 | sbi(GLCD_CTRL_PORT, GLCD_CTRL_RW); |
11 | sbi(GLCD_CTRL_PORT, GLCD_CTRL_E); |
12 | asm volatile ("nop"); asm volatile ("nop"); |
13 | asm volatile ("nop"); asm volatile ("nop"); |
14 | asm volatile ("nop"); asm volatile ("nop"); |
15 | asm volatile ("nop"); asm volatile ("nop"); |
16 | data = inb(GLCD_DATA_PIN); |
17 | cbi(GLCD_CTRL_PORT, GLCD_CTRL_E); |
18 | cbi(GLCD_CTRL_PORT, GLCD_CTRL_RW); |
19 | sei(); |
20 | #else
|
21 | //sbi(MCUCR, SRW); // enable RAM waitstate
|
22 | glcdBusyWait(controller); // wait until LCD not busy |
23 | data = *(volatile unsigned char *) (GLCD_CONTROLLER0_CTRL_ADDR + GLCD_CONTROLLER_ADDR_OFFSET*controller); |
24 | //cbi(MCUCR, SRW); // disable RAM waitstate
|
25 | #endif
|
26 | /*
|
27 | // increment our local address counter
|
28 | GrLcdState.ctrlr[controller].xAddr++;
|
29 | GrLcdState.lcdXAddr++;
|
30 | if(GrLcdState.lcdXAddr >= GLCD_XPIXELS)
|
31 | {
|
32 | GrLcdState.lcdYAddr++;
|
33 | glcdSetYAddress(GrLcdState.lcdYAddr);
|
34 | glcdSetXAddress(0);
|
35 | }
|
36 | */
|
37 | return data; |
38 | }
|
dann geht es bei mir. Es ist der von mir auskommentierte Bereich ganz unten der stört.
Oha, perfekt! Danke ich hab es auch so geändert, jetzt funktionierts bei mir auch. Vielen Dank!
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.