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
voidlcd_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)
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ß
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...
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
staticvoidlcd_out(uint8_tdata)
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.
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
>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.
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ß
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"
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
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
>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.
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