Probleme mit KS0180 an ATMEGA644P

OP #1548319
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 :-)
Angehängte Dateien:
#1548898
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
OP #1549041
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 :-)
Gast #1549052
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren