mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probleme mit KS0180 an ATMEGA644P


Autor: Benjamin Weps (kernelpanic)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Benjamin Weps (kernelpanic)
Datum:

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

Autor: Nox (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sascha Weber (sascha-w)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus Wachtler (mfgkw)
Datum:

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

Autor: Benjamin Weps (kernelpanic)
Datum:

Bewertung
0 lesenswert
nicht 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:

for (int x=0;x<128;x++)
 {
  for(int y=0;y<64;y++)
  {
   glcdSetDot(x,y);
  }
 }


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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
u08 glcdDataRead(void)
{
  u08 data;
  u08 controller = (GrLcdState.lcdXAddr/GLCD_CONTROLLER_XPIXELS);
#ifdef GLCD_PORT_INTERFACE
  cli();
  glcdBusyWait(controller);    // wait until LCD not busy
  sbi(GLCD_CTRL_PORT, GLCD_CTRL_RS);
  outb(GLCD_DATA_DDR, 0x00);
  sbi(GLCD_CTRL_PORT, GLCD_CTRL_RW);
  sbi(GLCD_CTRL_PORT, GLCD_CTRL_E);
  asm volatile ("nop"); asm volatile ("nop");
  asm volatile ("nop"); asm volatile ("nop");
  asm volatile ("nop"); asm volatile ("nop");
  asm volatile ("nop"); asm volatile ("nop");
  data = inb(GLCD_DATA_PIN);
  cbi(GLCD_CTRL_PORT, GLCD_CTRL_E);
  cbi(GLCD_CTRL_PORT, GLCD_CTRL_RW);
  sei();
#else
  //sbi(MCUCR, SRW);        // enable RAM waitstate
  glcdBusyWait(controller);    // wait until LCD not busy
  data = *(volatile unsigned char *) (GLCD_CONTROLLER0_CTRL_ADDR + GLCD_CONTROLLER_ADDR_OFFSET*controller);
  //cbi(MCUCR, SRW);        // disable RAM waitstate
#endif
/*
  // increment our local address counter
  GrLcdState.ctrlr[controller].xAddr++;
  GrLcdState.lcdXAddr++;
  if(GrLcdState.lcdXAddr >= GLCD_XPIXELS)
  {
    GrLcdState.lcdYAddr++;
    glcdSetYAddress(GrLcdState.lcdYAddr);
    glcdSetXAddress(0);
  }
*/
  return data;
}


dann geht es bei mir. Es ist der von mir auskommentierte
Bereich ganz unten der stört.

Autor: Benjamin Weps (kernelpanic)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oha, perfekt!

Danke ich hab es auch so geändert, jetzt funktionierts bei mir auch.

Vielen Dank!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.