Forum: Mikrocontroller und Digitale Elektronik 16x2 Display am AtMega128


von Kaiser F. (chrisr)


Lesenswert?

Hallo,

ich habe ein 16x2 Display von Reichelt (LCD162C) am ATMega1280 
angeschlossen. Das Board funktioniert soweit einwandfrei und meine 
Programme mit dem avr-gcc laufen ebenfalls.

Nun hab ich an Port C das Display so angeschlossen (ich möchte den 4 Bit 
Modus nutzen):

1       Vss     GND
2       Vcc     5V
3       Vee     Abgriff von Poti (an VCC und GND)
4       RS      PC0 am AVR
5       RW      GND
6       E       PC2 am AVR
7       DB0     GND
8       DB1     GND
9       DB2     GND
10      DB3     GND
11      DB4     PC4 am AVR
12      DB5     PC5 am AVR
13      DB6     PC6 am AVR
14      DB7     PC7 am AVR

Wenn ich Atmel plus Display einschalte, erscheint auf dem Display eine 
Zeile schwarz (d.h. die einzelnen Textfelder). Trotz etlicher Versuche 
ist es mir aber noch nicht gelungen, irgendein Zeichen auszugeben. Ich 
hab es auch schon mit der bekannten LCD Lib versucht. Dazu habe ich noch 
RW and PC1 angeschlossen und in der Lib die entsprechenden Defines 
angepasst(IOMode 1, LCD_CONTROLLER_KS0073 0, XTAL 16000000, usw)

lcd_initialize läuft durch, bei lcd_clrscr bleibt das Programm aber beim 
Sync-Wait hängen, ich bekomme also scheinbar auch kein ACK vom Display.

Hat jemand einen Tipp, was ich hier falsch mache oder ein kurzes Stück C 
Code, mit dem ich irgendeine Reaktion aus dem Display rauskitzeln kann? 
Ist an der Anschaltung irgendwas buggi? Hab leider auch kein Ossi hier.

Vielen Dank im voraus!

Christian



von Ale (Gast)


Lesenswert?

1. Bist du sicher, dass alle pin laufen ? (Sind Ausgänge, Toggle geht).
2. Wie steht die Init aus ?, es ist richtig ?
3. Vor initializierung habst du etwa 30 ms gewartet ?

Such andere lib, vielleicht geht.

von Jadeclaw D. (jadeclaw)


Lesenswert?

Du kannst auch keine Rückmeldung vom Display bekommen,
denn die Schreibleitung (RW) ist auch auf Masse gelegt.
Zwei Möglichkeiten:
Entweder die Schreibleitung an einen Portpin legen und steuern und D0-D3 
vom Display von Masse trennen oder D0-D3 vom Display von Masse trennen 
und das Ganze nicht über Rückmeldung machen sondern schlicht lange genug 
warten. Die Zeiten stehen im HD44780- oder KS0066-Datenblatt. Da sollte 
sich auch der Ablauf der Init-Sequenz finden.
Warum D0-D3 offen lassen?
Weil dort PullUp-Widerstände drin sind, das erhöht den Stromverbrauch.
Und wird auf Lesen geschaltet, gibt es sonst Bruch.

Gruss
Jadeclaw.

von Kaiser F. (chrisr)


Lesenswert?

Hallo,

ja, aber ich hatte oben auch geschrieben, dass ich für die Lib R/W auf 
PC1 gelegt hatte, da die Lib dies benötigt. Trotzdem bleibt das Teil 
dort hängen. Hast Du eine Idee, was dort noch falsch sein kann? Ist denn 
die Anschaltung grundsätzlich erstmal so korrekt?

Ich hab jetzt nochmal R/W an PC1 gehängt, D0-D3 frei gelassen, der Rest 
wie gehabt. Nun bekomme ich immerhin alle Felder des Displays schwarz. 
Dafür hängt der Code aber jetzt im lct_init und kommt nicht mehr raus. 
Ich warte nach dem Einschalten auch noch rund 500ms, bevor ich init 
aufrufe.

Grüße,
Christian

von Andreas L. (andi84)


Lesenswert?

Alle pixel sind schwarz?
Das ist an sich schon mal positiv, denn das LCD tut folglich irgendwas, 
ich würde sogar fast sagen, dass das Ding initialisiert hat.
Schonmal die Kontrastspannung verändert? Daran könnte es auch liegen, 
dass alles schwarz st.
Ansonsten einfach immer mal 0.5ms-1ms nach jedem Befehl warten. Wenn's 
dann geht, funzt zumindest mal das LCD und der Code stimmt größtenteils 
auch.
Wen es dann immer noch nicht geht, mal die Verbindung µC-LCD durchtesten 
(Lötbrücken usw.)

MfG
Andreas

von Kaiser F. (chrisr)


Lesenswert?

Hallo,

ich hab den Eindruck, das es irgendwas mit dem Timing zu tun hat. Wenn 
das Ding (Atmel und Display) einschalte oder neu die SW einspiele, 
bekomm ich unterschiedliches Verhalten. Dabei passiert folgendes:

a) erste Zeile Schwarz, bleibt hängen
b) Display leer, dann blinkt der Cursor an 1. Stelle, danach füllt sich 
das Display von links nach recht und über beide Zeilen komplett schwarz 
auf.

a)passiert sehr oft, b) passiert seltener, häufiger dann, wenn ich nicht 
neu einschalte sondern nur die SW über den ISP einspiele.

Es scheint sich da schon was zu tun. Ich mess nochmal die Verbindungen 
alle durch. Noch irgendwelche Ideen? Kann ich in der LCD Lib 
irgendwelche Defines falsch gemacht haben? Wie kann das Teil eigentlich 
im lcd_init hängen bleiben?

Grüße,
Christian

von Christoph Borowski (Gast)


Lesenswert?

Hallo Christian,

ich hatte bei meinen LCD-Versuchen (ATmega8, 4x27 Display von Pollin) 
ähnliche Symtome. Mein Fehler war, dass mein ATmega8 mit 4MHz lief 
(Quarz) und ich davon ausgegangen bin, dass der mit 16MHz getaktet wird. 
Entsprechend war in der make-Datei und in den C-Sourcen 16Mhz als 
Konstante für div. Berechnungen (z. B. Initialisierung Display) 
eingetragen. Folge war, dass die Initialisierung des Displays nicht 
korrekt durchgeführt wurde und das Display nichts vernünftiges anzeigte. 
Nachdem ich meinen Fehler erkannt und korrigiert hatte, lief das Teil 
auf Anhieb.

Hoffe, das hilft weiter...

Gruss
Christoph

von Andreas L. (andi84)


Lesenswert?

> Wie kann das Teil eigentlich
> im lcd_init hängen bleiben?

Eigentlich nur, indem es den Status der Busy-Leitung liest.

War da nicht was mit der Datenrichtungsumschaltung bei neueren ARs?

von Kaiser F. (chrisr)


Lesenswert?

Hallo Christoph,

danke, aber das ist es auch nicht. Der Takt ist 16 MHz (hab auch nochmal 
auf den Quarz gesehen, das ist korrekt). XTAL habe ich als 16000000 
definiert.

Die Initialisierung scheint manchmal tatsächlich auch zu gehen. 
Gelegentlich ist das Display leer, der Cursor steht auf (0,0) und blinkt 
munter vor sich hin, hängt dann aber irgendwo in den letzten 4 
Anweisungen von lcd_init und kommt nicht zurück. Das wiederrum liegt 
scheinbar daran, dass kein ACK zurück kommt. Das Grundsätzlich kein ACK 
kommt, kann eigentlich auch nicht sein, da vorher bereits synchronisiert 
und auf das ready bit gewartet wird.

Grüße,
Christian

von Oschi (Gast)


Lesenswert?

Sollte man nicht die D0-D3 benutzen ? Den Busy kannste Vergessen. Das 
ist nicht noetig. Besser mit einem Timer die Zeiten einhalten. Die Zeile 
1 beginnt bei 0x00, die Zeile 2 bei 0x40

O.

von Kaiser F. (chrisr)


Lesenswert?

ENTSCHULDIGUNG!!! :-)

Alles zurück, es geht!

Hab leider einfach 3 Pins vertauscht, da ich von oben draufgeschaut, 
aber von unten gelötet habe peinlich. hat nur 4 Stunden gedauert, bis 
ich das gemerkt habe!

Danke trotzdem für die Hilfe!

Grüße,
Christian

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.