Forum: Compiler & IDEs LCD 2. Zeile nicht erreichbar


von Ralf (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich versuche schon seit Tagen mein myAVR LCD am myAVR ATmega8 zum laufen 
zu bringen, ich habe eine einfache Libary benutzt und kann nun die erste 
Zeile "beschriften".
Mein Problem: Ich komme nicht n die 2. Zeile des LCD , habe aus einer 
anderen Zusammenfassung noch den Befehl set_cursor(x,y) rauskopiert aber 
weder dieser noch der lcd_goto(x,y)scheinen zu funktionieren.

Ich bin aboluter Anfänger und konnte im Forum leider nichts finden was 
mein Problem beheben konnte...

bräuchte ein wenig Hilfe :)

von Karl H. (kbuchegg)


Lesenswert?

Ralf schrieb:

> Ich bin aboluter Anfänger und konnte im Forum leider nichts finden was
> mein Problem beheben konnte...

Höchst wahrscheinlich stimmt einfach nur die Speicherstartadresse nicht.

Mach mal folgendes:
Gib einen langen String aus
zb
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"

Von diesem String wirst du nur den Anfang in der ersten Zeile sehen. 
Aber der String geht in der gedachten ersten Zeile weiter, bis er 
irgendwann in den Speicher reinreicht, den das LCD benutzt um damit die 
2.te Zeile anzuzeigen.

d.h. bei irgendeinem Buchstabens des langen Strings, wird die 2.te Zeile 
anfangen etwas anzuzeigen.

Dann brauchst du nur noch bestimmen, wieviele Zeichen zwischen den 
ersten Buchstaben in der ersten Zeile und dem ersten Buchstaben in der 
2ten Zeil liegen und hast den Versatz, den du in set_cursor bzw. 
lcd_goto einpflegen musst.


Das ganze funktioniert so
Das LCD hat nur einen fortlaufenden RAM

  +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
  |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
  +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+

Die LCD Logik krallt sich aus diesem RAM Teile heraus, die es in den 
einzelnen Zeilen anzeigt. Zb so

  +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
  |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
  +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+

  |                   |               |                   |
  |                   |               |                   |
    dieser Teil wird                     dieser Teil wird
    in der 1. Zeile                      in der 2. Zeile
     angezeigt                             angezeigt


D.h. wenn du in der 2ten Zeile mit der Ausgabe starten willst, musst du 
einfach nur die aktuelle Schreibposition hier


                                        *
                                        v
  +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
  |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
  +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+

  |                   |               |                   |
  |   1. Zeile        |               |  2. Zeile         |

hinsetzen, und alles was ab dieser Stelle ins RAM geschrieben wird, wird 
in der 2ten Zeile angezeigt.

Dazu musst du aber den Versatz


  |     Speicherversatz der Zeilen    |
  |                                   |
  v                                   v

  +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
  |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
  +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+

  |                   |               |                   |
  |   1. Zeile        |               |  2. Zeile         |

kennen.
Dadurch, dass du den Speicher einfach von vorne weg mit Text 
'vollmüllst' kannst du den aber bestimmen. Du fängst links zum Schreiben 
an, und siehst dir an welches Zeichen beim Anfang der 2ten Zeile steht. 
Da du den String kennst brauchst du daher nur abzählen wieviele Zeichen 
das sind und kennst somit den Versatz.

von Ralf (Gast)


Lesenswert?

vielen Dank erst einmal für die schnelle Antwort

Ich hab dein Tipp ausprobiert: 2. Zeileblieb leer und 1. zeigt ABCD...
erst wenn ich noch einmal die Kette dran hänge also:

lcd_write_s("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFG 
HIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");

das überscheibt er mir in der ERSTEN Zeile den Text mit : cdefghij

kannst du dir mal die Lcd.c anschauen ob ich da evtl was bei lcd_int 
ändern muss ?

von Ralf (Gast)


Lesenswert?

Habe gerade noch etwas ungewöhnliches festgestellt:

folgendes steht in der main:

main () {
  lcd_init();
  lcd_on();
  lcd_clear();

  lcd_write_s("12345");
  _delay_ms (50);
    set_cursor(0,2);
  lcd_write_s("67890");

  while(1);
}

Wenn ich das nun flashe zeigt das display 12345 an (1.Zeile).

Jetzt habe ich eben den USB Stecker abgezogen, also den MC spannungslos 
gemacht und dann wieder eingesteckt.... und dann zeigt er beide Zeilen 
perfekt an.

Lade ich wieder ein Programm ein ist wieder nur 1. Zeile da.

Ich versteh die Welt nicht mehr :)

von Achim (Gast)


Lesenswert?

Schau dir noch mal Seite 11 im Datenblatt an. Deine lcd_init Methode 
macht nicht den da angegebenen Reset des Displays.

Wieso benutzt du eigentlich in main _delay_ms und in der lcd.c deine 
eigene wait_ms Funktion?

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.