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
danke erstmal. Wenn ich mich nicht irre hab ich aber das Datenblatt bei meinem ersten Post schon beigefügt... :)
Davon abgesehen ist der NT3881 uninteressant, da dies nur der Treiber ist. Der Controller ist ein 44780..
Vergiss meine Aussage. Ich bin noch nicht ganz wach. Der NT3881 ist ein Nachbau vom 44780, und sollte daher genauso angesteuert werden können.
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...
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.
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!
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.
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 ;)
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?
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!
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...
@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!
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...
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...
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.