Datum:
Hallo zusammen, ich hab da ein kleines Problem und zwar mit einem LCD. es handelt sich dabei um ein 16-zeichen/1-zeiliges aus dem Hause Reichelt(LCD161A).dieses versuche ich nun mithilfe eines ATmega8 anzusteuern, und zwar sende ich ans LCD 12 Zechen nacheinander mit je 5ms Pausen dazwischen. was man dabei auf dem LCD sieht ist folgendes:es werden nur die ersten 8 Zeichen auf der linken Displayseite dargestellt, die rechte bleibt komplett leer, dabei spielt es keine Rolle ob ich es in 4- oder 8-Bit Modus ansteuere, das Ergebnis bleibt stets das gleiche. und was mir noch aufgefallen ist - wenn man das LCD einfach mal an die versorgungsspannung anschliesst, ohne uC dann sieht man nur 8schwarze balken links, die rechte Displayhälfte scheint irgentwie tot zu sein. tja, und bevor ich das gute Stück wieder zurückschicke wollte ich euch erstmal fragen - vielleicht hat jemand von euch sowas ähnliches schon mal gehabt, gibt es vielleicht da irgendein Trick oder hat das Ding tatsächlich ne Macke?
Datum:
Bin mir nicht sicher, aber so was ähnliches hatte ich auch mal: das Display war 16x1, aber wurde als 8x2 angesteuert - probier' das mal...
Datum:
Angehängte Dateien:Ich hab nun alles probiert. Auch mein LCD mit 8x2 zu initialisiern, kein Erfolg. Im Anhang findet ihr meine LCD.h und mein Programm. Betrieben wird das LCD im 4Bit Modus. Angeschlossen ist es wie im angehängten Bild, außer, dass das LCD an PortD angeschlossen ist und nicht PORTC wie im Bild. Ich hoffe mir kann wer helfen. Infos: IDE: AVR Studio 4 Compiler: WIN AVR µC:ATMEGA8 MFG Julian
Datum:
Um welches LCD gehts denn? Ist es identisch zu obigem? Wäre wichtig zu wissen...
Datum:
Hallo, tut mir leid. LCD heißt: TC1602A-09, gabs bei Pollin, habe es aber wo anders her.
Datum:
Werd mir wohl ein neues kaufen müssen um sicher zugehen ob es an der Software oder Hardware liegt...
Datum:
Hast Du mal die Lötstellen auf Wackelstellen hin gecheckt? Dein Problem deutet zumindest auf kalte Lötstellen hin.
Datum:
Wurde doppelt gelötet, die Lötstellen sind sauber! Hat ein Prof. von mir gelötet, die sind nahezu perfekt^^ :D.
Datum:
Die Tatsache, dass der Prof das gelötet hat heißt noch lange nix :-D Hast du mal unterschiedliche Startwerte für die Zeilen ausprobiert? Ich hatte das Problem bei nem Xilinx-Board, dass die Doku vom Board und vom Displayhersteller bei, sagen wir, nicht zutreffend waren. vg
Datum:
> Ich hab nun alles probiert. > Auch mein LCD mit 8x2 zu initialisiern, kein Erfolg. Was geht? Gar nichts? Oder kannst du wenigstens irgendwas erkennen, wenn du die Kontrastspannung auf 0V drehst? > Auch mein LCD mit 8x2 zu initialisiern > LCD heißt: TC1602A-09 Ähm, da steht beim Max: 2 Zeilen x 16 Zeichen Text... :-o BTW: du darfst auch ruhig einen neuen Thread anlegen, dann muss sich nicht jeder erst mal durch eine 3 Jahre alte Frage durchwursteln... :-/
Datum:
Ich hatte das Problem auch bei einem 16er Display. Mein Problem war, dass das Datenblatt sehr undurchsichtig war. Ich konnte daraus nicht ersehen wo der zweite Teil des Displays "anfängt". Ich habe dann einfach einen elends langen String in den Speicher geschrieben der Art "1234567890ABCDE......" und habe den dann immer wiederholt. Irgendwann erschien dann tatsächlich auch was in den letzten 8 Stellen. Vielleicht hilft das ja ;)
Datum:
Angehängte Dateien:Hallo, danke für eure Antworte :), gute Idee @Lars. Ich kann schon etwas erkennen, bevor ich, das versuch zu beschreiben macht euch selbst ein Bild, die sagen ja bekanntlich mehr als 1000 Worte ;). MFG Julian
Datum:
Florian Th. schrieb: > Hast du mal unterschiedliche Startwerte für die Zeilen ausprobiert? Ich > hatte das Problem bei nem Xilinx-Board, dass die Doku vom Board und vom > Displayhersteller bei, sagen wir, nicht zutreffend waren. Was meinst du mit versch. Startwerten? Lothar Miller schrieb: > Ähm, da steht beim Max: 2 Zeilen x 16 Zeichen Text... :-o Hab mich auch schon gewundert, diese Bezeichnung sagt der Beipackzettel, aber mein Display ist definitiv nur 16x1^^
Datum:
WOW, DANKE LARS. Super Idee. Mein Code Schaut so aus:
/* String auf Display anzeigen */ lcd_puts("Willkomm"); /* String auf Display anzeigen */ lcd_puts("Willkommen"); lcd_puts("Willkommen"); lcd_puts("Willkommen"); lcd_puts("Wien"); |
Dann steht auf dem Display wirklich "Willkommen". Was bedeutet, dass nun für mich, wo ist meine Startadresse der 2. Zeile? MFG Julian und VIELEN DANK!
Datum:
Hallo Julian! Schön, dass das klappt - probiers doch aber auch mal mit unterschiedlichen Strings, damit du weißt, welche lcd_puts()-Anweisung greift. Dann würde ich schauen, inwiefern die lcd_puts()-Funktion die Werte (der Positionen) verändert (wahrscheinlich inkrementiert) und dann wirst du auf einen Wert kommen. Zur Startadresse: Die Displays (bzw. jede einzelne Position) hat feste Werte, so zB für jede Zeile. Einige Displays haben z.B. als Offset für die erste Zeile ein 0x00, für die zweite 0x40; es kann aber auch innerhalb einer Zeile zu Sprüngen kommen, dass also nicht von 0x00 bis 0x0F durchgezählt wird. Das ist wiederrum vom Controller abhängig und wie der verschaltet ist. (vgl. http://www.sprut.de/electronic/lcd/) VG
Datum:
Florian Th. schrieb: > Schön, dass das klappt - probiers doch aber auch mal mit > unterschiedlichen Strings, damit du weißt, welche lcd_puts()-Anweisung > greift. Dann würde ich schauen, inwiefern die lcd_puts()-Funktion die > Werte (der Positionen) verändert (wahrscheinlich inkrementiert) und dann > wirst du auf einen Wert kommen. Hallo, es greift der "Wien" String. Das "en" von "Wien" gibt mir, dass "en" welches ich für Willkomm"en" brauche. Dh. ich muss 3 mal "Willkommen" ausgeben und zusätzlich noch das "Wi".
Datum:
>aber mein Display ist definitiv nur 16x1^^
Auf dem Bild vom
Datum: 15.03.2010 22:53
kann man am Kontrast gut erkennen das es ein "Zweizeiliges" LCD ist.
Datum:
Oh Mann du machst dir selbst das Leben unnötig schwer.
Gib doch einfach aus
"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
dann siehst du sofort wo die Ausgabe abbricht und wo sie wieder
einsetzt. Auch Teststrings, mit denen Sachverhalten abgeklärt werden,
wollen überlegt gewählt werden
Also: Du gibst aus
WilkommWillkommenWillkommenWillkommenWien
| |
+------------------------------+
der Teil ist nicht sichtbar.
Also hast du einen Versatz von (tapp, tapp, tapp, Zeichen zählen): 32
Zeichen also Hex 0x20
Du hast also ein 2*8 LCD mit einem Zeilenversatz der 2.ten Zeile von
0x20 Zeichen.
Datum:
Also ich suche nach einer Möglichkeit die 2. Startadresse zu ermitteln. Das Wort "Willkommen" hat ja bekanntlich 10 Buchstaben. Also 10 * 1Byte und das Ganze dann 3 mal plus 2 wegen dem "Wi", stimmt, das so weit? Kann, mann die Startadresse eigentlich irgendwie errechnen oder ist die sowieso irgendwie eingestellt. Vorallem bei so einem "windigem" LCD könnte ich mir vorstellen, dass sie Startadresse irgendwo ist.
Datum:
jaytharevo schrieb: > Also ich suche nach einer Möglichkeit die 2. Startadresse zu ermitteln. Fingern abzählen? > Also 10 * 1Byte und das Ganze dann 3 mal plus 2 wegen dem "Wi", > stimmt, das so weit? Probiers einfach aus :-) Dein µC bzw. dein LCD zeigen dir sehr schnell ob du dich irgendwo verzählt hast. > Kann, mann die Startadresse eigentlich irgendwie errechnen oder ist die > sowieso irgendwie eingestellt. Die ist fix
Datum:
Hallo,
#define LCD_LINES 2 /**< number of visible lines of the display */ #define LCD_DISP_LENGTH 8 /**< visibles characters per line of the display */ #define LCD_LINE_LENGTH 0x40 /**< internal line length of the display */ #define LCD_START_LINE1 0x00 /**< DDRAM address of first char of line 1 */ #define LCD_START_LINE2 0x40 /**< DDRAM address of first char of line 2 */ #define LCD_START_LINE3 0x14 /**< DDRAM address of first char of line 3 */ #define LCD_START_LINE4 0x54 /**< DDRAM address of first char of line 4 */ #define LCD_WRAP_LINES 0 /**< 0: no wrap, 1: wrap at end of visibile line */ |
Was meint ihr müsste ich da nun ändern? Start of Line 2? Hab ich auch auf 0x60 probiert, machte keinen Unterschied.
Datum:
Julian Schild schrieb: > Was meint ihr müsste ich da nun ändern? Start of Line 2? Hab ich auch > auf 0x60 probiert, machte keinen Unterschied. Finger durcheinander gekommen? Gerade eben hab ich dir vorgezählt, dass deine Zeilen offenbar einen Versatz von 32 Zeichen haben. 32 ist hexadezimal 0x20 Und nein. Du musst dich um die Adressierung in die nächste Zeile höchst wahrscheinlich selbst kümmern. Der LCD Code den du hast wird das nicht machen. Du könntest höchstens probieren den Wrap mal auf 1 zu setzen
Datum:
Julian Schild schrieb: > LCD heißt: TC1602A-09 Bist Du Dir mit dieser Bezeichnung sicher? Bei Tinsharp, dem Hersteller des Displays kann ich nur das TC1602A-09T finden, das wäre aber ein 16x2. Jedergang, Tinsharp verwendet bei seinen Displays zu 90% den Controller SPLC780D von Sunplus. Das Datenblatt zum Controller sollte man lesen. > aber mein Display ist definitiv nur 16x1 Physikalisch schon, aber wie man nach dem Controllerreset sieht, wird es als zweizeiliges LCD initialisiert (Hälfte wird dunkel). Falls ich auf Deinem Photo richtig sehe, handelt es sich um eine Zeichengröße von 5x8 Punkten. Die zweite Linie beginnt lt. Datenblatt mit Zeichenaddresse 0x40h. Und bitte nächstes mal einen neuen Fred aufmachen, ich hatte nämlich schon alles für das Display LCD161A von Displaytech herausgesucht, da davon im OP die Rede war. Hoffe das hilft Dir irgendwie weiter, Iwan
Datum:
Naja, das Problem ist eben, dass es nicht 0x40 ist. Wie oben eingestellt (lcd.h) funktioniert es leider nicht. Auch wenn ich es um die 32 Zeichen versetze. 0x40+0x20=0x60 Wrap blendet mir sowieso die erste Zeile komplett aus. Иван S. schrieb: > Physikalisch schon, aber wie man nach dem Controllerreset sieht, wird es > als zweizeiliges LCD initialisiert (Hälfte wird dunkel). Falls ich auf > Deinem Photo richtig sehe, handelt es sich um eine Zeichengröße von 5x8 > Punkten. Das kommt daher weil das LCD eben als 8x2 konfiguriert ist.
Datum:
Hi
>Auch wenn ich es um die 32 Zeichen versetze. 0x40+0x20=0x60
Das sind nicht 32, sondern 96.
MfG Spess
Datum:
Hi 0x60 = 96D. Eigentlich sollte ich fragen, wie du auf diese Rechnung kommst. Der Offset der zweiten Zeile errechnet sich zur Adresse des ersten Zeichen der ersten Zeile. Und die ist normalerweise Null. MfG Spess
Datum:
Julian Schild schrieb: > Naja, das Problem ist eben, dass es nicht 0x40 ist. Wie oben eingestellt > (lcd.h) funktioniert es leider nicht. > > > Auch wenn ich es um die 32 Zeichen versetze. 0x40+0x20=0x60 Wenn in deinem jetztigen Header File 0x40 als Start der zweiten Zeile eingetragen ist, und du als Start aber 32 Zeichen festgestellt hast, dann trägst du natürlich auch nur 32 (oder eben 0x20) ein. Das ist doch nicht so schwer
#define LCD_LINES 2 /**< number of visible lines of the display */ #define LCD_DISP_LENGTH 8 /**< visibles characters per line of the display */ #define LCD_LINE_LENGTH 0x20 /**< internal line length of the display */ #define LCD_START_LINE1 0x00 /**< DDRAM address of first char of line 1 */ #define LCD_START_LINE2 0x20 /**< DDRAM address of first char of line 2 */ #define LCD_START_LINE3 0x14 /**< DDRAM address of first char of line 3 */ #define LCD_START_LINE4 0x54 /**< DDRAM address of first char of line 4 */ #define LCD_WRAP_LINES 0 /**< 0: no wrap, 1: wrap at end of visibile line */ |
LINE3 und LINE4 lass ich unangetastet, da sie nicht gebraucht werden.
Datum:
Hab deinen Code kopiert Heinz, macht absolut keinen Unterschied. Aber eigentlich ist es ja nicht so tragisch, ich will jetzt keine Stunden deswegen investieren, dachte, dass es ein kleiner Denkfehler von mir war. 0x20 hatte ich natürlich auch schon probiert ;). spess53 schrieb: > 0x60 = 96D. Eigentlich sollte ich fragen, wie du auf diese Rechnung > kommst. Der Offset der zweiten Zeile errechnet sich zur Adresse des > ersten Zeichen der ersten Zeile. Und die ist normalerweise Null. Auf die bin ich gekommen, da ich gedacht habe, das die Startadresse für die 2. Zeile zu gering ist. Der Versatz war 32 Zeichen (32=0x20) und, das hab ich dann einfach der Startadresse hinzu addiert.
Datum:
Julian Schild schrieb: > Hab deinen Code kopiert Heinz, macht absolut keinen Unterschied. > Aber eigentlich ist es ja nicht so tragisch, ich will jetzt keine > Stunden deswegen investieren, dachte, dass es ein kleiner Denkfehler von > mir war. Dann hast du dich entweder irgendwo verzählt oder dein Testprogramm zur Feststellun des Offsets hat nicht so ganz geklappt. Mit einem vernünftigen Teststring wäre es sooo viel einfacher gewesen. Aber, wie stellst du eigentlich jetzt fest, dass es nicht klappt? (Progamm?) Hast du im LCD Code nachgesehen, ob du dich um die Weiterschaltung in die 2.te Zeile kümmern musst, oder ob das die LCD-Lib macht, die du benutzt.
Datum:
In dem ich in der Ausgabe für die 2. Zeile immer noch 32 Zeichen einfügen muss bevor am Display, das aufscheint was ich eig haben will.
Datum:
Angehängte Dateien:Programm. Heinz, ich glaub du kennst mein Programm bald besser als ich :P.
Datum:
Hi
Wenn ich das richtig verstanden habe, hast du gestern schon Zeichen auf
den rechten Teil der Zeile gehabt (Datum: 15.03.2010 23:04).
Warum hast du die nachfolgenden Ratschläge nicht befolgt?
Beschreibe einfach mal mit:
lcd_puts("00000000");
lcd_puts("11111111");
lcd_puts("22222222");
....
lcd_puts("99999999");
Aus dem, was dann in der rechten Hälfte steht kann man dann den Offset
berechnen.
MfG Spess
Datum:
Julian Schild schrieb: > Programm. > > Heinz, ich glaub du kennst mein Programm bald besser als ich :P. Das ist die Fleury Lib. Schalte den Wrap ein und die Library kümmert sich um den Umbruch 'in die nächste Zeile' (wenn die Abfrage vom LCD funktioniert, aber davon gehe ich mal aus)
#define LCD_WRAP_LINES 1 /**< 0: no wrap, 1: wrap at end of visibile line */ |
Hier ...
/************************************************************************* Display character at current cursor position Input: character to be displayed Returns: none *************************************************************************/ void lcd_putc(char c) { uint8_t pos; pos = lcd_waitbusy(); // read busy-flag and address counter if (c=='\n') { lcd_newline(pos); } else { #if LCD_WRAP_LINES==1 #if LCD_LINES==1 if ( pos == LCD_START_LINE1+LCD_DISP_LENGTH ) { lcd_write((1<<LCD_DDRAM)+LCD_START_LINE1,0); } #elif LCD_LINES==2 if ( pos == LCD_START_LINE1+LCD_DISP_LENGTH ) { lcd_write((1<<LCD_DDRAM)+LCD_START_LINE2,0); }else if ( pos == LCD_START_LINE2+LCD_DISP_LENGTH ){ lcd_write((1<<LCD_DDRAM)+LCD_START_LINE1,0); } #elif LCD_LINES==4 if ( pos == LCD_START_LINE1+LCD_DISP_LENGTH ) { lcd_write((1<<LCD_DDRAM)+LCD_START_LINE2,0); }else if ( pos == LCD_START_LINE2+LCD_DISP_LENGTH ) { lcd_write((1<<LCD_DDRAM)+LCD_START_LINE3,0); }else if ( pos == LCD_START_LINE3+LCD_DISP_LENGTH ) { lcd_write((1<<LCD_DDRAM)+LCD_START_LINE4,0); }else if ( pos == LCD_START_LINE4+LCD_DISP_LENGTH ) { lcd_write((1<<LCD_DDRAM)+LCD_START_LINE1,0); } #endif lcd_waitbusy(); #endif lcd_write(c, 1); } }/* lcd_putc */ |
... sind die entsprechenden Abfragen enthalten. Sie sind aber nur dann aktiv, wenn LCD_WRAP_LINES auf 1 steht
Datum:
Julian Schild schrieb: > In dem ich in der Ausgabe für die 2. Zeile immer noch 32 Zeichen > einfügen muss bevor am Display, das aufscheint was ich eig haben will. So kann man das dann auch machen... ;-)
Datum:
#define LCD_LINES 2 /**< number of visible lines of the display */ #define LCD_DISP_LENGTH 8 /**< visibles characters per line of the display */ #define LCD_LINE_LENGTH 0x40 /**< internal line length of the display */ #define LCD_START_LINE1 0x00 /**< DDRAM address of first char of line 1 */ #define LCD_START_LINE2 0x40 /**< DDRAM address of first char of line 2 */ #define LCD_START_LINE3 0x14 /**< DDRAM address of first char of line 3 */ #define LCD_START_LINE4 0x54 /**< DDRAM address of first char of line 4 */ #define LCD_WRAP_LINES 1 /**< 0: no wrap, 1: wrap at end of visibile line */ /* String auf Display anzeigen */ lcd_puts("Willkommen"); //Typkonvertierung für "lcd_puts"- Funktion sprintf(cPuffer,"Verbrauch:%2d.%dW",usiPuffer1,usiPuffer2); // Ausgabe am LCD lcd_clrscr(); // LC-Display löschen und Kursor auf Pos. 1 lcd_puts(cPuffer); // String am Display ausgeben |
So, Wrap hat funktioniert, danke. Mit den obigen Einstellung
funktioniert alles so wie es soll :).
spess53 schrieb:
> Warum hast du die nachfolgenden Ratschläge nicht befolgt?
Hatte ich doch, aber ob ich nun Zahlen oder mehrere "Willkommen" nehme
ist im Prinzip egal ;).

