mikrocontroller.net

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


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

Bewertung
0 lesenswert
nicht 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
void lcd_init( void )
{//Power-ON
_delay_ms(30); 
//Funktion Set (0010 0010 NF--) --> (0010 0010 1110)
lcd_write_instruction(0x02);
lcd_write_instruction(0x02);
lcd_write_instruction(0x0E);
_delay_us(45);

//Display on/off control (0000 1DCB) --> (0000 1111)
lcd_write_instruction(0x00);
lcd_write_instruction(0x0F);
_delay_us(45);

///Display clear (0000 0001)
lcd_write_instruction(0x00);
lcd_write_instruction(0x01);
_delay_ms(2);

//Entry Mode Set (0000  01(ID)(SH)) --> (0000 0110)
lcd_write_instruction(0x00);
lcd_write_instruction(0x06);
}

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

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

Vielen Dank für eure Hilfe!

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Klaus Wachtler (mfgkw)
Datum:

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

Autor: Fabian (Gast)
Datum:

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

Autor: Klaus Wachtler (mfgkw)
Datum:

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

Autor: holger (Gast)
Datum:

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

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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hübsch, das Häschen?

Autor: Fabian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
// Sendet eine 4-bit Ausgabeoperation an das LCD
static void lcd_out( uint8_t data )
{
    data &= 0xF0;                       // obere 4 Bit maskieren
 
    LCD_PORT &= ~(0xF0>>(4-LCD_DB));    // Maske löschen
    LCD_PORT |= (data>>(4-LCD_DB));     // Bits setzen
    lcd_enable();
}

Schritt für Schritt:
data &= 0xF0; 
In unserem Beispiel(0x30 übergeben) also: data = 0b00110000 & 
0b11110000;
LCD_PORT &= ~(0xF0>>(4-LCD_DB));
Hier passiert folgendes: PORTD = PORTD &~(0xF0>>4-PD0)
dazu passend die Defines:
#define LCD_PORT      PORTD
#define LCD_DDR       DDRD
#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.

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

Bewertung
0 lesenswert
nicht lesenswert
>Leider scheint Ihr einfach
>keine Lust zu haben produktiv zu helfen...

Du hast aber ein dünnes Fell;)

Funktioniert der Anhang?

Autor: Fabian (Gast)
Datum:

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

Autor: holger (Gast)
Datum:

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

Autor: Fabian (Gast)
Datum:

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

Autor: Oliver Ju. (skriptkiddy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die LCD-Lib von Peter Fleury ist ganz gut. Die findest du hier:
http://homepage.hispeed.ch/peterfleury/avr-softwar...

Skriptkiddy

Autor: Fabian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke,

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

lcd.h ist angepasst!

Autor: Oliver Ju. (skriptkiddy)
Datum:

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

Autor: Fabian (Gast)
Datum:

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

Autor: Fabian (Gast)
Datum:

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

Autor: Oliver Ju. (skriptkiddy)
Datum:

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

skriptkiddy

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

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

Autor: Manuel Schneider (doc-snyder)
Datum:

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

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.