Forum: Mikrocontroller und Digitale Elektronik Bits an LCD übertragen


von Dennis B. (danrulz81)


Lesenswert?

Hallo zusammen,

ich würde gerne folgendes Byte an mein LCD senden:
1
PORTD = &b01010000

Da ich aber nur PORT D.0 bis D.3 verwende, da ich es im 4 Bit Modus 
betreiben will, wie muss ich dass Byte dann zerlegen?
Erst das ober Nibble(0101) und dann das untere(0000), oder andersrum?

btw.: Meine Daten
µC = ATmega 8515L
LCD = AV1624
Bascom

von Karl H. (kbuchegg)


Lesenswert?

Erst oben, dann unten

von Joachim (Gast)


Lesenswert?

Hallo

Was sagt denn das Datenblatt des LCD dazu?

Gruß
Joachim

von Joachim (Gast)


Lesenswert?

Z.B.:

http://elektronik.kai-uwe-schmidt.de/projekte/datasheet/lcd.pdf
Aber nachlesen mußte selber.

Nochmal Gruß
Joachim

von Dennis B. (danrulz81)


Lesenswert?

Hab ich schon. Dort wird beschrieben, dass das untere Nibble im 4 Bit 
Modus irrelevant ist. Meine Init-Routine sieht momentan so aus:
1
Waitms 500
2
 Config Portd = Output
3
 'Portd = &B00100000
4
 Portd = &B00100000
5
 Portd = &B10000000
6
 Waitms 10
7
 Portd = &B00000000
8
 Portd = &B11000000
9
 Waitms 10
10
 Portd = &B00000000
11
 Portd = &B00010000
12
 Waitms 30
13
 Portd = &B00000000
14
 Portd = &B01100000
15
 Waitms 500

Mir ist jetzt aber aufgefallen, dass ich ja nicht alle PortD Pins 
verwende, also heißt das doch: Nibbles schicken.

von Dennis B. (danrulz81)


Lesenswert?

Joachim schrieb:
> Z.B.:
>
> http://elektronik.kai-uwe-schmidt.de/projekte/datasheet/lcd.pdf
> Aber nachlesen mußte selber.
>
> Nochmal Gruß
> Joachim

Das ist schon wieder ein anderes Datenblatt. Ich hab die Routine nach 
dem Datasheet vom KS0066 geschrieben.

von Karl H. (kbuchegg)


Lesenswert?

Dennis Brenzel schrieb:
> Hab ich schon. Dort wird beschrieben, dass das untere Nibble im 4 Bit
> Modus irrelevant ist.

Moment.
Das ist aus Sicht des LCD.
Das LCD holt sich von seinen 8 Datenleitungen die Bits dann nur noch von 
den oberen 4 Leitung.
Das bedeutet für dich erst mal: Die 4 Datenleitungen, auf denen du Daten 
schickst, kommen am LCD an D4-D7

Das hat für deine Programmierung erst mal keine Bedeutung. Die 4 
angeschlossenen Leitungen musst du trotzdem mit den Nibbles in der 
Reihenfolge 'oberes Nibble' / 'unteres Nibble' (gemeint sind die Nibbles 
des zu übertragenen Datenbytes) beschicken.

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


Lesenswert?

> Da ich aber nur PORT D.0 bis D.3 verwende
Warum steuerst du dann nur die oberen Portleitungen an?

> Meine Init-Routine sieht momentan so aus:
Wo wird hier die Enable-LKeitung angesteuert?

Nur mal zur Verdeutlichung: Wie ist jetzt denn eigentlich jede Leitung 
des LCDs wo am Controller angeschlossen?

von Dennis B. (danrulz81)


Lesenswert?

Ja, aber was im unteren Nibble steht ist ja egal, also ob da &b0000 oder 
&b1111 steht.

von Karl H. (kbuchegg)


Lesenswert?

Dennis Brenzel schrieb:
> Ja, aber was im unteren Nibble steht ist ja egal, also ob da &b0000 oder
> &b1111 steht.

Das kann man so nicht sagen.
Dazu muss man wissen, wie genau deine Leitungen angeschlossen sind.

von Dennis B. (danrulz81)


Lesenswert?

Lothar Miller schrieb:
>> Da ich aber nur PORT D.0 bis D.3 verwende
> Warum steuerst du dann nur die oberen Portleitungen an?

Das ist mir ja jetzt aufgefallen.

>> Meine Init-Routine sieht momentan so aus:
> Wo wird hier die Enable-LKeitung angesteuert?

Am PD5 angeschlossen

> Nur mal zur Verdeutlichung: Wie ist jetzt denn eigentlich jede Leitung
> des LCDs wo am Controller angeschlossen?

PD.0 = DB4
PD.1 = DB5
PD.2 = DB6
PD.3 = DB7
PD.4 = RS
PD.5 = E
GND = RW, DB0 - DB3

von Karl H. (kbuchegg)


Lesenswert?

Waitms 500
 Config Portd = Output
 'Portd = &B00100000
 Portd = &B00100000
 Portd = &B10000000


Kannst du das nicht so formulieren, dass man das auch verstehen kann?

In BASCOM kann man doch jedem Bit an jedem Port mittels Alias einen 
Namen gaben. Das würde schon mal helfen, wenn da

   LCD_E = 1
bzw.
   LCD_E = 0

stehen würde, anstatt da ständig den Port komplett neu zu beschreiben 
(was wahrscheinlich sowieso falsch ist, denn dadurch veränderst du ja 
auch den Zustand der Datenleitungen)

von Dennis B. (danrulz81)


Lesenswert?

Ich muss ja die Datenleitungen immer neu Beschreiben, um dass Display zu 
initialisieren.

von Karl H. (kbuchegg)


Lesenswert?

Dennis Brenzel schrieb:
> Ich muss ja die Datenleitungen immer neu Beschreiben, um dass Display zu
> initialisieren.

Von deinem Ausgabeport

 Portd = &B00100000
 Portd = &B10000000
               ||||
               ||||
sind das hier -++++
die Datenbits, die am LCD auf den Datenleitungen D4-D7 landen.
Jetzt schau dir die geforderte Initialisierung an. Da steht sicher 
nicht, dass du lauter 0-en anlegen musst

Ich kann dir nur empfehlen, die einzelnen Leitungen am Port per Namen 
aufzudröseln. Du legst dir nur selber Fallen mit den ganzen 0-en und 
1-an die an den richtigen Bitpositionen auftauchen müssen

von Dennis B. (danrulz81)


Lesenswert?

Ja, dass ist mir ja passiert. Ich hab alles aufs obere Nibble 
geschrieben, welches ja anschlusstechnisch "in der Luft hängt".

von Karl H. (kbuchegg)


Lesenswert?

Dennis Brenzel schrieb:
> Ja, dass ist mir ja passiert. Ich hab alles aufs obere Nibble
> geschrieben, welches ja anschlusstechnisch "in der Luft hängt".

Den Satz versteh ich jetzt nicht.

Für dich ist doch nur relevant, welche Leitung vom LCD wo in deinem Port 
auftaucht.

Sobald dir das klar ist

     7   6   5   4   3   2   1   0
   +---+---+---+---+---+---+---+---+
   |   |   | E | RS| D7| D6| D5| D4|
   +---+---+---+---+---+---+---+---+

ist auch klar, welches Bit im Port in welcher Reihenfolge welchen Pegel 
einnehmen muss

 Portd = &B00000011        eine 3 an die Datenpins, E auf Low
 Portd = &B00100011        weiterhin die 3 an den Datenpins, E auf High
 Portd = &B00000011        die 3 bleiben, aber E geht wieder auf Low


Damit hast du:
An den Datenpins lag die ganze Zeit eine 3 an. Aber an E wurde ein 0-1-0 
Puls erzeugt, der dafür sorgt, dass das LCD die an den Datenpins 
anstehende 3 übernimmt. RS war zum Zeitpunkt des E-Pulses die ganze Zeit 
Low -> Controlbyte, ebenso wie R/W

Das deine Datenleitungen am LCD D7-D4 sind, ist bei der Programmierung 
ziemlich irrelevant. Für dich ist nur wichtig, dass du hier ein Nibble 
aus den zu übertragenden Daten anlegen musst, und zwar in der 
Reihenfolge: zuerst High-Nibble, dann Low-Nibble. (jetzt mal von den 
ersten zu übertragenden Controlworten abgesehen, mit denen man das LCD 
in den 4-Bit Modus bringt)

von Dennis B. (danrulz81)


Lesenswert?

Ah, o.k. Das mit wusst ich auch noch nicht. Man lernt halt nie aus, wenn 
man sich mit etwas beschäftigt.

von Karl H. (kbuchegg)


Lesenswert?

Dann solltest du eventuell mal die Tutorien auf dieser Seite studieren. 
Die sind zwar für Assembler bzw. C gedacht, aber die zugrundeliegenden 
Prinzipien sind überall gleich. Ob man einen Port in Assembler, in C 
oder in BASCOM bedient, ist für das Programm nur eine syntaktische 
Feinheit. Entscheidend ist, welche Pegel die Pins am µC nacheinander 
annehmen müssen. Und das hängt nicht von der Programmiersprache ab, 
sondern von der Reihenfolge, in der die entsprechenden Aktionen gemacht 
werden.

von Dennis B. (danrulz81)


Lesenswert?

Ja, die hab ich schon durch, auch auf anderen Seiten, nur hab ich 
irgendwie immer das mit dem "E"-Bit überlesen. Peinlich peinlich.

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.