Moin,
ich hab mir das Display 162 von Displaytech gekauft und möchte es nun im
4Bit Modus betreiben.
Ich hab nun folgendes Problem:
das Display lässt sich nur dann initialisieren und mit Zeichen füttern,
wenn die ISP an den Prozessor (ATMega8 16MHz) angeschlossen ist.
Nehm ich die ISP ab und leg die Versorgungsspannung neu an, hab ich nur
die schwarzen Balken. Auch eine Neuinitialisierung per Tastendruck
klappt im Betrieb nicht.
Laut meinen Logikanalyser werden alle Zeiten nach dem Datenblatt richtig
eingehalten.
Kann es evt an die Anlaufzeit vom Mikrocontroller o.ä. liegen oder dem
Reset was die ISP auslöst?
Wär schön wenn jemand das Problem kennt, hab leider beim googlen nichts
dazu gefunden.
Hiernochmal meine Initialisierung (Übernommen von dem Hersteller des
Displaycontrollers ST7066U):
1
voidlcd_init_();
2
{
3
...
4
LOW_EN;
5
LOW_RS;
6
LOW_RW;
7
LOW_RS;
8
delayms(40);
9
10
HI_EN;
11
long_delay();
12
DATA=0x30;
13
long_delay();
14
LOW_EN;
15
long_delay();
16
17
lcd_write_cmd(0x28);
18
lcd_write_cmd(0x28);
19
lcd_write_cmd(0x0F);
20
lcd_write_cmd(0x01);
21
delayms(2);
22
lcd_write_cmd(0x06);
23
}
1
voidlcd_write_cmd(unsignedcharcmd)
2
{
3
HI_EN;
4
short_delay();
5
DATA=(cmd&0xf0);
6
long_delay();
7
LOW_EN;
8
long_delay();
9
10
HI_EN;
11
short_delay();
12
DATA=(cmd<<4);
13
long_delay();
14
LOW_EN;
15
long_delay();
16
}
MfG
Matthias S.
PS: Ein long_delay() hat eine Zeit von 1ms
Schon mal kontrolliert ob dein delayms(40) wirklich 40msec wartet.
Ich habe einige, zugegebenermassen ältere, Display, da tut sich unter
50msec PowerOnTime gar nichts.
Eventuell auch in den Fuses lange Starttime einstellen.
Ja, das tut sie.
Ich hab die Anlaufzeit des Mikrocontrollers auf Ext. Crystal/Resonator
High Freq: Start-up time 16CK + 64ms gesetzt.
Ich hab mich auch schon gefragt ob die angeschlossene ISP beim Anlegen
der Versorgungsspannung den Mikrocontroller zusätzlich resettet, aber
laut Oszilloskop wird das Reset nur am Start ausgeführt.
@Falk
Die Masseverbindung scheint wohl i.O. zu sein.
@Gast
Die Spannungsversorgung ist stabil und beim Einschalten mit und ohne ISP
steigt sie in der selben Zeit auf 5V an.
@HubertG
Wenn ich den Reset manuell ausführe läuft das Display.
Welche Wartezeit meinst du? Vor der Initialisierung oder die Zeit bevor
der Mikrocontroller arbeiten darf?
void lcd_init_();
{
...
LOW_EN;
LOW_RS;
LOW_RW;
LOW_RS;
delayms(40);
Setze mal das delayms(40) auf 100 oder mehr....
Dann gibst Du dem Display mehr Zeit zu starten.
Gruß Sven
Wenn es mit manuellem Reset läuft, dann hat es mit dem ISP nichts zu
tun.
Ich meine die Wartezeit vor dem initialisieren. Ich nehme an das die
PowerOn-Wartezeit zu kurz ist. Füge einfach noch ein paar delayms(40)
ein, du kannst sie ja dann schrittweise reduzieren.
@Sven K.
Das hab ich mir auch zuerst gedacht, vorallem da die in den meisten
Threats ein falsches Timing die Ursache war. Aber es geht auch nicht mit
einem Delay von t>40ms.
Also wenn ich den Reset manuell ausführe, geht die Schaltung auch ohne
ISP. Jedoch nur nach dem 2ten Reset.
Ich hab auch schon einen Konensator nach Masse an die Resetschaltung
angelegt um die Resetzeit ein bischen zu verlängern. Das bringt aber
auch nichts.
Da fehlt die übliche sichere Initialisierung mit 2* 8Bit-Modus und dann
4Bit-Modus.
Nur diese bringt Dich immer zuverlässig in den 4Bit Modus, sowohl beim
Einschalten, als auch bei einem Restart nach dem 1. Nibble.
Peter
An dem Reset liegt es auch nicht. Wenn ich im Betrieb die
Initialisierung mit einer Taste auslöse geht das Display nur nach jeder
zweiten Iitialisierung
Ich hab nun zu begin einen Delay von 150ms und zwischen jeder
Registereinstellung einen zusätzlichen Delay vom 10ms eingefügt.
Leider läuft das Programm doch nicht so ganz. Ich muss die
Registerinitialisierung 2x aufrufen damit das Programm immer und normal
läuft.
Damit sieht mein Programm etwa so aus
1
...
2
delayms(50);
3
for(i=0;i<2;i++)
4
{
5
HI_EN;
6
long_delay();
7
DATA=0x30;
8
long_delay();
9
LOW_EN;
10
long_delay();
11
12
13
lcd_write_cmd(0x28);
14
lcd_write_cmd(0x28);
15
lcd_write_cmd(0x02);
16
lcd_write_cmd(0x06);
17
lcd_write_cmd(0x0C);
18
lcd_write_cmd(0x01);
19
delayms(50);
20
}
21
...
Zeichen lassen sich nun ganz normal anzeigen.
Es ist zwar nicht eine elegante Lösung, aber ich lass es erstmal so.
Vlt. fällt jmd noch was uaf.
MfG und vielen Dank
Matthias
Nein, sie erzeugen zwischendurch keine Impulse am Display.
Laut Logikanalyser wird:
1.) EN auf Hi gesetzt
2.) Nach 800us 0011 xxxx an DB7 ... DB0 gelegt
3.) Nach 800us EN auf Low gesetzt
Laut dem Datenblatt des Herstellers der Chips ST7066U wird damit
zunächst der Modus auf 8Bit gesetzt. Der Hertseller schreibt zwar 0x38,
aber in seinem Unterprogramm wird nur das oberste Nibble an den
Datenport angelegt.
@ Jan (Gast)
>Müssen die Zeiten ziemlich genau eingehalten werden
Nein.
>oder genügt die>richtige Reihenfolge bei einhaltung der Minimalzeiten`?
Ja.
MfG
Falk
So,es geht jetzt. Zwar hatte ich 3x 0x30 auf die Datenports D7...D4
gelegt, hab aber das anschließende 0x20 vergessen.
MfG und vielen Dank an die Helfer
Hier steckt auch noch eine Unschärfe drin. Der Ruhepegel von ENA ist
LOW. Du hälst ihn aber auf HIGH! Das kann mal schief gehen. Mach es wie
im Dateblatt.
MfG
Falk
Das hatte ich im Zeitdiagramm des Datenblatts so herausgelesen. Da wurde
erst EN auf High gesetzt und nach einer kurzen Zeit das Bibble angelegt
und anchließend nach einem Delay EN zur Übernahme des Nibbles auf Low
gezogen.
Aber das kann ich ja eh auf
1
DATA=0x30;
2
for(i=0;i<3;i++)
3
{
4
HI_EN;
5
long_delay();
6
LOW_EN;
7
delayms(6);
8
}
ändern, da das Nibble nur vor der neg. Flanke anliegen muss.