Forum: Mikrocontroller und Digitale Elektronik LCD Display 2x16 Zeichen


von Dietmar P. (dietmar2)


Angehängte Dateien:

Lesenswert?

Hallo,

bastle immer noch an meinem Display herum, läuft aber nicht.

2x16 Zeichen der Firma Displaytech mit Controller KS0070B (Reichelt LCD 
162C LED).
Geschrieben werden soll über ein Schieberegister 74HC164N. Damit genügen 
drei Anschlüsse CLK, DATA und DATA-ENABLE. Schaltung ähnlich Ulrich 
Radig.
Schaltplan füge ich mal bei.
Zur Steuerung verwende ich einen Atmega 32, Standardansteuerung PORT C.

Leider tut sich da nichts auf dem Display, habe nur einen schwarzen 
Balken in der ersten Zeile.
Verwende ich PORT D, dann kann ich die Hintergrundbeleuchtung an- und 
ausschalten.

Leitungen zwischen Mikrocontroller und IC bzw. LCD-Display sind x-mal 
geprüft.
Weil ich den Atmega ohne externen Quartz betreibe habe ich über "F-CPU" 
den Takt von 1 MHZ bis 12 MHz probiert.

Wo kann da der Knackpunkt sein?

Danke vorab für Eure Hilfe.

von tsaG (Gast)


Lesenswert?

>Leider tut sich da nichts auf dem Display, habe nur einen schwarzen Balken in der 
ersten Zeile.


Anzeichen auf ein nicht initialisirtes Display

von tsaG (Gast)


Lesenswert?

>Atmega 32, Standardansteuerung PORT C.

Da kann auch das JTAG Fuse dazwischenfunken. Ist das aktiviert sind 
einige Pins an PORTC für JTAG "reserviert" Ich glaube PC2-PC5

von Sönke O. (soenio)


Lesenswert?

Ja denke auch das es nicht richtig Initialisiert ist. DB0 - DB 3 kann 
man/sollte man offen lassen wenn man im 4Bit Modus arbeitet. Bei welcher 
Spannung wird das teil betrieben, wenn diese zu niedrig ist muss man die 
dem LCD Display immer länger zeit geben.

von Falk B. (falk)


Lesenswert?

@  Dietmar P. (dietmar2)

>      Bild1.png

Hast du Windpocken? In deinem Schaltplan sind zuviele Punkte. Die 
gehören nur an Stellen, wo sich mehr als zwei Leitungen treffen, Eagle 
setzt die meist schon automatisch.

DB0..3 MÜSSEN im 4-Bit Modus offen bleiben.

MFG
Falk

von Dietmar P. (dietmar2)


Lesenswert?

Danke mal für Eure Antworten.

Vorab bitte ich um Nachsicht, bin noch Anfänger.

Also der Reihe nach:

- Was bedeutet "nicht initialisiert" und initialisiert man?

- Das mit dem JTAG an PC2-PC5 kann hinkommen. Mit einem Testprogrämmchen
  war ich nicht in der Lage die Pins auf low zu setzen.
  Habe auch schon temp. Abschalten mit 2 x MCUCSR |= (1<<JTD);
  leider auch keine Änderung.

- Das Display wird mit 5V betrieben.
- Die Leiterbahn für DB0 - 3 einfach einmal kappen?

- Punkte im Eagle zu setzen habe ich mir angewöhnt, weil manchmal
  keine Verbindung auf der Platine hergestellt wird.

von Falk B. (falk)


Lesenswert?

@  Dietmar P. (dietmar2)

>Vorab bitte ich um Nachsicht, bin noch Anfänger.

Auf ihn mit Gebrüll!

;-)

>- Was bedeutet "nicht initialisiert" und initialisiert man?

Man muss spezielle Kommandos an das LCD schicken, bevor man mit ihm 
arbeiten kann. Steht im Datenblatt und tausenden Websites.

http://www.mikrocontroller.net/articles/AVR-Tutorial:_LCD

>- Das mit dem JTAG an PC2-PC5 kann hinkommen. Mit einem Testprogrämmchen
>  war ich nicht in der Lage die Pins auf low zu setzen.
>  Habe auch schon temp. Abschalten mit 2 x MCUCSR |= (1<<JTD);
>  leider auch keine Änderung.

Muss aber gehen.

>- Das Display wird mit 5V betrieben.

Gut.

>- Die Leiterbahn für DB0 - 3 einfach einmal kappen?

Ja.

>- Punkte im Eagle zu setzen habe ich mir angewöhnt, weil manchmal
>  keine Verbindung auf der Platine hergestellt wird.

Ist trotzdem Unsinn und nervt. Wenn man ein Leiterbahn an einem Pin 
beginnt oder beendet, wird das Pin automatisch angeshlossen. Wenn man 
prüfen will, ob an einem Bauteil alle Pins angeschlossen sind, clickt 
man es mit MOSVE an und verschiebt es leicht. Denn sieht man die 
Gummibänder. Das kann man einfach mit der ESC Taste abbrechen.

MFG
Falk

von Karl H. (kbuchegg)


Lesenswert?

Dietmar P. schrieb:
>
> - Was bedeutet "nicht initialisiert" und initialisiert man?

Auch das LCd benötigt eine Initialisierungssequenz
* wie ist die Übertragung; 4Bit - 8Bit
* Zeichengröße etc.
* ...
letzten Endes ist auf dem LCD auch nichts anderes als ein spezieller µC, 
der erst mal seine Grundkonfiguration wissen will
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung

> - Das mit dem JTAG an PC2-PC5 kann hinkommen. Mit einem Testprogrämmchen
>   war ich nicht in der Lage die Pins auf low zu setzen.
>   Habe auch schon temp. Abschalten mit 2 x MCUCSR |= (1<<JTD);
>   leider auch keine Änderung.

Schalt die Fuse ab.
Wenn du keinen JTAG Adapter hast, kommt die dir immer nur in die Quere.

> - Das Display wird mit 5V betrieben.
> - Die Leiterbahn für DB0 - 3 einfach einmal kappen?

Ja

> - Punkte im Eagle zu setzen habe ich mir angewöhnt, weil manchmal
>   keine Verbindung auf der Platine hergestellt wird.

Dann solltest du dir angewöhnen, die grünen Linien immer bis auf den Pin 
zu ziehen. Bringt auf Dauer mehr, als diese Punktorgie. Zur Kontrolle 
einfach mal ein IC im Schaltplan aufnehmen und ein wenig hin und her 
fahren. Alle grünen Linien, die stehen bleiben sind nicht richtig 
angeschlossen.

von tsaG (Gast)


Angehängte Dateien:

Lesenswert?

Hast du schona mal ein Display an einem µC betrieben? ohne SPI, wenn 
nein würde ich damit mal anfangen.

>DB0..3 MÜSSEN im 4-Bit Modus offen bleiben.
Ich leg die immer auf Masse, funktionert problemlos.

JTAG deaktivieren: Markierte Fuse im Anhang im AVR Studio löschen

von Uwe (Gast)


Lesenswert?

Hi!
>DB0..3 MÜSSEN im 4-Bit Modus offen bleiben.
Kann mir mal jemand zeigen in welchem Datenblatt das steht, in meinen 
jedenfalls nicht. Persöhnlich halte ich das für ein Gerücht, lasse mich 
allerdigs gerne belehren, dann aber bitte kein blabla sondern schwarz 
auf weiss.

schönen Abend noch, Uwe

von MagIO (Gast)


Lesenswert?

Wie man das initialisiert findest Du im Datenblatt des Displays 
beschrieben. Nach dem Reset muss man da bestimmte Nibbels schicken und 
verschiedene Wartezeiten müssen eingehalten werden.

Vorgehensweise zum Daten rüberschicken ist klar, oder? Erst ins 
Schieberegister reinschieben, dann E kurz aktivieren ( war das high oder 
low activ? - habs vergessen), E wieder deaktivieren und nächsten Nibbel 
schieben.
Wird E nicht richtig gehandhabt, dann hast Du ständig resets.

von spess53 (Gast)


Lesenswert?

Hi

>Kann mir mal jemand zeigen in welchem Datenblatt das steht, in meinen
>jedenfalls nicht. Persöhnlich halte ich das für ein Gerücht, lasse mich
>allerdigs gerne belehren, dann aber bitte kein blabla sondern schwarz
>auf weiss.

Zumindest der der Urvater, der HD44780, hat interne Pull-Ups. In meinem 
Datenblatt S.221. Einen Reim darauf kannst du dir selbst machen.

MfG Spess

von bix (Gast)


Lesenswert?

Du brauchst ein Schieberegister mit einem Ausgangs-Buffer.

Bei dem '164 wird offensichtlich jedes Bit seriell direkt an den 
Ausgängen ausgegeben.
Damit kannst Du ein Lauflicht bauen, aber keinen seriell zu parallel 
Wandler, den Du benötigst.

Oder habe ich etwas übersehen?

von bix (Gast)


Lesenswert?

Hab gerade mal im Datenblatt nachgesehen:

http://www.nxp.com/documents/data_sheet/74HC_HCT164.pdf

Das '164 ist für Deine Anwendung völlig ungeeignet. Die seriellen Bits 
laufen am Ausgang wie bei einem Lauflicht durch.

Ein '595 würde gehen.

von Uwe (Gast)


Lesenswert?

Hi!
@Spess
>Zumindest der der Urvater, der HD44780, hat interne Pull-Ups. In meinem
>Datenblatt S.221. Einen Reim darauf kannst du dir selbst machen.
mache ich, wenn nicht auf GND gelegt bekommst du kein 2 zeiliges Init 
hin weil Eingänge als High gelesen werden und F=H=5x10 Dots kein 
zweizeilig zulässt. Pull Down hätte Sinn gemacht.
SET
FUNCTION
L L L L H DL N F X X 42ms
DL: H 8 bits interface; L 4 bits interface
N: H 2 line display; L 1 line display
F:H 5 X 10 dots; L 5 X 7 dots

schönen Abend noch, Uwe

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Das '164 ist für Deine Anwendung völlig ungeeignet.
> Die seriellen Bits laufen am Ausgang wie bei einem Lauflicht durch.
Macht doch nichts.
Interessant wirds ja erst, wenn der Enable Impuls kommt.

>>> DB0..3 MÜSSEN im 4-Bit Modus offen bleiben.
Sowas gibts bei mir nicht.
Mit offenen unbenutzten Busleitungen gibts jedesmal Scherereien bei der 
EMV-Burst-Prüfung...   :-/

von bix (Gast)


Lesenswert?

Lothar Miller schrieb:
>> Das '164 ist für Deine Anwendung völlig ungeeignet.
>> Die seriellen Bits laufen am Ausgang wie bei einem Lauflicht durch.
> Macht doch nichts.
> Interessant wirds ja erst, wenn der Enable Impuls kommt.

Sehe gerade, dass der EN nicht über den 164 läuft. Stimmt, dann geht's.

von Dietmar P. (dietmar2)


Lesenswert?

Hallo,

danke für die rege Diskussion.

Werde das alles einmal moreg verdauen.

Noch 'nen schönen Abend.

Gruß
Dietmar

von Dietmar P. (dietmar2)


Lesenswert?

Hallo,

bin ein Schritt weiter.

JTAG temp. ausgeschaltet, hat funktioniert.

DB0 - 3 waren auf GND, Leiterbahn unterbrochen, jetzt erhalte ich eine 
Anzeige von Zeichen.

Nächstes Problem: Die Zeichen sind nicht lesbar, das sind irgendwelche 
Punktkombinationen. Habe mir mal im Datenblatt die "Standard Pattern" 
angesehen. So besteht offenbar ein "A" aus den "upper 4 bit" 0100 und 
den "lower 4 bit" 0001. Soweit verstanden.
Entsteht das Zeichen jetzt durch senden der 2 x 4 Bits an den Controller 
des Displays? Wenn ja, dann haut da was in meiner Schaltung mit dem 
Senden bzw. der Reihenfolge nicht hin.

Wieder ein paar Tipps parat? Danke im Voraus.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Entsteht das Zeichen jetzt durch senden der 2 x 4 Bits an den Controller
Ja, du mußt erst das high-Nibble und dann das low-Nibble senden.
Denn sonst könntest du ja nur 16 Zeichen darstellen...

von Dietmar P. (dietmar2)


Lesenswert?

OK, soweit klar.

Wie entstehen aber nun die 2 x 4 Bits z.B. für den Buchstaben A. Im 
Datenblatt stehen die ganzen Kombinationen, aber wie erfolgt die 
Umsetzung. Ich könnte mir vorstellen über eine Tabelle, die finde ich 
aber in der Software nicht.
Da stehe ich noch auf dem Schlauch und um weitere Hilfe.

von Klaus W. (mfgkw)


Lesenswert?

Im Datenblatt vom LCD steht doch der Zeichensatz; z.B. 64 bzw. 0x41 für 
ein 'A'.
Das macht dann 4 Bits mit 0x4 (binär 0100) und vier mit 0x1 (0001).

von spess53 (Gast)


Lesenswert?

Hi

Wie sieht denn deine Ausgaberoutine aus. Übrigens, das es an PortC nicht 
funktioniert, liegt mit grosser Sicherheit an der JTAG-Fuse.

MfG Spess

von Dietmar P. (dietmar2)


Lesenswert?

Auf die Gefahr hin, dass ich als blöd dastehe, aber .........

Das mit der Zeichen-Kombination habe ich schon verstanden.
Mir fehlt der Zwischenschritt. Ich habe im Programm eine Text-Variable 
mit
dem Zeichen A, wie komme ich jetzt zu der Bit- bzw. Hex-Kombination, mit 
einer Rechenroutine, aber wie, oder muss ich im Programm alle Strings 
die ich auf dem Display ausgeben will in der Bit-Kombination 
programmieren.

Ich frage auch deshalb, weil die U.-Radig Software im main.c folgendes 
stehen hat:

  lcd_print(0,0,"HALLO!"); // Zeile 1
  lcd_print(1,0,"2 TEST!"); // Zeile 2

Davor gibt es zwar ein lcd-init, etc., aber ich kann die Routine  nicht 
entdecken. die aus dem HALLO die Bit-Kombination macht.

von Klaus (Gast)


Lesenswert?

@Dietmar

>Wie entstehen aber nun die 2 x 4 Bits z.B. für den Buchstaben A?

Gaaanz einfach!
Der Buchstabe A hat den Hexwert  0x41 und steht nun im Akku!
Den wert auf den Stack ablegen.
Den Akkuinhalt musst mit 0xF0 verunden und mit SWAP high/lowbyte 
vertauschen oder alternativ rechts schieben so dass 0x04 im akku steht.
den sendest dann zum LCD.
Als nächstes holst den Stackwert wieder in den Akku und verundest mit 
0x0F
so das jetzt im Akku 0x01 steht und sendest es zum LCD.

Jetzt hast du ein Byte gesendet.

Wenn ich das richtig sehe musst du zusätzlich dein zu sendentes Byte 
jedesmal einmal nach links schieben damit es an der richtigen stelle im 
Schieberegister landet.

Ich hoffe geholfen zu haben.

von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Hallöchen..

So hab ich das Display angeschlossen und es funktioniert.

Hier noch der Link zur Projektseite: 
http://www.cczwei-forum.de/cc2/thread.php?postid=24510#post24510

Gruß Rolf

von Dietmar P. (dietmar2)


Lesenswert?

OK, danke.

Dann muss das doch gehen, verflixt noch mal!

Also weiter basteln, verschiebe es aber auf morgen, habe schon ganz 
eckige Augen.
Schönes Wochenende!

Gruß
Dietmar

von Stephan H. (stephan-)


Lesenswert?

Dietmar P. schrieb:
> Auf die Gefahr hin, dass ich als blöd dastehe, aber .........
>
> Das mit der Zeichen-Kombination habe ich schon verstanden.
> Mir fehlt der Zwischenschritt. Ich habe im Programm eine Text-Variable
> mit
> dem Zeichen A, wie komme ich jetzt zu der Bit- bzw. Hex-Kombination, mit
> einer Rechenroutine, aber wie, oder muss ich im Programm alle Strings
> die ich auf dem Display ausgeben will in der Bit-Kombination
> programmieren.

tja und genau da liegt eben der Unterschied zwischen einem C 
Programmierer und einem ASM Programmierer. ASM setzt ZWINGEND ein 
Hardwareverständnis voraus. Wir müssen jedes Bit und Byte mit Vornamen 
kennen. Bei C ist das eben nicht der Fall. Deshalb tun sich auch viele C 
Programmierer mit ganz simplen Zusammenhängen sehr schwer (so wie ich 
mit C ). Aber das kommt mit der Zeit. Und vielleicht kann auch ich 
irgendwann mal C wenigstens richtig lesen.

Gruß

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.