Forum: Mikrocontroller und Digitale Elektronik LCD kann nur Kontrast einstellen


von Cyberfoxx (Gast)


Angehängte Dateien:

Lesenswert?

Hallo!
Ich hatte vor kurzem schon einmal auf der Seite 
Beitrag "LCD-Display Ansteuern mit ATmega2561 funktioniert nicht" berichtet, dass ich versuche 
ein LCD-Display anzusteuern. Da dies nicht funktionierte, (auch nachdem 
ich das Tutorial durchging) hatte ich mir gedacht, dass das Display 
defekt ist. Somti habe ich dieses Ausgebaut und mit einem Display Namens 
"CP5 94V-0 KW" ersetzt. Nun funktioniert das Display allerdings 
immernoch nicht und ich weiß nicht woran es liegen kann. Wenn ich das 
Poti (das ich zuum Kontrast einstellen eingebaut habe) drehe, ändert 
sich nur der Kontrast von der ersten und der zweiten Spalte. Beim 
Vorhergehenden Display (welches nur ein zweireihiges war) änderte sich 
überhaupt nur die erste Zeile. Wisst ihr woran das liegen könnte?
danke Cyberfoxx

PS: im Anhang noch meine Header-Datei
Ich habe auch gelesen dass die Display-Pins 7-10 mit den Pins 11-14 
verbunden weden müssen. Ist das wahr?

von Cyberfoxx (Gast)


Lesenswert?

Hi!
also weiß keine eine Begründung? Wie bereits im anderen Beitrag 
beschrieben, wird ein ATmega2561 verwendet und die Pins für das Display 
für den 4-bit Betrieb sind PE4-PE7. Und die Pind R/S und Enable sind auf 
PG0 und PG2. Dies habe ich alles in der lcd_routines.h umgestellt. Was 
mich allerdings verwundert ist, wo wird der R/W-Pin (PG1) definiert? 
oder kann dieser Pin einfach auf low gesetzt werden (0... Write)
lg Cyberfoxx

von holger (Gast)


Lesenswert?

>wo wird der R/W-Pin (PG1) definiert?

Nirgends.

>oder kann dieser Pin einfach auf low gesetzt werden (0... Write)

Bingo!

von Tobi L. (derarzt)


Lesenswert?

> oder kann dieser Pin einfach auf low gesetzt werden (0... Write)
> lg Cyberfoxx

es ist klar dass du nichts siehst weil das display im undef. zustand ist 
bzw ich denke mal default. mäßig vll sogar auf lesen(also high) gestellt 
ist du musst ihn explizit auf low ziehen  um drauf schreieben zu können 
stand aber meine ich auch im tut

von Cyberfoxx (Gast)


Lesenswert?

OK, Danke. Muss ich wohl im tum überlesen haben. Werds gleich mal 
ausprobieren

von cyberfoxx (Gast)


Lesenswert?

Hat leider auch nichts genützt. Ist es wahr dass die Pins 7-10 mit den 
Pins 11-14 hardwaremäßig verbunden weden müssen?

von Jochen (Gast)


Lesenswert?

Hallo,
Pin 7 - 10 bleiben frei 11 - 14 sind die Datenleitungen und werden mit 
dem
Atmega verbunden. R/W auf Masse.
Gilt aber nur bei einer Standardbelegung des Display.

von cyberfoxx (Gast)


Lesenswert?

Habe mit dem Oszi nachgemessen. Die Pins 2(Vdd),4(RS),7-10 und 13 waren 
bei mir dauerhaft auf High, der Rest auf Low (abgesehen von Pin 3--> 
Spannung von Poti für Kontrast).
Habe nun die Leitung zu den Pins 7-10 abgezwickt, hat aber auch nichts 
genützt.
Sollte sich der Pegel auf den Pins 11-14 und der Pin 4 sich nicht 
durchgehend wechseln?
In meiner main-Schleife steht:
1
lcd_setcursor( 0, 0 );
2
_delay_ms(18);
3
lcd_data('T');

von cyberfoxx (Gast)


Lesenswert?

Richtigstellung:
auf Pin 13 ist ein Puls-Muster zu erkennen (meist 5 Pulse dann Pause). 
Die Pegel von 7-10 sind immernoch high.

von Jochen (Gast)


Lesenswert?

Hallo,
wie schon gesagt, Pin 7 - 10 am Display bleiben frei. Du willst ja nur 
eine
4 Bit - Ansteuerung machen.
Überprüfe deine Änderungen in der LCD-Routines.h. Du hast zwar deine 
vermeintlichen Anpassungen vorgenommen, aber die Kommentare nicht 
geändert.
Ist dadurch unübersichtlich für jemanden der sich ansonsten mit PICs
beschäftigt. Ich meine damit mich.

von Cyberfoxx (Gast)


Angehängte Dateien:

Lesenswert?

Hi!
Die 4 Leitungen sind bereits entfernt. Und anbei die Datei mit den 
geänderten Kommentaren.
Handelt sich nur um die Zeilen
1
#define LCD_PORT      PORTE
2
#define LCD_DDR       DDRE
3
 
4
// 4 Bit LCD Datenbus DB4-DB7, das unterste Bit DB4 kann auf den Portbits 0..4 liegen
5
 
6
//  LCD DB4-DB7 <-->  PORTC Bit PE4-PE7
7
#define LCD_DB        PE4
8
 
9
// LCD Steuersignale RS und EN
10
 
11
//  LCD RS      <-->  PORTC Bit PG0     (RS: 0=Data, 1=Command)
12
#define LCD_RS        PG0
13
 
14
//  LCD EN      <-->  PORTC Bit PG2     (EN: 1-Impuls für Daten)
15
#define LCD_EN        PG2

von Markus (Gast)


Lesenswert?

So wie der Code jetzt ist, müssen RS und EN mit am gleichen PORT wie die 
Datenports hängen, also bei Dir PORTE. Sonst müsstest du die PORTx und 
DDRx Angaben in lcd-routines.c an den entsprechenden Stellen ändern!

Gruß,
Markus

von Cyberfoxx (Gast)


Lesenswert?

Danke! Werde diese Anpassungen gleich mals machen.
Noch eine Frage für mein Verständniss:
Bedeutet das, dass für den µC egal ist ob PA0, PB0, PC0 etc. im Code 
steht und für ihn das alles 0x00 bedeutet (und PA1, PB1 usw. 0x01)???

-->
Px0: 0x00
Px1: 0x01
Px2: 0x02
Px3: 0x04
Px4: 0x08
usw.?

von Cyberfoxx (Gast)


Lesenswert?

Juhu!!! Danke! an dem ist es gelegen. Nun funktioniert es wie es soll.

von Markus (Gast)


Lesenswert?

Cyberfoxx schrieb
> Bedeutet das, dass für den µC egal ist ob PA0, PB0, PC0 etc. im Code
> steht und für ihn das alles 0x00 bedeutet (und PA1, PB1 usw. 0x01)???
Jep, für den Compiler ist das nur 'ne Zahl, genauso wie du das schon 
erkannt hast. Das soll den Code eigentlich übersichtlicher machen, aber 
impliziert halt möglicherweise wie in Deinem Fall etwas Anderes.

PORTE = (1<<PA0)

ist technisch das Gleiche wie

PORTE = (1<<PE0)

da PE0 = PA0 = 0

von Cyberfoxx (Gast)


Lesenswert?

Verstehe... Nun ja man lernt nie aus. Danke

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.