Forum: Mikrocontroller und Digitale Elektronik LCD 2.Zeile geht nur ein Mal


von Richard (Gast)


Lesenswert?

Moin,

ich habe ein LCD mit einer Zeile, 16 Zeichen.
Ist ja intern als 2x8 organisiert.
ich verwende die Bibliothek von Peter Fleury, hab 2 Zeilen mit je 8 
Zeichen und WRAP_LINES definiert.
Das Problem ist, dass die Ausgabe in die 2. Zeile nur ein Mal 
funktioniert

lcd_init(LCD_DISP_ON);
lcd_puts("Hello World");         // Anzeige:Hello World
waittaste();
lcd_gotoxy(0,0);
lcd_puts("abcdefghijk");       // Anzeige:abcdefghrld
waittaste();
lcd_gotoxy(0,1);
lcd_puts("ijk");               // Ausgabe:abcdefghijk

kennt jemand den Effekt? Mache oder verstehe ich was falsch?
ich kann mir zwar einen Workaround schreiben und bei mehr als 8 Zeichen 
in die 2. Zeile springen, aber das kanns ja nicht sein?
Wenn ich das ganze debugge und mir in der Fleury-Funktion lcd_putc die 
Positionen anschaue, kommen beim ersten Mal die korrekten
0 1 2 3 4 5 6 7 8 41 42
beim zweiten Mal
0 1 2 3 4 5 6 7 0 1 2

von Niels H. (monarch35)


Lesenswert?

Richard wrote:
> Das Problem ist, dass die Ausgabe in die 2. Zeile nur ein Mal
> funktioniert

Was bedeutet "funktioniert nur ein Mal"? Wie äussert sich das?

von Richard (Gast)


Lesenswert?

@Nils
die Ausgabe habe ich im Posting in den Programmtext als Kommentar 
geschrieben

von Niels H. (monarch35)


Lesenswert?

Was bedeutet denn "beim zweiten mal"? Ich sehe in deinem Programmcode 
keine Schleife...

von Richard (Gast)


Lesenswert?

lcd_init(LCD_DISP_ON);
>>>>>>> hier das erste Mal >>>>>>>>>>>>>
lcd_puts("Hello World");         // Anzeige:Hello World
waittaste();
lcd_gotoxy(0,0);
>>>>>>>>>> hier das 2. Mal >>>>>>>>>>>
lcd_puts("abcdefghijk");       // Anzeige:abcdefghrld
waittaste();
lcd_gotoxy(0,1);
lcd_puts("ijk");               // Ausgabe:abcdefghijk

von Niels H. (monarch35)


Lesenswert?

Also irgendwas stimmt hier garnicht!

> 0 1 2 3 4 5 6 7 8 41 42

Keines deiner beiden Strings besteht aus 9 Zeichen, so wie es diese 
Positionsangaben angeben.

Das Einzige, was auffällt ist, das der String "abcdefghijk" länger ist 
als "Hello World". Demnach würde einziges dafür sprechen, daß

> 0 1 2 3 4 5 6 7 0 1 2

die ausgabe von "Hello World", gotoxy (0,0), "abcdefghijk" ist und

> 0 1 2 3 4 5 6 7 8 41 42

die ausgabe von"abcdefghijk", gotoxy (0,1), "ijk" widerspiegelt.
Nur die Längenangaben stimmen wie gesagt überhaupt nicht...

von Karl H. (kbuchegg)


Lesenswert?

Hast du in der Fleury Lib den Wrap-Around eingeschaltet,
der dafür sorgt, dass beim sichtbaren Zeilenende (also nicht
erst nach den üblichen 0x40 Zeichen) in die nächste Zeile
geschaltet wird?

Wenn ich mich recht erinnere muss beim Wrap-Around die
Abfrage vom Display mittels R/W Leitung funktionieren.

von Richard (Gast)


Lesenswert?

@Niels



>Also irgendwas stimmt hier garnicht!

>> 0 1 2 3 4 5 6 7 8 41 42

>Keines deiner beiden Strings besteht aus 9 Zeichen, so wie es diese
>Positionsangaben angeben.
"Hello World" besteht aus 11 Zeichen, deshalb kommen auch 11 
Positionsangaben, diese sind meiner Meinung nach auch korrekt!
Kommt 8 zurück schlägt der Wraparound von Fleury zu und setzt die 
Position auf 0x40, deshalb kommt als nächstes 0x41

>Das Einzige, was auffällt ist, das der String "abcdefghijk" länger ist
>als "Hello World".
"abcdefghijk" ist auch 11 Zeichen lang?!

von Niels H. (monarch35)


Lesenswert?

ahhh...sorry, dann wars ein missverständnis meinerseits.

In diesem Fall tippe ich auf einen Softwarebug in der Lib...soll 
vorkommen.

von Richard (Gast)


Lesenswert?

@Karlheinz

>Hast du in der Fleury Lib den Wrap-Around eingeschaltet,
>der dafür sorgt, dass beim sichtbaren Zeilenende (also nicht
>erst nach den üblichen 0x40 Zeichen) in die nächste Zeile
>geschaltet wird?
Hab ich, geht ja auch beim ersten Mal

>Wenn ich mich recht erinnere muss beim Wrap-Around die
>Abfrage vom Display mittels R/W Leitung funktionieren.
das geht wohl, so erhalte ich ja die Positionsangaben vom Controller

es ist nur so dass ich beim ersten Mal nach dem 8.Zeichen die Position 8 
erhalte, was ja richtig ist, denn dann setzt es der Wraparound auf 0x40

ABER: beim 2.Mal kommt nach dem 8. Zeichen 0 anstatt 8 zurück, dann wird 
also das 9. Zeichen ausgegeben. Das landet aber nicht im AnzeigeRAM auf 
0, sondern auf 8 und deshalb ist nix zu sehen ...

von Karl H. (kbuchegg)


Lesenswert?

Hmm. Ich weiss jetzt nicht, ob es möglich ist, mittels
Hapsim ein derartiges LCD zu simulieren. Wenn ja, dann würde
ich das mal tun und im Simulator mal den Code durchsteppen.

von Richard (Gast)


Lesenswert?

grrrr
hab den Fehler jetzt gefunden:

also, da mir die Pins kanpp wurden musste ich das LCD auf Port B 
anschließen,
D3 an PB3. Das ist aber auch MOSI der ISP-Schnittstelle. Ich dachte 
nicht dass das ein Problem darstellt da ja avrdude und Ponyprog den 
Treiber im Parallel-Programmieradapter nach getaner Arbeit auf hochohmig 
schalten.

Leider gilt das nur für ca 10 Sekunden und dann murkst Windows an der 
Schnittstelle rum und schaltet den Treiber wieder ein. Der prügelt sich 
nun  mit AVR und LCD um den Pin PB3.
Der AVR ist wohl der stärkste der drei denn das schreiben aufs LCD hat 
immer funktioniert, das LCD war am schwächsten sodass es die Position 8 
(Bit 3 gesetzt) nicht zurückmelden konnte.

Deshalb hat es bei der ersten Ausgabe funktioniert, bei der zweiten 
(nach mehr als 10 Sekunden) nicht mehr.
Und die Lehre daraus: der erste Anschein trügt

von Niels H. (monarch35)


Lesenswert?

Richard wrote:

> Und die Lehre daraus: der erste Anschein trügt

Die eigentliche Lehre sollte sein: ISP-Stecker im Betrieb entfernen. 
Immer und bedingungslos. Und: man kann sich auch tod-debuggen.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Oder den ISP Stecker mit en Portreiber "Abklemen" sobald Reset HIGH geht 
:)

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.