mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 8051 und KS0108 Display


Autor: dago (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich versuche gerade ein EA DIP128-6 (128x64, KS0108) an einem AT89C51AC3 
zum Laufen zu bekommen.
Diese Lib möchte ich verwenden http://en.radzio.dxp.pl/ks0108/ .

Das Display ist so angeschlossen:
P0 => D0...D7
P2.0 RST#
P2.1 D/I
P2.2 R/W
P2.3 E
P2.4 CS1
P2.5 CS2

Da das Display ja zwei Enable hat und Chip Select jeweils H und L, habe 
ich, wie im Datenblatt beschrieben, die beiden Enable miteinander 
verbunden und CS1L# und CS2L# jeweils auf GND gelegt. CS1H und CS2H 
entsprechen dann den Signalen CS1 und CS2.

Nun möchte ich ja die Lib von radzio.dxp.pl verwenden. In der wollte ich 
nun die Pins anpassen, doch das ist leichter gesagt als getan.

Die Datei ks0108-8051.c, wie sie von der Seite stammt, ist im Anhang. So 
habe ich sie bis jetzt mal angepasst:
#include <at89c51ac3.h>

#define KS0108_DATA_PORT  P0
#define KS0108_DATA_DIR    P0
#define KS0108_DATA_PIN    P0

#define KS0108_CTRL_PORT  P2
#define KS0108_CTR_DIR    P2

#define KS0108_RS      (1 << 0)  // P2.0
#define KS0108_RW      (1 << 2)  // P2.2
#define KS0108_EN      (1 << 3)  // P2.3

#define KS0108_CS1      (1 << 4)  // P2.4
#define KS0108_CS2      (1 << 5)  // P2.5
#define KS0108_CS3      (1 << 6)  // P2.6
Jetzt fehlt mir ja noch ein wenig....

Die lib möchte ich soweit beschneiden, dass nur zwei 64x64 Controller 
(eben 128x64) angesteuert werden können und somit fällt dann CS3 raus, 
jetzt erstmal habe ich das auf P2.6 gelegt, was nirgends angeschlossen 
ist.
Und es fehlt mir noch D/I.
Zuerst dachte ich, das wär wie beim HD44780 ein Pin, welchen man fest 
verdrahten kann (ich glaube das war der R/W), aber D/I ist ja 
verantwortlich dafür, ob man Daten oder Befehle übertragen möchte.
Was muss ich da noch dran drehen?

Ich habe auch schon in den C-Dateien für die anderen verfügbaren 
Controller nachgesehen, aber dort konnte ich auch kein D/I finden.

Ich hoffe mir kann da jemand helfen...

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der 8051 kennt Bitbefehle. Da brauchst Du nicht solche unübersichtlichen 
Konstrukte der AVRs zum setzen einzelner Portpins.

#define KS0108_RS      (1 << 0)  // P2.0

=

#define KS0108_RS P2_0

im Programm dann so verwenden:

KS0108_RS = 1; oder KS0108_RS = 0;

je nach Compiler gibst noch etwas Spezifik zu beachten.

Autor: dago (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Naja, das war von vornherein schon so. Ich mache das sonst immer mit 
sbit.

Ich hab nun mal eine andere lib (siehe Anhang, weiss die Seite leider 
nicht mehr) verwendet, aber die funktioniert nicht. Es wird einfach 
nichts angezeigt.

Ich werd mal weiter herumprobieren, vielleicht bekomme ich ja noch was 
heraus...

Autor: dago (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Nachdem ich nichts passendes mehr gefunden habe, habe ich mich mal 
drangemacht, etwas "eigenes" zu schreiben. Da ich von sowas keine Ahnung 
habe, habe ich mir diesen Code (aus dem ersten Beitrag das Archiv) 
Beitrag "GLCD Routinen ( KS0108, HD61202 )" als Vorlage genommen. Der 
ist recht übersichtlich und einfach gestaltet.

Mein Code ist im Anhang. In der main rufe ich das so auf:
lcd_init();
cls();
lcd_set_pixel(10,10,BLACK);

Nachdem das nichts anzeigt, habe ich mal Debug Ausgaben per UART 
eingebaut und sehe, dass er in der lcd_cmd hängen bleibt:
void lcd_cmd(unsigned char cmd, unsigned char chip) {
  cs(chip);
  DI = 0;
  RW = 0;
  lcd_write(cmd, chip);
}
In der lcd_write kommt er bis zum busywait und dort hängt er dann in der 
while fest:
void busywait() {
  LCDDATA = 0xFF;
  DI = 0;
  RW = 1;
  E = 1;
  waitms(1);
  while((P2 & BUSY) != 0) {  // poll for busyflag
    E = 0;
    waitms(1);
    E = 1;
    waitms(1);
  }

  E = 0;
  RW = 0;
}

Könnte mal jemand der hiervon ein wenig Ahnung hat, meinen Code 
durchsehen? Die Anschlussbelegung steht direkt oben im Code im Abschnitt 
Header.

Autor: Stephan Henning (stephan-)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sorry kann kein C aber das kommt mit komisch vor

>  while((P2 & BUSY) != 0) {  // poll for busyflag

Wer ist hier P2 ?? Der Port ?? Oder reden wir von einem Bit ?
Sollte man den Port einlesen vor der Prüfung ?
Wo wird der Port gelesen ?

Autor: dago (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
P2 ist der Datenport. Also D0...D7 vom Display sind an P2.0...P2.7 
angeschlossen. Der C-Compiler lässt auch direkt Zugriffe darauf zu, 
z.B.:
P2 = 0x3F;
if(P2 == a) {.....

Autor: Pieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
moin moin,

wo bitte wird P2 auf Input gesetzt (P2=0xFF)?

mfg
Pieter

Autor: dago (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Am Anfang der Busywait. Was mir dabei gerade auffällt, leider habe ich 
da vergessen das P2 in der While Schleife durch das LCDDATA (#define 
LCDDATA P2) zu ersetzen. P2 geht ja genauso, aber für andere vlt. nicht 
ganz so übersichtlich.

Autor: Stephan Henning (stephan-)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
laß Dir doch mal P2 ausgeben. Dann sollte sich was finden lassen.

Autor: dago (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, da kam immer D0 bei raus. Als ich dann mal P2 an LCDDATA angepasst 
habe, fiel mir auf, dass ich da einen Dreher drin hatte. Nach eiener 
Weile basteln bin ich nun etwas durcheinander, weiss nicht mehr genau, 
was alles falsch war und habe es nun, glaube ich, soweit richtig.

Er arbeitet lcd_init(), cls() und lcd_set_pixel(10,10,BLACK) komplett 
durch, dennoch zeigt er nichts an.

Im Anhang der Code

Autor: dago (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Irgendwas ging da wohl schief beim Anhängen...

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.