Probleme mit T6963

Gast #210395
Lesenswert?

Hallo, ich versuche gerade ein LCD mit T6963C Controller zum laufen zu
bringen (128x64 LCD von Pollin). Leider bekomme ich überhaupt nichts
angezeigt. Theoretisch müßten beim Aufruf von lcd_init() 10 "A"s
angezeigt werden. Ich würde mich freuen, wenn jemand meinen Code
überprüfen könnte.

Verdrahtung habe ich überprüft. Der LCD-Reset erfolgt über eine
RC-Kombination (10k-10uF).

Controller: Renesas M16C62P
Taktfrequenz: 24MHz
Board: Renesas SKP16C62P
Compiler: NC30

t6963.h:
1
#define DATA p0
2
#define DATA_DIR pd0
3

4
#define CD p1_0
5
#define CD_DIR pd1_0
6
#define CE p1_1
7
#define CE_DIR pd1_1
8
#define RD p1_2
9
#define RD_DIR pd1_2
10
#define WR p1_3
11
#define WR_DIR pd1_3
12

13
#define STA0 0x01
14
#define STA1 0x02
15

16
int lcd_init(void);
17
void lcd_wr_cmd(unsigned char cmd);
18
void lcd_wr_data(unsigned char data);
19
unsigned char lcd_rd_data(void);

t6963.c:
1
#include "t6963.h"
2
#include "skp_bsp.h"
3

4
int lcd_check_status(void);
5
void lcd_test_status(void);
6

7
inline void nop(void)
8
{
9
  _asm("NOP");
10
}
11

12
int lcd_init(void)
13
{
14
  int i;
15

16
  pu00 = 0; pu01 = 0; pu02 = 0;    // turn off pullups
17
  RD = 1; WR = 1; CE = 1; CD = 1;
18
  CD_DIR = 1; CE_DIR = 1; RD_DIR = 1; WR_DIR = 1;
19
  DATA_DIR = 0;
20

21
  lcd_wr_data(0x00);
22
  lcd_wr_data(0x02);
23
  lcd_wr_cmd(0x42);    // graphics home address (0x200)
24

25
  lcd_wr_data(0x16);
26
  lcd_wr_data(0x00);
27
  lcd_wr_cmd(0x43);    // graphics area set
28

29
  lcd_wr_data(0x00);
30
  lcd_wr_data(0x00);
31
  lcd_wr_cmd(0x40);    // text home address (0x0000)
32

33
  lcd_wr_data(0x16);
34
  lcd_wr_data(0x00);
35
  lcd_wr_cmd(0x41);    // text area set
36

37
  lcd_wr_cmd(0x80);    // mode set (OR mode, internal CG)
38

39
  lcd_wr_cmd(0x97);    // display mode
40

41
  lcd_wr_data(0x00);
42
  lcd_wr_data(0x00);
43
  lcd_wr_cmd(0x24);    // set address pointer
44

45

46
  for (i=0;i<10;i++) {
47
    lcd_wr_data(0x21);    // 'A'
48
    lcd_wr_cmd(0xC0);    // write 1 byte
49
  }
50

51
  return 0;
52
}
53

54

55
void lcd_wr_cmd(unsigned char cmd)
56
{
57
  lcd_test_status();
58

59
  DATA_DIR = 1;
60
  RD = 1;
61
  CD = 1;
62
  DATA = cmd; nop();
63
  CE = 0;
64
  WR = 0;
65
  nop(); nop();
66
  WR = 1;
67
  CE = 1;
68
  DATA_DIR = 0;
69
}
70

71

72
void lcd_wr_data(unsigned char data)
73
{
74
  lcd_test_status();
75

76
  DATA_DIR = 1;
77
  RD = 1;
78
  CD = 0;
79
  DATA = data; nop();
80
  CE = 0;
81
  WR = 0;
82
  nop(); nop();
83
  WR = 1;
84
  CE = 1;
85
  CD = 1;
86
  DATA_DIR = 0;
87
}
88

89

90
unsigned char lcd_rd_data(void)
91
{
92
  unsigned char data;
93

94
  lcd_test_status();
95

96
  DATA_DIR = 0;
97
  WR = 1;
98

99
  CD = 0;
100
  CE = 0;
101
  RD = 0;
102
  nop(); nop(); nop(); nop();
103
  data = DATA;
104
  RD = 1;
105
  CE = 1;
106
  DATA_DIR = 1;
107
  CD = 1;
108

109
  return data;
110
}
111

112

113
int lcd_check_status(void)
114
{
115
  int i;
116

117
  /* 20ms delay */
118
  for (i=0;i<50;i++) {
119
    _asm("NOP"); _asm("NOP"); _asm("NOP"); _asm("NOP");
120
_asm("NOP");
121
    _asm("NOP"); _asm("NOP"); _asm("NOP"); _asm("NOP");
122
_asm("NOP");
123
  }
124

125
  return 0;
126
}
127

128

129
void lcd_test_status(void)
130
{
131
  while (lcd_check_status() != 0)
132
    ;
133
}
Gast #210397
Lesenswert?

Danke für den Tip. Ich hatte vorher eine "richtige" Statusabfrage
drin, habe die Funktion aber durch ein Delay ersetzt, um eine
potentielle Fehlerquelle zu eliminieren. Nicht sehr erfolgreich, wie
man sieht. ;-P

Die Schleife läuft jetzt 50.000 mal, was 500.000 NOPs entspricht. Bei
knapp 41ns pro NOP ergibt das jetzt >20ms. Leider war das aber nicht
die Lösung: auf dem Display tut sich immer noch nichts.
Gast #210398
Lesenswert?

Und was ist mit der Hardware? Die meisten Grafik-LCDs brauchen z.B. eine
negative Versorgungsspannung. Wenn die nicht zufällig auf dem Board
produziert wird, dann muss sie von außen zugeführt werden. Ohne diese
negative Spannung ist nix auf dem Display zu sehen. Dann zuckts noch
nicht mal beim Einschalten.
Gast #210400
Lesenswert?

Falls es noch jemanden interessiert: nach langer, verzweifelter Suche
habe ich den Fehler gefunden: statt DATA_DIR = 1 muß es DATA_DIR = 0xff
heissen, sonst wird ja nur das erste Bit von P0 als Ausgang
definiert...

Könnte aber noch was anderes gewesen sein, da ich den Code inzwischen
mehrmals umgepflügt habe. :P

Auf jedenfall funktioniert jetzt mal die Textausgabe inkl.
benutzerdefinierte Zeichen (das Gradzeichen auf dem Foto).

PS @ Ermahnung: wozu denkst Du gibts denn diese tolle neue
Syntax-Highlighting Funktion, hm? ;-)
Angehängte Dateien:

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