Forum: Mikrocontroller und Digitale Elektronik 20x4 Text-Display YM2004A mit KS0066


von Fabian (Gast)


Angehängte Dateien:

Lesenswert?

Guten Tag,

ich möchte gern ein Text Display ansteuern.

Sobald das Display Strom bekommt leuchten die 1. und die 3. Zeile.
Dies zeigt mir also, dass nach dem internen Reset der 1 zeilige Modus 
aktiviert ist.

Nach meiner Initialisierung leuchten alle Zeilen(alle Pixel des Displays 
werden dargestellt).

Mir scheint es, als ob alle weiteren Befehle nach der Umschaltung auf 4 
bit und 2 zeilig keine Wirkung mehr haben.

Beispielsweise sollten mit dem Befehl nach:
//Display off control (0000 1DCB) --> (0000 1111)
-Das Display an sein(D=1)
-Der Cursor an sein(C=1)
-Der Cursor blinken(B=1)

Aber ich sehe wie gesagt nur alle Pixel konstant leuchten.

Es wäre super, wenn Ihr euch kurz meinen Code angucken könntet und mir 
eventuell ein paar Tips geben könntet, woran es liegen kann. Vorgegangen 
bin ich nach dem Flussdiagramm auf Seite 27 im Datenblatt(siehe Anhang).

Bei den Timings habe ich mich einmal relativ genau an das Datenblatt 
gehalten und das 2. mal habe ich einfach nach jedem Befehl E getoggelt 
und etwas gewartet. Beide Versionen zeigen das gleiche Verhalten!

Die Initialisierung, welche ich im Hauptprogramm aufrufe sieht 
folgendermaßen aus:

Die Zahlen in den Kommentaren beschreiben jeweils die Zustände von DB 
4,5,6,7
1
void lcd_init( void )
2
{//Power-ON
3
_delay_ms(30); 
4
//Funktion Set (0010 0010 NF--) --> (0010 0010 1110)
5
lcd_write_instruction(0x02);
6
lcd_write_instruction(0x02);
7
lcd_write_instruction(0x0E);
8
_delay_us(45);
9
10
//Display on/off control (0000 1DCB) --> (0000 1111)
11
lcd_write_instruction(0x00);
12
lcd_write_instruction(0x0F);
13
_delay_us(45);
14
15
///Display clear (0000 0001)
16
lcd_write_instruction(0x00);
17
lcd_write_instruction(0x01);
18
_delay_ms(2);
19
20
//Entry Mode Set (0000  01(ID)(SH)) --> (0000 0110)
21
lcd_write_instruction(0x00);
22
lcd_write_instruction(0x06);
23
}

Die Funktion lcd_write_instruction sieht in der 1. Version so aus:
(Port D ist der Port an den die Display Pins angeschlossen sind)
1
void lcd_write_instruction(uint8_t instruction)
2
{
3
PORTD &= ~(1<<RS);   //RS=0
4
PORTD &= ~(1<<RW);    //RW=0
5
_delay_us (0.1);    //60ns(tSU1) warten
6
PORTD |= (1<<E);    //E=1
7
_delay_us (0.5);    //warte 255ns (450ns(tW)-195ns(tSU2))
8
PORTD |= instruction;   //schreibe DB1-DB4 (unteres Nibble von instruction)  
9
_delay_us (0.5);     //warte 195ns(tSU2)
10
PORTD &= ~(1<<E);    //E=0
11
_delay_us (0.1);     //warte 10ns(tH2)
12
_delay_us (0.5);    //warte 500ns (1000-(10+450+40)
13
_delay_us (40);
14
}

in der 2. Version so:
1
void lcd_write_instruction(uint8_t instruction)
2
{
3
PORTD &= ~(1<<RS);      //RS=0
4
PORTD &= ~(1<<RW);    //RW=0
5
_delay_ms (1);
6
PORTD |= instruction;   //schreibe DB1-DB4 (unteres Nibble von instruction)  
7
PORTD |= (1<<E);    //E=1
8
_delay_ms (1);
9
PORTD &= ~(1<<E);    //E=0
10
_delay_ms (1);
11
}

Vielen Dank für eure Hilfe!

von holger (Gast)


Lesenswert?


von Klaus W. (mfgkw)


Lesenswert?

Schwer zu sagen, aber beide wollen nicht mit dem Tutorial anfangen,
sondern ihre Fehler lieber indivuell nachgetragen bekommen.

von Fabian (Gast)


Lesenswert?

Hallo,

um die Verwirrung aufzuklären: Jörg sitzt daneben ;)!

In unserer Nachtschicht sind wir nun immerhin ein Stück weiter gekommen.
Für produktive Hilfe wären wir sehr dankbar.

Gruß

von Klaus W. (mfgkw)


Lesenswert?

Wenn ihr voran kommen wollt: wieso nehmt ihr nicht einfach 
funktionierenden Quelltext aus dem Forum?

Es macht doch keinen Sinn, wenn jeder das Rad neu erfindet und hier
noch die Leute beschäftigt.
Und das noch gleich doppelt...

von holger (Gast)


Lesenswert?

>um die Verwirrung aufzuklären: Jörg sitzt daneben ;)!

Und neben mir sitzt ein weisses Kaninchen. Ungefähr 2m groß.

von Klaus W. (mfgkw)


Lesenswert?

Hübsch, das Häschen?

von Fabian (Gast)


Lesenswert?

Wir versuchen zu verstehen was wann und warum gemacht wird.
Im ersten Funktionstest haben wir den Code aus dem Tutorial genommen - 
leider auch ohne Erfolg.

Wenn wir uns aber am Tutorial entlag arbeiten wollen, haben wir mehrere 
Probleme.

Die Initialisierung im Tutorial ist folgendermaßen aufgebaut:

-Ausgänge setzen
-Ausgänge auf Null
-warten
(soweit ist es klar)

-3 maliger Soft-Reset mit der Funktion lcd_out

springen wir also zu der Funktion lcd_out und übergeben 0x30 für den 
Soft-Reset

lcd_out sieht so aus:
1
// Sendet eine 4-bit Ausgabeoperation an das LCD
2
static void lcd_out( uint8_t data )
3
{
4
    data &= 0xF0;                       // obere 4 Bit maskieren
5
 
6
    LCD_PORT &= ~(0xF0>>(4-LCD_DB));    // Maske löschen
7
    LCD_PORT |= (data>>(4-LCD_DB));     // Bits setzen
8
    lcd_enable();
9
}

Schritt für Schritt:
1
data &= 0xF0;
In unserem Beispiel(0x30 übergeben) also: data = 0b00110000 & 
0b11110000;
1
LCD_PORT &= ~(0xF0>>(4-LCD_DB));
Hier passiert folgendes: PORTD = PORTD &~(0xF0>>4-PD0)
dazu passend die Defines:
1
#define LCD_PORT      PORTD
2
#define LCD_DDR       DDRD
3
#define LCD_DB        PD0
also werden die 4 1sen (von 0xF0) um 4 oder 3 Bits nach rechts 
geschoben, je nachdem ob PD0 gerade 0 oder 1 ist. Anschließend wird 
verneint.

.....................................





Ich hatte schon angefangen unsere Probleme Schritt für Schritt mit 
Quelltext am Tutorium entlang zu beschreiben. Leider scheint Ihr einfach 
keine Lust zu haben produktiv zu helfen... daher verscuchen wir es 
lieber in einem anderen Forum.

Es ist echt schade, dass es Anfängern(die nicht einfach mit copy und 
paste "programmieren" wollen) so schwer gemacht wird.

von holger (Gast)


Angehängte Dateien:

Lesenswert?

>Leider scheint Ihr einfach
>keine Lust zu haben produktiv zu helfen...

Du hast aber ein dünnes Fell;)

Funktioniert der Anhang?

von Fabian (Gast)


Lesenswert?

Hi nochmal,

mit der Datei im Anhang leuchtet auch das komplette Display(wie vorher 
auch).

ABER: wenn ich schräg auf das Display gucke kann ich erkennen, dass die 
ersten Zeichen der 4 Zeilen etwas dunkler sind - also teilweise dunkler 
(könnte Schrift sein?).

Das spricht also dafür, dass der Kontrast viel zu hoch ist ?

Ich habe wie im Tut beschriben den Pin direkt auf Masse gelegt.


Nochmal um das klar zu stellen. Wir sind für jede Hilfe die wir bekommen 
dankbar!
Ziel war es im Verständnis weiter zu kommen und nicht euch, die ihr 
eventuell nur helfen wollt, zu beschäftigen.

Wenn wir durch das Tutorial alles verstnaden hätten bräuchten wir nicht 
fragen.

Was sollte denn passieren, wenn ich den von dir bereitgestellten code in 
den AVR schreibe?
Und wie sieht der C-Code dazu aus ?

Danke

von holger (Gast)


Lesenswert?

>ABER: wenn ich schräg auf das Display gucke kann ich erkennen, dass die
>ersten Zeichen der 4 Zeilen etwas dunkler sind - also teilweise dunkler
>(könnte Schrift sein?).

>Das spricht also dafür, dass der Kontrast viel zu hoch ist ?

Davon kannst du ausgehen.

von Fabian (Gast)


Lesenswert?

Danke, das hat mir nun endlich weitergeholfen....

Meine Initialisierung scheint zu funktionieren.

Nach Einstellen des Kontrastes(2K Widerstand) kann ich auch

Line1
Line2
Line3
Line4

lesen.

Es wäre toll, wenn du noch den C-code posten könntest - oder erklärst 
welche Bibliothek du benutzt hast.

Dieses LCD scheint nämlich andere Kommandos zu nutzen als das im 
Tutorial verwendete.

Eventuell ist so auch anderen einmal geholfen.

Gruß

von Oliver J. (skriptkiddy)


Lesenswert?

Die LCD-Lib von Peter Fleury ist ganz gut. Die findest du hier:
http://homepage.hispeed.ch/peterfleury/avr-software.html#libs

Skriptkiddy

von Fabian (Gast)


Lesenswert?

Danke,

die Libary habe ich probiert, leider sind dann nur Zeile 1 und 3 des 
Display aktiv.

lcd.h ist angepasst!

von Oliver J. (skriptkiddy)


Lesenswert?

Fabian schrieb:
> die Libary habe ich probiert, leider sind dann nur Zeile 1 und 3 des
> Display aktiv.
Wenn du in der 1. und der 3. Zeile Text siehst, dann funktioniert die 
lib auch. Hier gabs mal ein Problem, dass deinem ähnlich zu sein 
scheint.
Beitrag "4x20 LCD HD44780 - Zeilenumbruch - FleuryLib"

von Fabian (Gast)


Lesenswert?

Hi, danke für die Hilfe.

Ich habe mir den Thread durchgelesen.

Leider scheint bei mir die Initialisierung nicht zu funktionieren, da 
das Display wohl im einzeiligen Modus läuft.

Danke

von Fabian (Gast)


Lesenswert?

Hi Holger,

da du anscheinend die richtigen Befehle sendest und die Reihenfolge der 
Zeilen auch stimmt( außerdem werden alle 4 Reihen erkannt!) wäre es 
super, wenn du uns verraten würdest, wie oder womit du das Display 
ansteuerst.

Danke

von Oliver J. (skriptkiddy)


Lesenswert?

Fabian schrieb:
> lcd.h ist angepasst!
Poste mal den Teil mit den Anpassungen.

skriptkiddy

von holger (Gast)


Angehängte Dateien:

Lesenswert?

>wäre es super, wenn du uns verraten würdest, wie
>oder womit du das Display ansteuerst.

Nimm den Anhang. Schöne konservative LCD Ansteuerung.
Die Zeiten viel zu lang, Delays per NOPs usw.
Funktioniert immer und überall. Sogar unter Wasser;)
Und für Ports die nicht per sbi(), cbi() angesprochen
werden können gibts noch atomaren Zugriff oben drauf falls nötig.
Mit wahlfreier Pinbelegung natürlich..

Der KS066 scheint doch kompatibel zum HD44780 zu sein.
Das angehängte Hexfile ist jedenfalls für HD44780 compiliert.

von Manuel S. (doc-snyder)


Lesenswert?

Hat jemand das Display zum laufen bekommen? Ich habe es mir auch 
gekauft, hätte es aber besser nicht tun sollen. Dem Datenblatt ist 
nichts zu entnehmen. Ich werd noch verrückt. Ich sitze schon seit heute 
mittag um 12 davor aber nicht will funktionieren. Bekomme nur 2 weiße 
balken angezeigt. (Display ist negativ)

Kann mir wer helfen? Atmega32 TQFP, etwickle im AVRStudio 5.

habe Holgers lib schon ausprobiert. Negativ. Fleury funktioniert auch 
nicht. Habe auch schon versucht selbst zu schrieben aber es will nicht. 
Am Konstrast liegts auch nicht. Habe nen 10k Poti und drehe jedes mal 
beim flashen gleich am rad :-D

Grüße

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.