Display funktioniert nur mit angeschlossener ISP

OP #1365678
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
OP #1365697
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.
OP #1365731
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?
OP #1365751
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.
OP #1365817
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
#1365821
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
OP #1365844
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.
Angehängte Dateien:
#1366884
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
OP #1367924
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
}
#1367937
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
OP #1368340
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren