www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik [KS0108] Probleme beim Lesen der Daten von Spalte 63 und 127


Autor: Philipp Drewes (phili)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Liebe Forum-Gemeinde,
ich nutze die LCD Bibliothek von Pascal Stang um ein LCD Display mit 
128x64 Pixeln und einem KS0108 Controller anzusprechen.

Wenn man nun über die Routine "lcd_SetDot" ein Pixel setzten möchte, so 
klappt dies bei mir prima, so lange ich nicht in die letzten Spalten 
eines der beiden Controller (Display ist ja aus zwei 64x64 Flächen 
zusammengestellt) schreiben will.

Es scheint, als ob der Controller beim Lesen der Inhalte in diesen 
Spalten über
 temp = lcd_DataRead(); 

immer 0x00 zurückliefert und deshalb über
 lcd_DataWrite(temp & ~(1 << (y % 8))); 

immer nur ein Pixel in diesen beiden Spalten
gesetzt werden kann.

Kann jemand dieses Verhalten bestätigen? Bei den anderen Spalten geht es 
wie gewüscht.

Gute Nacht
Phili

Autor: Philipp Drewes (phili)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So nun habe ich die "lcd_SetDot" erweitert und nun läuft es:
void lcd_SetDot(uint8_t x, uint8_t y)
{
  uint8_t temp;

  lcd_SetAddress(x, y/8);
  temp = lcd_DataRead();  // dummy read
  lcd_SetAddress(x, y/8);
  temp = lcd_DataRead();  // read back current value
  lcd_SetAddress(x, y/8);
  lcd_DataWrite(temp | (1 << (y % 8)));

  lcd_StartLine(0);
}

Der ursprüngliche Code lautete
void lcd_SetDot(uint8_t x, uint8_t y)
{
  uint8_t temp;

  lcd_SetAddress(x, y/8);
  temp = lcd_DataRead();  // dummy read
  temp = lcd_DataRead();  // read back current value
  lcd_SetAddress(x, y/8);
  lcd_DataWrite(temp | (1 << (y % 8)));

  lcd_StartLine(0);
}
Ich verstehe nur nicht, warum dasHinzufügen von
  lcd_SetAddress(x, y/8); 
das Problem löst und warum es nur beim Schreiben (bzw. Auslesen) der 
letzten Spalten eines Conrollers auftritt.

Vielleicht noch nen Tipp dazu von jemandem?

Phili

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Normalerweise kommen die meisten Probleme mit LCD's von falschem (zu 
schnellem) Timing.
Wie du schon selber sagtest, es gibt eigentlich keinen Grund, warum die 
Ursprungsvarinte nicht funktionieren sollte. Ich kenne jetzt die lib von 
Pascal Stang nicht, und ob die das busy-flag abfragt, oder nicht, aber 
irgendwo da drin wird es auch entsprechenden delays geben. Was passiert, 
wenn du die mal verlängerst?

Oliver

Autor: Philipp Drewes (phili)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Oliver

> Normalerweise kommen die meisten Probleme mit LCD's von falschem (zu
> schnellem) Timing.
> Wie du schon selber sagtest, es gibt eigentlich keinen Grund, warum die
> Ursprungsvarinte nicht funktionieren sollte. Ich kenne jetzt die lib von
> Pascal Stang nicht, und ob die das busy-flag abfragt,

Das Busy-Flag wird von den Bibliotheksroutinen abgefragt.

> oder nicht, aber irgendwo da drin wird es auch entsprechenden delays geben.

Habe das Display direkt in den extern I/O Memory gehängt und muß mich 
somit nicht mehr um die direkte Beschaltung der Leitungen kümmern. Die 
Waitstaites habe ich zwischenzeitlich auf die maximalen Werte gesetzt. 
Das hat aber auch nichts geändert.

Phili

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> und muß mich
> somit nicht mehr um die direkte Beschaltung der Leitungen kümmern

aha... - Und das geht?

Nein, ich habe keinen Tip, da mir Pascal fremd ist.

...

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Direkten Asnchluß ans memory-i/O hab ich noch nie gemacht, aber auch da 
muß das Timing eingehalten werden. Wie stellst du das denn sicher?

Im Code für Memory-IO der avrlib

http://www.mil.ufl.edu/~chrisarnold/components/mic...

finde ich, im Gegensatz zum Code für Port-IO, gar keine delays. Macht 
das alles die Hardware automatisch?

Oliver

Autor: Philipp Drewes (phili)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Hannes, hallo Oliver,

> Direkten Asnchluß ans memory-i/O hab ich noch nie gemacht, aber auch da
> muß das Timing eingehalten werden. Wie stellst du das denn sicher?

Direkte Delays gibt es da wirklich nicht. Es wird habt über die 
Definition der Waitstates geregelt (z.B. Datenblatt Mega128 S. 31ff)

Ist sehr schick das spo zu machen, denn der Code für die harwarenahen 
Funktionen reduziert sich praktisch auf eine Zeile und zu 
programmierende Wackeln an den Steuerleitungen entfällt.

Für ein Command-Write sieht das dann ungefähr so aus
void ks0108WriteCommand(uint8_t cmd, uint8_t chip) {
    lcd_BusyWait(chip);    // wait until LCD not busy
    *(volatile unsigned char *) (LCD_CONTROLLER0_CTRL_ADDR + LCD_CONTROLLER_ADDR_OFFSET*chip + LCD_CONTROLLER_WRITE) = cmd;
 }
mit
void lcd_BusyWait(uint8_t controller)
{
  // wait until LCD busy bit goes to zero
  while(*(volatile unsigned char *) (LCD_CONTROLLER0_CTRL_ADDR + LCD_CONTROLLER_ADDR_OFFSET*controller + LCD_CONTROLLER_READ) & LCD_STATUS_BUSY);
}

P.S. Habe gerade die Lib gewechselt. Nutze jetzt die von Maximilian 
Thiele, weil dort die Textausgabe an beliebigen Pixeln direkt 
implementiert ist. Die Umsetzung des direkten I/O Memoryzugriffs ist 
noch ein wenig buggy. Mal sehen, was hier aus meinem ursprünglichen 
Problem geworden ist.

Phili

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na dann, wenn alles sonst richtig ist, hat vielleicht das LCD eine 
Macke.

Spasseshalber kannst du ja mal in
  temp = lcd_DataRead();  // dummy read
  lcd_SetAddress(x, y/8);
  temp = lcd_DataRead();  // read back current value

das hinzugefügte lcd_SetAddress(x, y/8) durch ein einfaches delay 
gleicher Länge ersetzen, und schauen, ob das auch funktioniert.

Oliver

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.