Forum: Mikrocontroller und Digitale Elektronik LCD mit NT3881D


von Soman (Gast)


Angehängte Dateien:

Lesenswert?

Guten Morgen!

Ich hab hier im mement noch ein kleines Problem mit einem LCD. Da hoffe 
ich, daß sich da jemand auskennt und mir evtl. gedanklich auf die 
Sprünge helfen kann...:

Aaaalso, was ich habe:
ich benutze einen ATMega32. An seinem PortC hängt ein LCD, was im 
4-bit-Mode angesteuert werden soll. Die technichen Details sind in den 
Datenblättern im Anhang zu finden.
Das LCD ist von Optrex und vom Typ C-51847 NFQJ-LG-ACN. Laut dem DB ist 
da ein Controller vom Typ NT3881 drauf.
Ich programmiere in C, zur Ansteuerung habe ich den Quellcode aus dem 
Tutorial dieser Seite benutzt, wobei ich den Code so angepasst habe, daß 
es bei mir passt. Weil bei mir hängt der Datenbus vom LCD namlich an 
PinC[4-7] und nich an PinX[0-3] wie im Tutorial...
So, was kann ich noch sagen? Ich habe das JTAG-Interface deaktiviert, so 
daß der PortC komplett als Ausgang benutzt werden kann.

Mittlerweile bin ich soweit, daß das LCD sogar was anzeigt. Aber es ist 
nur Unfug! Es werden, ohne ein bestimmtes Muster feststellen zu können, 
nur die Zeichen "o", "O", "°", "/", "?", und "<-" dargestellt. Ein Blick 
ins DB hat mir gezeigt, daß diese Zeichen alle im LCD bei Adresse xF 
liegen. Das brachte mich aber bei meiner Erkenntnis auch nicht weiter...
Leider kann ich niergends eine Routine finden, wie man den NT3881 
richtig initialisiert. Auch keine Timing-Diagramme... Es wäre echt 
super, wenn ihr euch das mal näher angucken könntet... Ein bißchen habe 
ich noch den Verdacht, daß bei der Initialisierung was falsch läuft. Wo 
bei ich echt keine Fehler in meinem Code finden kann...

Danke schonmal,
Soman

von ??? (Gast)


Angehängte Dateien:

Lesenswert?

hier gibts erstmal das Datasheet...

von Soman (Gast)


Lesenswert?

danke erstmal. Wenn ich mich nicht irre hab ich aber das Datenblatt bei 
meinem ersten Post schon beigefügt... :)

von Benedikt K. (benedikt)


Lesenswert?

Davon abgesehen ist der NT3881 uninteressant, da dies nur der Treiber 
ist. Der Controller ist ein 44780..

von Soman (Gast)


Lesenswert?

Benedikt:
woran siehst/woher weißt du das? bin ja auch lernwillig :)

von Benedikt K. (benedikt)


Lesenswert?

Vergiss meine Aussage. Ich bin noch nicht ganz wach.
Der NT3881 ist ein Nachbau vom 44780, und sollte daher genauso 
angesteuert werden können.

von Soman (Gast)


Lesenswert?

schon ok, ich ja auch nicht ;)

aber das ist es ja ...
ich war ja der ansicht das so gemacht zu haben. Aber es wird eben nüscht 
vernünftiges angezeigt. Und ich bin den Code schon XX-mal durchgegangen 
und komm nicht drauf. Wobei ich ja schon froh bin, daß überhaupt was 
angezeigt wird...

von Benedikt K. (benedikt)


Lesenswert?

Der Code sieht eigentlich gut aus. Die Schreibroutine sollte passen, die 
Initialisierung habe ich immer genauso.
Mir fallen nur 2 Möglichkeiten ein: Deine Pausen sind zu kurz, oder du 
hast irgendwas etwas falsch verdrahtet.

von Soman (Gast)


Lesenswert?

Hey, danke, daß du dir die Mühe gemacht hast! Die verdrahtung hab ich 
gerade Kontrolliert, die ist i.O. . Die Pausen zu kurz? Wo denn?! ich 
hab doch sogar mehr und längere Pausen eingebaut als im Tutorial :) ... 
* nochmal ans Busy-flag denk... *
Sicher, daß wirklich alles mit der Maskiererei und so stimmt? Da bin ich 
nämlich noch nicht so sicher, weil ich nicht sooo viel Ahnung von C 
habe.

vg!

von Benedikt K. (benedikt)


Lesenswert?

Du fragst doch das Busy garnicht ab, oder ?
Laut Datenblatt braucht der Controller 40µs pro Befehl, du wartest 42µs. 
Das halte ich für ziemlich knapp.

von Soman (Gast)


Lesenswert?

nee, ich frag das busy nicht ab. aber ich denk da eben langsam drüber 
nach, wenn das mit den zeiten so schwierig ist :)
habe die zeiten auch vorher schon mal z.t. ganz krass verändert. hab es 
mal auf 70µs hoch gestellt. aber das brachte alles nichts. und statt 1 
µs mal 10 µs warten und so... an den zeiten hab ich schon rumgefummelt 
wie sonstwas... ist ja nicht so, daß ich nicht selbst schon viel 
probiert hätte ;)

von Soman (Gast)


Lesenswert?

ich glaube echt mit meiner initialisierung stimmt was nicht... weil wenn 
ich meine test-ausgabe im hauptprogramm deaktiviere bleiben nur zwei 
olle balken auf dem lcd... was doch irgenmdwie dafür spricht, daß es 
nicht richtig initialisierrt wird, oder?

von Soman (Gast)


Angehängte Dateien:

Lesenswert?

Morgen :) !

Also die Ausgabe habe ich jetzt hinbekommen. Ist mir peinlich, darum sag 
ich nicht, worans lag ;)
Jetzt hab ich den ADC in Gang gebracht und wollte eigentlich "nur" von 
zwei Kanälen Messwerte einlesen und den einen dann in der einen Zeile 
und den anderen in der anderen Zeile ausgeben.
Aber das klappt nicht so richtig. Und an der der Stelle wäre es schön, 
wenn einer von euch sich einmal angucken könnte, woran das liegt. Denn 
im Moment ist es so, daß auf dem LCD die Messwerte zeilenmäßig 
vertauscht stehen und an der Stelle für den ersten Messwert (der in der 
2. Zeile steht) springt die Anzeige ganz schnell zwischen Messwert 1 und 
2 hin und her. Sieht für mich so aus, als würde was mit der 
Variablenübergabe nicht klappen. Aber ich finds einfach nicht... :( im 
Anhang wie immer der Code (von "meinem" Programm und von der 
lcd-routines.c

Danke schonmal,
VG!

von Manfred B. (vorbeigeschlendert)


Lesenswert?

schade dass du uns nicht an deinem Erfolg teilhaben läßt und andere 
somit vielleicht den gleichen Fehler vermeiden können - höchstens der 
war soooo dämlich, dass den kein anderer machen würde...

von Soman (Gast)


Lesenswert?

@Manfred
genau das ist es :)
ich glaube, daß nicht sooo viele andere auf die idee kommen zu versuchen 
erst das lcd und dann die ports zu initialisieren... hey! nicht lachen!

von Soman (Gast)


Lesenswert?

jetzt hab ich mal folgendes verändert:
aus:
strom_messen();
spannung_messen();
lcd_test();

wurde:
strom_messen();
lcd_test();
spannung_messen();
lcd_test();

das hatte nun zur folge, daß der eine messwert nicht mehr flacker. aber 
sie werden immer noch genau zeilenvertauscht angezeigt. das check ich 
nicht...

von Manfred B. (vorbeigeschlendert)


Lesenswert?

hast du mal kontrolliert ob die Zeilen wirklich an den angenommenen 
Adressen beginnen? einfach einmal in Adresse für Adresse ein Zeichen 
schreiben und schauen wo das erscheint... mach es im Sekundentakt, dann 
kommst auch mit dem Kucken hinterher...

von Soman (Gast)


Lesenswert?

ja, also aus dem datenblatt geht leider nicht so viel hervor, aber ich 
habe natürlich am anfang, beovor ich mit messwerten gearbeitet habe und 
so, testanzeigen gemacht. das hat mit den routinen aus der 
lcd-routines.c super geklappt. also da konnte ich explizit sagen wenn 
ich das-un-das eingebe erscheint der text auch da-und-da.
weil der normale text steht ja auch da, wo er soll.

beispiel: die anzeige SOLL anzeigen:
"Messwert 1 = xxxxx"
"Messwert 2 = yyyyy"
"Messwert 3 = zzzzz"

es wir aber angezeigt:
"Messwert 1 = zzzzz"
"Messwert 2 = xxxxx"
"Messwert 3 = yyyyy"

und das ist doof. und ich habe schon einen kumpel darauf angesetzt, der 
sich eigentlich sehr gut damit auskennt, aber der kam auch nicht 
dahinter. und cih will das nicht irgendwie zurecht schummeln. das soll 
einfach richtig sein... :(

gruß!
Soman

von Manfred B. (vorbeigeschlendert)


Lesenswert?

d.h. bei
1
set_cursor(0,1);
2
lcd_string("Messwert 1 = ");

erscheint auch 'Messwert 1 = ' an erster Stelle in Zeile 2?
                0123456789012

dann schieb doch einfach malk ein
1
set_cursor(13,1);
dazwischen...
1
set_cursor(0,1);
2
lcd_string("Messwert 1 = ");
3
set_cursor(13,1);
4
lcd_string(istwert);

oder... spricht etwas gegen sprintf

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.