Forum: Mikrocontroller und Digitale Elektronik LCD unter Bascom ok, unter C# nee


von Biko (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

habe hier ein 4x20-LCD Typ HDM20416H, rudimentäres Datenblatt im Anhang, 
das wie im Tutorial beschrieben betrieben werden soll.
http://www.mikrocontroller.net/articles/Erweiterte_LCD-Ansteuerung

Leider zeigt das Display im Betrieb mit dem angegebenen Beispielprogramm 
mehr oder weniger wirres Zeug. In der Hauptsache scheint es so zu sein, 
dass Buchstaben ausgelassen werden und es sieht so aus, als wären es 
z.T. nach dem Neustart andere Buchstaben, die ausgelassen werden. Wenn 
das Programm Sonderzeichen anzeigt, ist mehr oder weniger nur noch Salat 
auf dem Display.

Als Hauptverdächtige kommen nach meiner Meinung eigentlich nur die 
folgenden beiden Programmteile in Frage:

1.
>>////////////////////////////////////////////////////////////////////// 
//////////
>>// Zeilendefinitionen des verwendeten LCD
>>// die Einträge hier sollten für ein LCD mit einer Zeilenlänge von 16 >>Zeichen 
passen
>>// bei anderen Zeilenlängen müssen diese Einträge angepasst werden

>#define LCD_DDADR_LINE1         0x00
>#define LCD_DDADR_LINE2         0x40
>#define LCD_DDADR_LINE3         0x10
>#define LCD_DDADR_LINE4         0x50



2.
>>////////////////////////////////////////////////////////////////////// 
//////////
>>// LCD Ausführungszeiten (MS=Millisekunden, US=Mikrosekunden)

>#ifndef LCD_TIMINGS
>#define LCD_TIMINGS

>#define LCD_BOOTUP_MS           15
>#define LCD_ENABLE_US           1
>#define LCD_WRITEDATA_US        46
>#define LCD_COMMAND_US          42

>#define LCD_SOFT_RESET_MS1      5
>#define LCD_SOFT_RESET_MS2      1
>#define LCD_SOFT_RESET_MS3      1
>#define LCD_SET_4BITMODE_MS     5

>#define LCD_CLEAR_DISPLAY_MS    2
>#define LCD_CURSOR_HOME_MS      2

>#endif // LCD_TIMINGS


Zu 1.: das verwendete LCD hat ja pro Zeile 20 Zeilen statt 16, wüßte 
aber jetzt aus dem Stehgreif nicht, was dort eingetragen werden muss

Zu 2.: da das Display Buchstaben "verschluckt", scheint die Vermutung 
naheliegend, dass irgendwas mit den vorgegebenen Ausführungszeiten zu 
schnell für das angeschlossenen Display ist. Könnte das hinkommen und 
wenn ja, welchen Parameter müßte man dann ändern?


Noch eine Anmerkung: das beschriebene Display läuft problemlos unter 
Bascom. Leider konnte ich dort nichts über die verwendeten 
Ausführungszeiten finden...

PS: Forensuche wurde auch schon konsultiert, mit vielen Treffern aber 
wenig direkten Bezügen zum vorliegenden Problem.


Jetzt also wie üblich die große Frage:

W a s   k ö n n t e   e s   s e i n ?   ö)

von g457 (Gast)


Lesenswert?

F_CPU falsch?

von Peter (Gast)


Lesenswert?

was hat das ganze mit C# zu tun?

von Biko (Gast)


Lesenswert?

g457 schrieb:
> F_CPU falsch?
negativ, F_CPU ist korrekt

Anschlussbelegung ist übrigens:
RS  PB0
En  PB1
DBs PB2-5
(also auch keine JTAG-Probleme)

von Karl H. (kbuchegg)


Lesenswert?

Biko schrieb:

> Zu 1.: das verwendete LCD hat ja pro Zeile 20 Zeilen statt 16, wüßte
> aber jetzt aus dem Stehgreif nicht, was dort eingetragen werden muss

Das ist es sicher nicht.
Wenn das ein Problem ist, dann merkst du das maximal wenn du den Cursor 
in die 2.te Zeile schickst und der ganz woanders auftaucht

> Zu 2.: da das Display Buchstaben "verschluckt", scheint die Vermutung
> naheliegend, dass irgendwas mit den vorgegebenen Ausführungszeiten zu
> schnell für das angeschlossenen Display ist. Könnte das hinkommen und
> wenn ja, welchen Parameter müßte man dann ändern?

Möglich wärs.
Du kannst ja einfach mal alle Zeiten mal 10 nehmen.
Länger darfst du die Zeiten immer machen. Nur zu kurz darfst du nicht 
werden.

von Biko (Gast)


Lesenswert?

Peter schrieb:
> was hat das ganze mit C# zu tun?

Du meinst mit der Note "cis"?

von Karl H. (kbuchegg)


Lesenswert?

Biko schrieb:
> g457 schrieb:
>> F_CPU falsch?
> negativ, F_CPU ist korrekt

Das haben schon viele gesgat und hinterher hat sich dann doch 
rausgestellt, dass sie falsch war.
Hauptproblem war dabei immer, dass nicht verstanden wurde, dass F_CPU 
informativen Charakter hat. Bei F_CPU kann ich hinschreiben was ich 
will, deswegen läuft der µC noch lange nicht mit dieser Taktfrequenz

von Biko (Gast)


Lesenswert?

Biko schrieb:
> Möglich wärs.
> Du kannst ja einfach mal alle Zeiten mal 10 nehmen.
> Länger darfst du die Zeiten immer machen. Nur zu kurz darfst du nicht
> werden.

Gute Idee, das teste ich...

von Karl H. (kbuchegg)


Lesenswert?

Biko schrieb:

> Gute Idee, das teste ich...


... und so naheliegend ....

von Biko (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> Biko schrieb:
>> g457 schrieb:
>>> F_CPU falsch?
>> negativ, F_CPU ist korrekt
>
> Das haben schon viele gesgat und hinterher hat sich dann doch
> rausgestellt, dass sie falsch war.
> Hauptproblem war dabei immer, dass nicht verstanden wurde, dass F_CPU
> informativen Charakter hat. Bei F_CPU kann ich hinschreiben was ich
> will, deswegen läuft der µC noch lange nicht mit dieser Taktfrequenz

Hm, habe die korrekte f in der entsprechenden .h-Datei eingetragen und 
gehe davon aus, dass das auch beim Compilieren so übernommen wurde. 
Werde das gleich mit untersuchen.

von Biko (Gast)


Lesenswert?

...so, folgendes Ergebnis:

-F_CPU korrekt eingestellt (per Stopuhr definiertes Delay nachgemessen, 
Gegenprobe mit Quarz anderer Frequenz ausgeführt)

-durch Verlängerung der Delay-Zeiten (Punkt 2., s.o.) um den Faktor 10 
werden jetzt alle Buchstaben korrekt dargestellt, die minimal möglichen 
Delay-Zeiten muss ich noch ermitteln.


übriggebliebenes Problem: es werden pro Zeile nur 16 Zeichen ausgenutzt, 
das führt wieder zu Punkt 1:

>>// Zeilendefinitionen des verwendeten LCD
>>// die Einträge hier sollten für ein LCD mit einer Zeilenlänge von 16 Zeichen 
>>passen
>>// bei anderen Zeilenlängen müssen diese Einträge angepasst werden

>#define LCD_DDADR_LINE1         0x00
>#define LCD_DDADR_LINE2         0x40
>#define LCD_DDADR_LINE3         0x10
>#define LCD_DDADR_LINE4         0x50

Was also jetzt hier eintragen, damit alle 20 Zeichen pro Zeile genutzt 
werden können?
(im Datenblatt steht leider nichts dazu)

von Volker Z. (vza)


Lesenswert?

Biko schrieb:
1
#define LCD_DDADR_LINE1         0x00
2
#define LCD_DDADR_LINE2         0x40
3
#define LCD_DDADR_LINE3         0x14
4
#define LCD_DDADR_LINE4         0x54

Steht im vollständigem Datenblatt.

von Biko (Gast)


Lesenswert?

Volker Zabe schrieb:
> #define LCD_DDADR_LINE1         0x00
> #define LCD_DDADR_LINE2         0x40
> #define LCD_DDADR_LINE3         0x14
> #define LCD_DDADR_LINE4         0x54

Ok, korrekt, LCD funktioniert jetzt!

Super, Danke an alle Helfer!

:O)

von Biko (Gast)


Lesenswert?

Volker Zabe schrieb:
> Steht im vollständigem Datenblatt.

PS: kannst du mal das vollständige datenblatt oder den link posten?

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.