LCD defekt oder falsche einstellung?

Senpai

Mitglied
14. Mai 2012
143
0
16
Sprachen
  1. Assembler
Hallo,
ich wollte mich jetzt mal mit LCD´s beschäftigen und mir mir zum ausprobieren dieses

http://www.reichelt.de/Hintergrund-...8AAAIAACHcUzAea7f36494b30fd26002756bcc4fbbc11

von Reichelt bestellt.

Hier das Datenblatt:

www.reichelt.de/index.html?;ACTION=...8AAAIAACHcUzAea7f36494b30fd26002756bcc4fbbc11

Ich habe es auch schon dazu bekommen zeichen anzuzeigen und das tut es auch so wie es soll.
Es lässt sich nur beim besten willen der Kontrast nicht einstellen.
an pin 3 habe ich es schon mit einem poti und verschiedenen Spannungsteilervariationen versucht doch es ändert sich immer nur der Kontrast
von einer Zeile und die andere bleibt weiß.

DSCF7050[1].jpg

Kann es sein das die Kontrasteinstellung von einer der Controllereinstellungen zusammenhängt oder ist das Display bereits Kaputt?

hier noch der Assemblercode:
Code:
 rjmp init


 init:

 ;Stackpointer initialisieren
 ldi r16,high(ramend)
 out sph,r16
 ldi r16,low(ramend)
 out spl,r16

ldi r16,0b11111111
out ddrd,r16
ldi r16,0b00110000
out ddrc,r16

rcall initlcd
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

main:
sbi portc,5  ;RS=1 gesendete Daten werden auf dem Bildschirm ausgegeben

rcall wait

ldi r16,'I'
out portd,r16

cbi portc,4  ;enable=0

rcall wait

sbi portc,4

rjmp main




;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

wait:
ldi xh,high(5000)
ldi xl,low(5000)
loop:
sbiw xl,1
brne loop
ret
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

initlcd:
rcall wait

sbi portc,4   ;enable=1
cbi Portc,6   ;   R/W=0 Daten können an Displaygesendet werden
cbi portc,5   ;    RS=0 gesendete Daten sind Kommandobefehle

ldi r16,0b00111000  ;8-bitmodus /2-zeiliges Display /5x7Font
out portd,r16

rcall wait

cbi portc,7  ;enable=0

rcall wait

ldi r16,0b00001111  ;Display ein /Cursor ein /Cursor blinken
out portd,r16

rcall wait

cbi portc,4  ;enable=0

rcall wait

sbi portc,4  ;enable=1

ldi r16,0b00000001  ;Lösche Display und setze Cursor an Homeposition
out portd,r16

rcall wait

cbi portc,4  ;enable=0

rcall wait

sbi portc,4  ;enable=1

ldi r16,0b00000110  ;Cursoradresse nach Datensendung automatisch inkrementieren
out portd,r16

rcall wait

cbi portc,4  ;enable=0

rcall wait

sbi portc,4  ;enable=1
ret
 
Hallo Senpai!

Ich denke nicht, dass es an deinem Programmcode liegt (auch wenn ich kein ASM kann).

Der Kontrast ist eine rein "manuelle" Geschichte und wird nicht vom Programm beeinflusst.
Im Datenblatt steht allerdings, dass die Spannung am Kontrastpin (VEE) zwischen 0 bis 0,5V liegen soll.
Das ist schon ein ziemlich enger Bereich, den du über einen Festwiderstand und einem Poti (regelbarer Spannungsteiler) realisieren musst.

Außerdem wird der Kontrast von der Stärke der Hintergrundbeleuchtung "beeinflusst".
Je heller die Beleuchtung ist, desto mehr Kontrast benötigst du..... und je kleiner wird dein "Regelbereich".


Grüße,
Cassio
 
Das dachte ich mir fast.

Das mit den 0,5 V hatte ich beachtet.
ich hatte erst den Pin direkt auf GND gelegt. Und hatte nur Weiße Balken,danach habe ich einen Spannungsteiler mit einem 4,7K widerstand
und einem 470OhmPoti aufgebaut.
Es verändert sich aber nur die Zeile die auf dem Foto dunkler zu sehen ist.

also ist das Din warscheinlich im Eimer?
 
Hallo!

Hm.... also wenn du das Display nicht (oder nicht richtig) initialisierst dann ist es durchaus normal, dass du nur bei einer Zeile den Kontrast einstellen kannst.

Wenn du an einem Display also nur GND, Vcc und VEE (über Poti) anschließt und sonst nichts, dann müsstest du bei einer Zeile den Kontrast "regeln" können (alle Pixel hell, oder keine sichtbar).

Vielleicht stimmt dein INIT für den 8bit Mode ja doch nicht?
Da müssen dann aber die ASM-Spezi`s wie LotadaC, Oldmax, Dirk, Dino usw. mal ran. :wink:


Grüße,
Cassio
 
Hallo!

Nur mal eine Frage zum Verständnis.....

Ist diese Zeile hier richtig?
Code:
rcall wait

[B]cbi portc,[COLOR="#FF0000"]7[/COLOR]  ;enable=0[/B]

rcall wait


Sonst ist es doch immer:
Code:
[B]cbi portc,[COLOR="#FF0000"]4[/COLOR]  ;enable=0[/B]


Grüße,
Cassio
 
nein ist es nicht
da muss ich mich vertippt haben das habe ich gar nicht gesehen
das überprüfe ich gleich:D
 
...und?

Hat es etwas gebracht? :hmmmm:


Grüße,
Cassio
 
Ja der Kontrast lässt sich jetzt sauber einstellen
dafür sehe ich keine Buchstaben mehr irgendwo habe ich da noch den Wurm drin:banghead:
 
Hallo!

Tja, dann musst du wohl doch auf die ASM-Spezi`s warten. :wink:

Klingt für mich so als wäre das INIT nun OK, aber die Datenausgabe nicht.


Grüße,
Cassio
 
Ja aber das Komische ist ja das ich vorher auch durch den schlechten Kontrast den cursor und den Wandernden Buchstaben erkennen:stupido3:

naja ich versuch noch ein wenig vielleicht steig ich ja selber hinter
 
Hallo Senpai,

pruef einmal die Initialisierung von DDRC. Pin 6 und 7 müssen als Ausgang geschaltet werden.
 
Sicher?
Welche der Steuerleitungen ist denn nun wo angeschlossen?
enable an C4? (->Cassio)
RS an C5?
R/W an C6?
C7 ist frei?

Es sollen doch die Verwendeten Leitungen Ausgang werden, oder?
nebenbei: Warum verwendest Du nicht Namen für die so genutzten Ports (zB Dataport, Commandport oder so), vor allem aber für die Bits (enable, RS, RW) ?
Dann sollte das ganze wesentlich übersichtlicher werden, und einige der Fehler nahezu ausschließen...

(zum auslesen von Displaydaten (R/W=1) muß der Datenport dann als Eingang und Tristate gesetzt werden, oder? (falls man das mal vorhat)
 
Hallo zusammen!

Sicher?
Welche der Steuerleitungen ist denn nun wo angeschlossen?

Es ist eigentlich beschrieben, wo die Signale liegen.

Bei Enable wird einmal PC4 und dann PC7 verwendet (hat bereits Cassio schon erwähnt).

Dann ist noch ein Fehler bei der Initialisierung des DataDirectionRegisters DDRC für die Steuersignale. Hier sind nur zwei Ausgänge gewählt:

Code:
ldi r16,0b00110000
out ddrc,r16

Es kann also deswegen schon nicht funktionieren.

Möglicherweise ist noch irgendwo ein Fehler (ggf. zweimal initialisieren, wie es Pirx erwähnt hat), das mit den Steuersignalen ist aber ein grundsätzlicher Fehler, den müsste man erst mal beheben.

Dirk :ciao:
 
Das mit Pin 6 und 7 war gestern falsch eingetragen ,da ich sie sowiso nich nutzen kann.
Habe hier nämlich einen mega8

habe hier mal den aktuellen code.

Code:
 ;PD7----->DB7     ;PC4----->Enable  ;Bei Fallender Flanke liest der LCD die Daten
 ;PD6----->DB6     ;PC5----->RS 0=Kommando senden 1=Daten senden
 ;PD5----->DB5     ;GND----->R/W 0=Daten an LCD-senden
 ;PD4----->DB4
 ;PD3----->DB3
 ;PD2----->DB2
 ;PD1----->DB1
 ;PD0----->DB0

 rjmp init


 init:

 ;Stackpointer initialisieren
 ldi r16,high(ramend)
 out sph,r16
 ldi r16,low(ramend)
 out spl,r16

ldi r16,0b11111111
out ddrd,r16
ldi r16,0b00110000
out ddrc,r16

rcall initlcd
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

main:
sbi portc,5  ;RS=1 gesendete Daten werden auf dem Bildschirm ausgegeben

rcall wait

ldi r16,'H'
out portd,r16

rcall wait

cbi portc,4  ;enable=0

rcall wait

sbi portc,4  ;enable=1

rjmp main




;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

wait:
ldi xh,high(15000)
ldi xl,low(15000)
loop:
sbiw xl,1
brne loop
ret
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

initlcd:
rcall wait

sbi portc,4   ;enable=1
cbi portc,5   ;RS=0 gesendete Daten sind Kommandobefehle

ldi r16,0b00111000  ;8-bitmodus /2-zeiliges Display /5x7Font
out portd,r16


cbi portc,4  ;enable=0

rcall wait

ldi r16,0b00111000  ;8-bitmodus /2-zeiliges Display /5x7Font
out portd,r16


cbi portc,4  ;enable=0

rcall wait


ldi r16,0b00001111  ;Display ein /Cursor ein /Cursor blinken
out portd,r16


cbi portc,4  ;enable=0

rcall wait


sbi portc,4  ;enable=1


ldi r16,0b00000001  ;Lösche Display und setze Cursor an Homeposition
out portd,r16


cbi portc,4  ;enable=0

rcall wait


sbi portc,4  ;enable=1

ldi r16,0b00000110  ;Cursoradresse nach Datensendung automatisch inkrementieren
out portd,r16


cbi portc,4  ;enable=0

rcall wait

sbi portc,4  ;enable=1
ret
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Den Kontrast kann ich nun sauber einstellen, deshalb gehe ich davon aus das die initialisierung klappt.


wie kann ich denn die einzelnen Ports umbenennen?
habe es mit .def probiert aber da meckert er dann
 
wie kann ich denn die einzelnen Ports umbenennen?
habe es mit .def probiert aber da meckert er dann

.def verwendest du, um Registern einen Namen zuzuweisen.

Verwende .equ

Weitere Infos findest du auch in der Assemblerhilfe vom AVR Studio bzw. vom Atmel Studio.
 
So jetzt funktionierts;)
Ich weiß nicht ob ich irgendwo noch einen fehler beim senden hatte habedas jetzt mal Zusammengefasst und jetzt geht es.

Code:
 ;PD7----->DB7     ;PC4----->Enable  ;Bei Fallender Flanke liest der LCD die Daten
 ;PD6----->DB6     ;PC5----->RS 0=Kommando senden 1=Daten senden
 ;PD5----->DB5     ;GND----->R/W 0=Daten an LCD-senden
 ;PD4----->DB4
 ;PD3----->DB3
 ;PD2----->DB2
 ;PD1----->DB1
 ;PD0----->DB0

 rjmp init

 init:

 ;Stackpointer initialisieren
 ldi r16,high(ramend)
 out sph,r16
 ldi r16,low(ramend)
 out spl,r16

ldi r16,0b11111111
out ddrd,r16
ldi r16,0b00110000
out ddrc,r16

rcall initlcd
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

main:
sbi portc,5  ;RS=1 gesendete Daten werden auf dem Bildschirm ausgegeben

rcall wait

ldi r16,'H'
out portd,r16

rcall send

rjmp main




;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

wait:
ldi xh,high(15000)
ldi xl,low(15000)
loop:
sbiw xl,1
brne loop
ret
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

initlcd:
rcall wait

sbi portc,4   ;enable=1
cbi portc,5   ;RS=0 gesendete Daten sind Kommandobefehle

rcall wait

ldi r16,0b00111000  ;8-bitmodus /2-zeiliges Display /5x7Font
out portd,r16

rcall send

ldi r16,0b00001111  ;Display ein /Cursor ein /Cursor blinken
out portd,r16

rcall send

ldi r16,0b00000001  ;Lösche Display und setze Cursor an Homeposition
out portd,r16

rcall send

ldi r16,0b00000110  ;Cursoradresse nach Datensendung automatisch inkrementieren
out portd,r16

rcall send

ret
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

send:
rcall wait
cbi PORTC,4
rcall wait
sbi Portc,4
ret
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Allerdings hat das mit dem .equ nicht funktioniert
habe es so versucht einzugeben
Code:
.equ enable=portc,4
es wird dann ein syntax error angegeben
wenn ich nur portc angebe funktioniert es
wie müsste ich es denn richtig eingeben?
 
wie müsste ich es denn richtig eingeben?

Es könnte zum Beispiel (!) so aussehen:
Code:
.equ DisplayControlPort       = PORTC
.equ DisplayControlDirection  = DDRC
.equ Display_RW         = 5
.equ Display_RS         = 6
.equ Display_CS         = 7


DisplayInit:

  ; Data Direction
  in r16, DisplayControlDirection
  ori r16, (1<<Display_RW) | (1<<Display_RS) | (1<<Display_CS)
  out DisplayControlDirection, r16

; ...

  sbi DisplayControlPort, Display_RW 
  cbi DisplayControlPort, Display_CS
  cbi DisplayControlPort, Display_RS 

; ...

ret

Das ganze könnte man auch noch auf den Datenbereich, nicht nur auf den Controlbereich erweitern. Oben das ist nur ein Beispiel, es gibt hier unterschiedliche Ansätze, man könnte beim Datenbereich auch noch High/Low Nibble berücksichtigen, wenn man 4bit Modus hat, oder auch alles noch in Macros verpacken. Das ganze ist natürlich kein MUSS, wenn du das aber so machst, wird der Programmcode besser wartbarer und du kannst ihn schneller in anderen Projekten/Controllern verwenden.
 
Ah sehr interressant, wieder was gelernt ;)

Vielen dank für eure hilfe
 
Hallo,

sieh mal im Projekt-Bereich nach. Dort findest du von mir einen "TWI / 1-Wire - Analyzer". Den Anfang habe ich komplett in Assembler gemacht. Da drin sind auch komplette Steuerroutinen für die 4Bit-Ansteuerung.

Gruß
Dino
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)