Forum: Mikrocontroller und Digitale Elektronik 2te LCD Zeile bleibt aus!


von elomt (Gast)


Angehängte Dateien:

Lesenswert?

Hallo

Habe schon gesucht aber nichts passendes gefunden.

Mein Problem ist das ich bei meinem 2x16 Display nicht die zweite Zeile 
aktiviert bekomme. Bei einem Assambler Projekt funktionierten beide 
Zeilen.
Habe mal die lcd.c angehangen.

Vielleicht findet ja Jemand den Fehler.

(ATMEGA8 und C)

Vielen Dank
elomt

von Jadeclaw D. (jadeclaw)


Lesenswert?

Schreib mal das Display hintereinanderweg Zeichen für Zeichen voll und 
laß dir gleichzeitig am Displayanfang die Position anzeigen. Und notiere 
den Offset, wenn das erste Zeichen in der zweiten Zeile erscheint.
Dieser Offset ist hier: case 2: tmp=0x80+0x40+x; break; einzutragen. 
Nämlich da, wo die 0x40 steht. Alternativ mal den Cursor auf Zeile 3 
oder 4 setzen. Und ggfs. die Offsets auch dort anpassen, falls das erste 
Zeichen bei set_cursor(0, Zeile); nicht am Zeilenanfang steht.

Leider ist es so, daß manche Displays eine merkwürdige Adreßzuordnung 
haben. Die Offsetwerte in dieser Funktion muß ich auch regelmäßig 
anpassen.

1
void set_cursor(uint8_t x, uint8_t y)
2
{
3
  uint8_t tmp;
4
5
  switch (y) {
6
    case 1: tmp=0x80+0x00+x; break;
7
    case 2: tmp=0x80+0x40+x; break;
8
    case 3: tmp=0x80+0x10+x; break;
9
    case 4: tmp=0x80+0x50+x; break;
10
  
11
  }
12
  lcd_command(tmp);
13
}

Gruß
Jadeclaw.

von holger (Gast)


Lesenswert?

lcd_command(0x30);    // 3 mal 0x30 ins Steuerregister schreiben

Warum tust du nicht einfach das was da als Kommentar steht?

von elomt (Gast)


Lesenswert?

Hi

Habe den Fehler endlich gefunden.

Die Pausen zwischen den Befehlen waren zu kurtz.


Trozdem Vielen Dank
elomt

von Jadeclaw D. (jadeclaw)


Lesenswert?

@Holger: Macht er doch.
1
  lcd_command(0x30);  // 3 mal 0x30 ins Steuerregister schreiben
2
  _delay_ms(10);
3
  lcd_enable();
4
  _delay_ms(10);
5
  lcd_enable();
Das lcd_command(0x30); schreibt die 0x30 das erste mal in den Port und 
danach ins Display. die zwei nachfolgenden lcd_enable(); schreiben die 
0x30 noch zweimal ins Display. Da die 0x30 noch im Port stehen, reicht 
es, die Enable-Leitung zweimal zu toggeln. Im 4-Bit-Modus geht das 
natürlich nicht so einfach, an den übertragenen Werten ist aber zu 
erkennen, hier wird im 8-Bit-Modus gearbeitet.

@elomt: Prozessortakt an den vorgesehenen Stellen eingetragen? #define 
F_CPU, Makefile oder Projekteinstellungen, falls GCC im AVRStudio. 
Danach stimmen auch die Delay-Zeiten. Wobei - Manche Displays sind aber 
auch echte Schlaftabletten...

Gruß
Jadeclaw.

von holger (Gast)


Lesenswert?

>@Holger: Macht er doch.

Ich weiß.

>  lcd_command(0x30);  // 3 mal 0x30 ins Steuerregister schreiben
>  _delay_ms(10);
>  lcd_enable();
>  _delay_ms(10);
>  lcd_enable();

Wenn er statt dem unübersichtlichen Kram da oben
dreimal lcd_command(0x30); geschrieben hätte,
würde ihm hinter dem letzten lcd_enable();
auch kein kurzes delay fehlen ;)

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.