Forum: Mikrocontroller und Digitale Elektronik Probleme mit KS0180 an ATMEGA644P


von Benjamin W. (kernelpanic)


Angehängte Dateien:

Lesenswert?

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 :-)

von holger (Gast)


Lesenswert?

>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.

von Benjamin W. (kernelpanic)


Lesenswert?

Hmm das hat das Problem nicht behoben, wenn ich den Fuse auf den 
Internen Oszilator umstelle, kommt genau das gleiche Bild

von Nox (Gast)


Lesenswert?

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

von Sascha W. (sascha-w)


Lesenswert?

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

von Klaus W. (mfgkw)


Lesenswert?

Am rechten Rand passiert übrigens ähnliches, wenn ich das
auf dem Film richtig gesehen habe.

von Benjamin W. (kernelpanic)


Lesenswert?

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 :-)

von holger (Gast)


Lesenswert?

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.

von Benjamin W. (kernelpanic)


Lesenswert?

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
Noch kein Account? Hier anmelden.