Forum: Mikrocontroller und Digitale Elektronik Fehler LCD-Display im 8Bit-Modus


von HJH-MD (Gast)


Lesenswert?

Guten Morgen,
ich finde meinen Fehler bei der Initialisierung eines LCD-Displays 
(16X2) im 8-Bit-Modus nicht.Hier mal kurz das kleine Programm:
1
$regfile = "ATtiny2313.dat"
2
$crystal = 1000000
3
4
Ddra = &B00000000
5
Ddrb = &B11111111          
6
Ddrd = &B01111111
7
8
Dim Wert As Byte
9
10
CONFIG LCDPIN = PIN , PORT=PORTB, E=Portd.6, RS=Portd.5
11
Config Lcd = 16x2           
12
13
PortD.4 =0       'RW am Display Off (nur schreiben)
14
           
15
16
'Hauptprogramm
17
'-------------
18
Waitms 200
19
Cls
20
Cursor Off
21
22
Locate 1 , 1
23
Lcd "Hallo"
24
25
Locate 2 , 1
26
Lcd "World"
27
28
Do
29
 wait 1
30
 lcd Wert
31
Loop
32
End

In der ersten Zeile wird korrekter weise "Hallo" ausgegeben und die 2. 
Zeile fehlt. Nach ca. 10 Sekunden wird die erste Zeile mit "0000.." 
überschrieben.
Ich denke ich habe das Display falsch initialisiert. Aber wo?

Danke und Gruß aus Magdeburg
H.-Jürgen

: Bearbeitet durch User
Beitrag #5269300 wurde von einem Moderator gelöscht.
von Jens N. (midibrain)


Lesenswert?

HJH-MD schrieb:
> Ich denke ich habe das Display falsch initialisiert. Aber wo?

Ja wo denn nur??
Kann in Deinem Post nirgendwo eine Initialisierung sehen.

Jens

von HJH-MD (Gast)


Lesenswert?

Oh! Vielleicht hätte ich besser Configurieren geschrieben. Vielleicht 
ist das mein Fehler!
Jürgen

von HJH Leera (Gast)


Lesenswert?

HJH-MD schrieb:
> Vielleicht ist das mein Fehler!

Nö, dein Fehler ist dass du gar nichts verstanden hast.

Das Mindeste wäre dass du dein komplettes Programm
zeigst, auch wenn du nichts verstanden hast.

von HJH-MD (Gast)


Lesenswert?

Das ist das koplette Programm!
Heißt es nicht: Erst lesen dann posten?
Jürgen

von LCD (Gast)


Lesenswert?

Auch selber mal lesen:

If you do not connect the WR pin to ground but to a pin, and you do not 
specify the WR pin, but you set the logic level to 0 in your code, you 
have to use an INITLCD command after you have set the WR pin to 0.

von Dieter F. (Gast)


Lesenswert?

HJH-MD schrieb:
> Locate 2 , 1

Wenn Du in die 2. Zeile schreiben willst, dann solltest Du das auch so 
angeben (Spalte, Zeile - nicht Zeile, Spalte)

von HJH-MD (Gast)


Lesenswert?

Danke LCD! Wo steht denn so etwas? Nehme dann mal den WR-Pin als Eingang 
und löte mal eine Strippe zur Masse.
Melde mich  -  Jürgen

von HJH-MD (Gast)


Lesenswert?

Nö. Geht trotzdem nicht. Suche weiter ....
Jürgen

von LCD (Gast)


Lesenswert?

HJH-MD schrieb:
> Wo steht denn so etwas?

Steht so in der Bascom-Hilfe.

Schreib doch mal ein
Initlcd
vor dein Hauptprogramm.
Evtl. gefolgt von einem
waitms 100

von LCD (Gast)


Lesenswert?

Korrektur: Das waitms 100 kannste weglassen, das HP beginnt ja schon mit 
einer Pause.

von Dieter F. (Gast)


Lesenswert?

Ich kann es Dir nochmal schreiben:

Dein "Locate" für die 2. Zeile ist falsch. Lies mal die Hilfe dazu.

Der "lcd Wert" schreibt einfach ab der aktuellen LCD-Cursor-Position den 
Initialwert von "Wert" (= 0) bis irgendwann ...

von Homer (Gast)


Lesenswert?

Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , 
Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
Config Lcd = 20 * 2
Cursor Off

von Dieter F. (Gast)


Lesenswert?

Homer schrieb:
> Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 =
> Portc.1 ,
> Db7 = Portc.0 ...

HJH-MD schrieb:
> im 8-Bit-Modus

von LCD (Gast)


Lesenswert?

Dieter F. schrieb:
> Ich kann es Dir nochmal schreiben:
>
> Dein "Locate" für die 2. Zeile ist falsch. Lies mal die Hilfe dazu.

Aus der Bascom-Hilfe zu "Locate":

Syntax

LOCATE y , x





Remarks

X
 Constant or variable with the position. (1-64*)

Y
 Constant or variable with the line (1 - 4*)

von Dieter F. (Gast)


Lesenswert?

LCD schrieb:
> Aus der Bascom-Hilfe zu "Locate":

Oh - ich brauche wohl eine neue Brille :-/

von HJH-MD (Gast)


Lesenswert?

Nein Dieter F.! Die Anweisung mit Zeile und dann Spalte ist schon 
korrekt. Daran liegt es nicht. Und wenn dann hätte auf dem Display 
gestanden:
"HWorld". Also die erste Anweisung und dann überschrieben mit "World" in 
der ersten Zeile aber erst ab Spalte 2. Es ist aber nicht so!

von LCD (Gast)


Lesenswert?

Hast du es jetzt mal mit
Initlcd
versucht?

von HJH-MD (Gast)


Lesenswert?

Ja, hat auch nichts gebracht. Habe aber noch folgendes gefunden:
The CONFIG LCDPIN has an option to use the WR pin, and use the busy flag 
of the display. If you have enough pins, this is the best mode.
Bei mir liegt er nun fest auf Masse. Mal sehen aber heute nicht mehr.
Danke Jürgen

von Karl B. (gustav)


Lesenswert?

Hi,
es gibt noch andere Beispiele für BASCOM LCD Initialisierungen.

https://avrhelp.mcselec.com/index.html?deflcdchar.htm

Also,
die meisten Probs. entstehen (wie man nachlesen kann) anscheinend durch:
1. Portzuordnung
2. Warteschleifen
3. Gebrauch des Busy-Flags
4. Erzeugung bzw. richtiges Setzen der oft vergessenen aber notwendigen 
"Enable-Impulse"

HJH-MD schrieb:
> and use the busy flag
> of the display. If you have enough pins, this is the best mode.

Das Busyflag kann während der allerersten Befehle nicht ausgelesen und 
entsprechend nicht benutzt werden. Man braucht die "Pausen" zwischen den 
Befehlen. Dazu sind die Warteschleifen drin.

Die Libraries berücksichtigen oft nicht die "timings".
Das wäre dann Punkt 5.

Wenn -  wie in dem Thread hier - irgendetwas verschluckt oder 
überschrieben wird, liegt das nicht selten an den sog. Timing-Problemen.

Noch ein Punkt (6) wäre die falsche Deklarierung oder Vergessen des 
Speicherns von Status- und Temporärregistern.(push pop...etc.)

In ASM wird so eine Initialisierung auch schon nicht mehr absolut 
"trivial".

Aber wir reden hier ja über BASCOM. Das macht's ja (hoffentlich) schon 
von alleine ohne überflüssigen Ballast. ;-)


ciao
gustav

: Bearbeitet durch User
von HJH-MD (Gast)


Lesenswert?

Guten Morgen und danke.
Das Problem liegt immer noch daran, dass ich die 2. Zeile nicht sehe. 
Ich habe mal auf den 4Bit-Modus (den nehme ich schon die letzten Jahre 
ohne Probleme mit Bascom und versch. Controllern) umgelötet und es 
funktioniert.
Aber im 8Bit-Modus scheint das Programm korrekter weise nach der letzten 
Locate-Anweisung genau dahinter zu beginnen den "Wert" (hier = 0) 
auszugeben.
Und nach ca. 10 Sekunden durch den Wait 1 Befehl im Hauptprogramm wird 
die Zeile 1 mit den Nullen überschrieben. Ich sehe also nur die Zeile 2 
nicht.
Ich habe mich für dieses Layout entschieden, weil ich einen Code in ASM 
oder C für eine LCD-Anzeige selbst schreiben möchte ohne die Biblio von 
Bascom.
Mache dann mal weiter ...
Jürgen

von Karl B. (gustav)


Angehängte Dateien:

Lesenswert?

HJH-MD schrieb:
> Ich habe mich für dieses Layout entschieden, weil ich einen Code in ASM
> oder C für eine LCD-Anzeige selbst schreiben möchte ohne die Biblio von
> Bascom.
> Mache dann mal weiter ...

Hi @HJH,
hab'mal ein bisschen rumgebastelt.

Also, der Simulator macht's schon 'mal. (Die Zeitschleifenvariablen 
vorher anpassen.)

Viel Spaß
 Das scheint auf den ersten Blick unnötig "aufgeblasen".
Man sollte es sich zur guten Angewohnheit machen, die Interruptvektoren 
auszuformulieren, auch , wenn sie momentan garnicht gebraucht 
werden.(Das ist nämlich noch Fehlerquelle ääähm Punkt 7.)


ciao
gustav

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.