www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LCD zeigt Zeichenwiederholungen, zwei Zeilen nicht ansteuerbar


Autor: Volker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

bei meinem Display (4x20 Zeichen) kann ich nur die erste und dritte 
Zeile ansprechen (mit set_cursor() ). In der zweiten und vierten werden 
alle Zeichen der Vorzeile ab dem 13. Zeichen wiederholt.

- LCD-Modul EA DIP204-4
- lcd-routines.h

Könnt Ihr mir einen Tipp geben?

Vielen Dank und beste Grüße

Volker

Autor: Januar2010 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

wie rufst du die Funktion set_cursor auf. In meiner lcd.c ist diese so 
definiert:
void set_cursor(uint8_t x, uint8_t y)
{
  uint8_t tmp;
 
  switch (y) {
    case 1: tmp=0x80+0x00+x;  break;    // 1. Zeile
    case 2: tmp=0x80+0x40+x;  break;    // 2. Zeile
    case 3: tmp=0x80+0x10+x;  break;    // 3. Zeile
    case 4: tmp=0x80+0x50+x;  break;    // 4. Zeile
  }
  lcd_command(tmp);
}

Aus dem Datenblatt deines LCDs habe ich:

1. Zeile $00..$13
2. Zeile $20..$33
3. Zeile $40..$53
4. Zeile $60..$73

Du musst also set_cursor so modifizieren, denke ich:
void set_cursor(uint8_t x, uint8_t y)
{
  uint8_t tmp;
 
  switch (y) {
    case 1: tmp=0x80+0x00+x;  break;    // 1. Zeile
    case 2: tmp=0x80+0x20+x;  break;    // 2. Zeile
    case 3: tmp=0x80+0x40+x;  break;    // 3. Zeile
    case 4: tmp=0x80+0x60+x;  break;    // 4. Zeile
  }
  lcd_command(tmp);
}


Viel Erfolg

Autor: Volker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mannometer, bis ich diese Tabelle da oben gesehen hab'... :-(
Ja, da ist was dran. Allerdings bleibt diese Wiederholung in der 
nächsten Zeile immer noch und die geraden Zeilen kann ich trotzdem nicht 
ansteuern.

Ich hab mir mal jetzt alle Befehle und Initialisierungen angesehen. In 
der lcd-routines.h steht in einer Zeile

  // 4Bit  2 Zeilen  5x7
   lcd_command(0x28);

Nun, das ist ja ein Wink mit dem Zaunpfahl. Aber laut Tabelle im 
Datenblatt gibt es nur die Möglichkeit, mit dem DB3 auf 1-zeilig oder 
2-zeilig zu schalten - hä? Ich hab doch 'n Vierzeiler!?

Auf der Seite 3 oben ist dann aber eine Initialisierungssequenz 
angegeben, wo "4 Zeilen Modus" dran steht - die hat aber mit 0x09 nix 
mit dem zu tun, was links unten in der Tabelle steht. Aber dadrüber 
steht 8-BIT-MODUS !

Bedeutet das eventuell, dass ich den Vierzeilenmodus nur im 8-Bit-Modus 
bekomme??

Danke und Grüße

Volker

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Probier doch mal alternativ die LCD-Files von Peter Fleury aus,
vielleicht geht es mit denen besser.

http://homepage.hispeed.ch/peterfleury/avr-software.html

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Probiers mal mit dem NW im 'Extended Function set' :-)

HTH

Autor: Volker Schulz (volkerschulz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
'Extended Function set' ist das richtige Stichwort, das Problem liegt in 
der Initialisierung (fuer 4 Zeilen). Habe eine funktionierende 
Initialisierung fuer Dein Display in ASM. Bitte melden bei Interesse.

Volker

Autor: Volker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Volker Schulz schrieb:
> 'Extended Function set' ist das richtige Stichwort, das Problem liegt in
> der Initialisierung (fuer 4 Zeilen). Habe eine funktionierende
> Initialisierung fuer Dein Display in ASM. Bitte melden bei Interesse.

Ei, sicher ;-)

Ich will das ja verstehen. Man muss nicht alles neu erfinden, aber bei 
Displays lohnt es sich, sie zu verstehen, denke ich. Die braucht man ja 
ständig.

Danke und Grüße

der andere Volker

Autor: Volker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Mike und @g457: danke! Ich berichte, was passiert, auch Peter Fleury 
werde ich mal ausprobieren - aber erst mal das eine verstehen ;-)

Autor: Volker Schulz (volkerschulz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Volker schrieb:
> Ei, sicher ;-)

Noch besser... Schau mal hier:
http://www.mikrocontroller.net/articles/AVR-Tutorial:_LCD

und lad Dir anschliessend die Lcd-routines.asm hier herunter:
http://www.mikrocontroller.net/wikifiles/9/96/Lcd-...

Um das Ganze nun DIP204-tauglich zu machen, musst Du bei der 
Initialisierung folgendes veraendern:

ORIGINAL:
ldi   temp1,    0b00000010   ; 4bit-Modus einstellen
out   LCD_PORT, temp1
rcall lcd_enable
rcall delay5ms
ldi   temp1,    0b00101000   ; 4 Bot, 2 Zeilen
rcall lcd_command
ldi   temp1,    0b00001100   ; Display on, Cursor off
rcall lcd_command
ldi   temp1,    0b00000100   ; endlich fertig
rcall lcd_command


MUSS LAUTEN:
ldi   temp1, 0b00100100      ; 4bit-Modus einstellen, RE=1
rcall lcd_command
ldi   temp1, 0b00001001      ; 4 Zeilen
rcall lcd_command
ldi   temp1, 0b00100000      ; 4bit-Modus einstellen, RE=0
rcall lcd_command
ldi   temp1, 0b00001100      ; Display on, Cursor off, no blinking
rcall lcd_command
rcall lcd_clear
ldi   temp1, 0b00000100      ; endlich fertig
rcall lcd_command


Vielleicht wird auch so klar, was gemacht wird...


Volker

Autor: Volker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Success, yeah!

Hab's in C 'raus:

   // zuerst den 4Bit-Modus einschalten
   // ...
   // lcd_command(0x28); ist für 2zeilig ausgelegt - stattdessen:

   lcd_command(0b00100100);  // DB5=1: 4-bit-Modus; DB2=1: Extension-Bit 
einschalten
   _delay_ms(5);

   lcd_command(0b00001001);  // DB3=1 ^ DB0=1 : 4zeilig einschalten
   _delay_ms(5);

   lcd_command(0b00100000);  // DB2=0: Extension-Bit wieder ausschalten
   _delay_ms(5);

   // danach die weiteren Einstellungen

Die delays sind sicher zu lang, kann man ja noch anpassen.

Deine Bemühungen um den Assembler-Code, Volker, waren aber nicht 
umsonst, die werde ich als nächstes testen.

Danke Euch allen erstmal für Eure schnelle Hilfe!

Schönes Bastelwochenende noch :-)

Volker

Autor: Volker Schulz (volkerschulz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Volker schrieb:
> Die delays sind sicher zu lang, kann man ja noch anpassen.

Ja, der Controller im Display ist recht schnell im Vergleich zu manch 
anderem.


> Deine Bemühungen um den Assembler-Code, Volker, waren aber nicht
> umsonst, die werde ich als nächstes testen.

Das brauchst Du nicht, ist naemlich genau das Gleiche! ;)


Volker

Autor: Volker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Volker Schulz schrieb:
> Das brauchst Du nicht, ist naemlich genau das Gleiche! ;)

Ou, ich sehs jetzt :-)) Klar...

Bis bald...

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Volker schrieb:
> Die delays sind sicher zu lang, kann man ja noch anpassen.

Busy-Flag-Auswerting bringt erhebliche (aka maximale praktikable) 
Beschleunigung und schont die Nerven wenn das _delay* (aus welchem Grund 
auch immer, seis ein kaputter Quarz oder ein falscher welcher oder zu 
niedrige Temperatur oder wasauchimmer) mal nicht klappert. BTDT :-)

HTH und HF mit dem Vierzeiler ;-)

Autor: Volker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, das ist einzusehen. Ich hab das Ding jetzt so verdrahtet, wie die 
lcd-routines das vorsehen, da ist die RW-Leitung fest auf Masse gelötet. 
Muesste ich kurz umlöten auf den PD6, damit ich das Busy abfragen kann.

Kommt... :-)

Was hat Peter Fleury denn zu bieten, sind da bessere Routinen dabei?

Danke und Grüße

Volker

Autor: Volker Schulz (volkerschulz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Volker schrieb:
> Ja, das ist einzusehen. Ich hab das Ding jetzt so verdrahtet, wie die
> lcd-routines das vorsehen, da ist die RW-Leitung fest auf Masse gelötet.
> Muesste ich kurz umlöten auf den PD6, damit ich das Busy abfragen kann.

Jau, auf Busy-Flag habe ich aber auch verzichtet. Ich uebertrage ohnehin 
nur seriell Daten vom Rechner ueber ATMEGA8 und dann auf's Display. 
Immer volle 4x20 Zeichen und dann (zur Sicherheit) Cursor Home. Alle 
100ms einen kompletten Screen mit 9600bps... Klappt prima und laeuft 
absolut stabil, da nach "Cursor Home" ja noch ein paar ms bis zur 
naechsten Uebertragung uebrig sind. ;)

Also werden Delays bei mir nur waehrend der Initialisierung benutzt.

Volker

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.