Forum: Mikrocontroller und Digitale Elektronik Probleme mit T6963


von Marko B. (Gast)


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
}

von Benedikt (Gast)


Lesenswert?

Ich tippe auf den Status Check.
Die for Schleife macht nämlich nie im Leben 20ms, sondern eher 20us,
wenn überhaupt...

von Marko B. (Gast)


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.

von thkais (Gast)


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.

von Ermahnung (Gast)


Lesenswert?

156 Zeilen langen Code bitte das nächste mal als Anhang beifügen! Danke.

von Marko B. (Gast)


Angehängte Dateien:

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? ;-)

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.