www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 16x2 Display am AtMega128


Autor: Kaiser Friedrich (chrisr)
Datum:

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



Autor: Ale (Gast)
Datum:

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

Autor: Jadeclaw Dinosaur (jadeclaw)
Datum:

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

Autor: Kaiser Friedrich (chrisr)
Datum:

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

Autor: Andreas Lang (andi84)
Datum:

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

Autor: Kaiser Friedrich (chrisr)
Datum:

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

Autor: Christoph Borowski (Gast)
Datum:

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

Autor: Andreas Lang (andi84)
Datum:

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

Autor: Kaiser Friedrich (chrisr)
Datum:

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

Autor: Oschi (Gast)
Datum:

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

Autor: Kaiser Friedrich (chrisr)
Datum:

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

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.