mikrocontroller.net

Forum: Compiler & IDEs LCD 2. Zeile nicht erreichbar


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

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Ralf (Gast)
Datum:

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

Autor: Ralf (Gast)
Datum:

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

Autor: Achim (Gast)
Datum:

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

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.