www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LCD mit NT3881D


Autor: Soman (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: ??? (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
hier gibts erstmal das Datasheet...

Autor: Soman (Gast)
Datum:

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

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

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

Autor: Soman (Gast)
Datum:

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

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Soman (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Soman (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Soman (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: Soman (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Soman (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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!

Autor: Manfred B. (vorbeigeschlendert)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Soman (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Soman (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Manfred B. (vorbeigeschlendert)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Soman (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Manfred B. (vorbeigeschlendert)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
d.h. bei
set_cursor(0,1);
lcd_string("Messwert 1 = ");

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

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

oder... spricht etwas gegen sprintf

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.