Ich habe hier ein LCD, das ich aus einem Xerox Drucker
ausgebaut habe. Es hat den HD44780 Controller.
Das Problem ist, das ich es einfach nicht dazu bekomme einen
Text auszugeben.
Das Problem fängt schon bei der Initialisierung an. Stelle ich den
Cursor komplett ab, so ist er nach der Initialisierung weg. OK.
Schalte ich den Cursor ohne Blinken ein, so ist er nicht da.
Schalte ich den Cursor mit Blinken ein, so ist er da und blinkt,
rutscht aber 1 Zeichen von der 0,0 Position nach rechts.
Ich denk mal ich hab irgendwo ein Brett worm Kopf.
Weiß irgendjemand woran das liegen kann?
Wiesi
Nur so als Tipp, weil ich den Fehler vorhin auch gemacht hab:
Das teil braucht ne Weile, um Befehle abzuarbeiten. D.h. man muss
entweder lange genug warten oder das busy-flag lesen. (siehe
Datenblatt) Wenn man sich nicht fran hält, kommt müll raus.
(ich hab meine lcd-routinen von nem früheren Projekt übernommen, nur
das jetzige läuft bei doppelter Frequenz aber die timings waren die
alten^^).
Hallo Wiesi
Wie sind denn L_xy definiert? Wenn z.B. L_DB4 = L_DB5 = L_DB6 = L_DB7 =
PORTB ist, dann werden die Bits mit
#define L_DB PORTB
#define L_BIT4 4
#define L_BIT5 5
L_DB |= (1<<L_BIT4) gesetzt und mit
L_DB &= ~(1<<L_BIT5) gelöscht.
Mir scheint, du schreibst immer eine 0x00 oder eine 0x01 auf den
kompletten Port.
Gruß
Marco
-
Hallo Marco,
die sind so definiert:
#define L_RS RB1
#define L_RW RB2
#define L_E RB3
#define L_DB4 RB4
#define L_DB5 RB5
#define L_DB6 RB6
#define L_DB7 RB7
Beim dem HI-Tech Pic-Compiler ist ein bitweiser Zugriff auf den
Port möglich (z.B. RB1 = 1; RB4 = 0; usw.).
Weil als aber keine beisammenliegenden Portleitungen sein müssen,
Werte ich die Bits einzeln aus und gebe sie aus.
Wiesi
Habe gedacht, es handelt sich um avr-gcc. Mit Hi-Tech und PIC kenn ich
mich garnicht aus.
Der bitweise Zugriff mit RB4 = 0 ist ja sehr bequem. Könntest du mir
auch noch verraten, wie RB1 definiert ist?
Nun mal eine Codezeile:
L_DB7 = cmd & 0x80 > 0 ? 1 : 0;
Wenn ich den Ausdruck auswerte, wird L_DB7 das, was rechts vom = steht
zugewiesen. Gehen wir die Prioritätenliste hinauf, so folgt der ternäre
Operator. Dieser gibt 0 oder 1 zurück, je nachdem wie der Ausdruck
zwischen dem = und dem ? ist. Hier steht "cmd & 0x80 > 0". Auch
dieser Ausdruck wird ausgewertet. Das Operatorsymbol mit der höchsten
Priorität ist das >. Also wird zu "cmd & 1" vereinfacht. Kann es
sein, dass du den Port-Bits immer nur das niederwertigste Bit von cmd
aufzwingst, oder habe ich das falsch verstanden? Ich würde
L_DB7 = cmd & 0x80 ? 1 : 0;
schreiben.
Gruß
Marco
-
@Marco
Danke für den Tipp, es ist mir auch gerade aufgefallen, dass es
so heißen muss:
L_DB7 = (cmd & 0x80) > 0 ? 1 : 0;
Dann kommt auch das richtige raus (beim Port).
Jetzt kann ich schon den Cursor so einstellen wie ich es haben
will, was mir sagt, dass die Kommunikation so weit funktioniert.
Leider wird das Display immer nocht leer, wenn ich ein Zeichen
ausgeben will oder dir DDRAM Adresse ändere.
Bei einem LCD werden ja meist nach dem Einschalten alle Pixel
etwas dunkler als im ausgeschalteten Zustand.
Das ausgebaute Modul hat 1x16 Zeichen. Dunkler werden aber nur
die ertsen 8. Ich denke da hat´s was.
Das Problem ist, das ich von dem Modul keine Anschlussbelegung/
Datenblatt habe.
Es hat 22 Anschlüsse und ich hab 9 davon rausgesucht indem ich
den Durchgang zwischen Controller und Kontaktleiste gemessen
hab. (7 Steuer + 2 Versorgung).
Wiesi