Bits an LCD übertragen

OP #1707185
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
OP #1707216
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.
#1707223
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.
OP #1707232
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
#1707238
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)
#1707252
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
#1707284
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)
#1707390
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren