Forum: Mikrocontroller und Digitale Elektronik Display funktioniert nur mit angeschlossener ISP


von Matthias S. (lecorde)


Lesenswert?

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
void lcd_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
void lcd_write_cmd(unsigned char cmd)
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

von Hubert G. (hubertg)


Lesenswert?

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.

von Matthias S. (lecorde)


Lesenswert?

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.

von Hubert G. (hubertg)


Lesenswert?

Ohne angesteckten ISP ein Reset ausführen, kein Power On, dann weisst du 
ob es der ISP oder die zu kurze Wartezeit ist.

von Gast (Gast)


Lesenswert?

Oder ISP filtert die Versorgungsspannung.

von Falk B. (falk)


Lesenswert?

Masseverbindung OK?

von Matthias S. (lecorde)


Lesenswert?

@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?

von Sven K. (Gast)


Lesenswert?

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

von Hubert G. (hubertg)


Lesenswert?

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.

von Matthias S. (lecorde)


Lesenswert?

@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.

von Peter D. (peda)


Lesenswert?

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

von Matthias S. (lecorde)


Lesenswert?

Die Initialisierung mit 2* 8Bit müsste doch mit
1
  HI_EN;
2
  long_delay();
3
  DATA = 0x30;
4
  long_delay();
5
  LOW_EN;
6
  long_delay();

gemacht werden oder?

Nochwas: Ich hab die Pins D0-D3 auf Gnd, könnt das evt. das Problem 
sein?

MfG
Matthias

von Falk B. (falk)


Lesenswert?

@  Matthias S. (lecorde)

>Nochwas: Ich hab die Pins D0-D3 auf Gnd, könnt das evt. das Problem
>sein?

JAAA! Die müssen offen bleiben!

MfG
Falk

von Matthias S. (lecorde)


Lesenswert?

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.

von Matthias S. (lecorde)


Lesenswert?

Hmpf, mir ein jemand dazu geraten die an Masse anzuschliessen...

Aber super, es geht nun, danke an allen.

MfG
Matthias

von Falk B. (falk)


Lesenswert?

@  Matthias S. (lecorde)

>Hmpf, mir ein jemand dazu geraten die an Masse anzuschliessen...

Das gilt oft, aber nicht immer :-0

MfG
Falk

von Matthias S. (lecorde)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

Matthias S. schrieb:
> Die Initialisierung mit 2* 8Bit müsste doch mit
>
1
>   HI_EN;
2
>   long_delay();
3
>   DATA = 0x30;
4
>   long_delay();
5
>   LOW_EN;
6
>   long_delay();
7
>
>
> gemacht werden oder?

Nö, das ist nur ein E-high-Puls.
Die 3 Delays erzeugen doch keine Pulse?


Peter

von Matthias S. (lecorde)


Angehängte Dateien:

Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

Im 4-Bit Modus muss das 0x30 dreimal hintereinander per ENA geschrieben 
werden. Mit kleiner werdenden Pausen. Erst ~4ms, dann noch ~100us.

MFG
Falk

von Jan (Gast)


Lesenswert?

Müssen die Zeiten ziemlich genau eingehalten werden oder genügt die 
richtige Reihenfolge bei einhaltung der Minimalzeiten`?

von Michael U. (amiga)


Lesenswert?

Hallo,
1
lcd_init:
2
   rcall   lcd_reset
3
4
   ldi     TEMP_A,$28                  ; 4Bit - Mode, 2 Zeilen
5
   rcall   lcd_control
6
7
   ldi     TEMP_A,$80                  ; DDRAM auf Anfang
8
   rcall   lcd_control
9
10
   ldi     TEMP_A,$01                  ; Display löschen
11
   rcall   lcd_control
12
13
   rcall   wait_5ms
14
15
   ldi     TEMP_A,$06                  ; Increment, Not Shiftet
16
   rcall   lcd_control
17
18
   ldi     TEMP_A,$10                  ; Cursor Move, Shift off
19
   rcall   lcd_control
20
21
   ldi     TEMP_A,$0C                  ; Display an, Cursor aus
22
   rcall   lcd_control
23
24
   ret
25
26
;*********************************************************************
27
;  Write LCD-Reset...  keine Daten, kein Busy
28
;
29
;  Scratch-Reg: TEMP_A
30
;*********************************************************************
31
32
lcd_reset:
33
   rcall   wait_5ms
34
   rcall   wait_5ms
35
   rcall   wait_5ms
36
37
   cbi     LCD_CTRL,LCD_RS      ; Register auf Control
38
39
   ldi     TEMP_A,$03        ; D4...7 an Bit 0...3
40
   out     LCD_OUT,TEMP_A
41
42
   rcall   lcd_clock
43
44
   rcall   wait_5ms
45
46
   rcall   lcd_clock
47
48
   rcall   wait_5ms
49
50
   rcall   lcd_clock
51
52
   rcall   wait_5ms
53
54
   ldi     TEMP_A,$02                  ; 4Bit - Mode
55
   rcall   lcd_clock
56
57
   rcall   wait_5ms
58
59
   ret
60
61
;*********************************************************************
62
;  Clock LCD E-Impuls
63
;
64
;  Scratch-Reg: ---
65
;*********************************************************************
66
67
lcd_clock:
68
69
   sbi     LCD_CTRL,LCD_E          ; E auf 1    ; 750nS
70
   nop
71
   nop
72
   nop
73
   nop
74
   nop
75
   nop
76
   cbi    LCD_CTRL,LCD_E          ; E auf 0
77
78
   ret

 Ist zwar ASM, aber Du kannst ja mal vergleichen.
 Hier mit Software-Reset des Display mit den 3x 0x30 senden.

Gruß aus Berlin
Michael

von Falk B. (falk)


Lesenswert?

@  Jan (Gast)

>Müssen die Zeiten ziemlich genau eingehalten werden

Nein.

>oder genügt die
>richtige Reihenfolge bei einhaltung der Minimalzeiten`?

Ja.

MfG
Falk

von Matthias S. (lecorde)


Lesenswert?

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
1
void lcd_init(void)
2
{
3
...
4
  DATA_OUTPUT();
5
  LOW_EN;
6
  LOW_RS;
7
  LOW_RW;
8
  LOW_RS;
9
  delayms(16);
10
11
  for(i=0;i<3;i++)
12
  {
13
    HI_EN;
14
    long_delay();
15
    DATA = 0x30;
16
    long_delay();
17
    LOW_EN;
18
    long_delay();
19
    delayms(6);
20
  }
21
22
  HI_EN;
23
  long_delay();
24
  DATA = 0x20;
25
  long_delay();
26
  LOW_EN;
27
  delayms(6);
28
29
  lcd_write_cmd(0x28);
30
  lcd_write_cmd(0x80);
31
  lcd_write_cmd(0x01);
32
  delayms(6);
33
  lcd_write_cmd(0x06);
34
  lcd_write_cmd(0x10);
35
  lcd_write_cmd(0x0C);
36
  delayms(6); 
37
}

von Falk B. (falk)


Lesenswert?

@  Matthias S. (lecorde)
1
  for(i=0;i<3;i++)
2
  {
3
    HI_EN;
4
    long_delay();
5
    DATA = 0x30;
6
    long_delay();
7
    LOW_EN;
8
    long_delay();
9
    delayms(6);
10
  }

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

von Matthias S. (lecorde)


Lesenswert?

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.

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.