www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probleme mit T6963


Autor: Marko B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
#define DATA p0
#define DATA_DIR pd0

#define CD p1_0
#define CD_DIR pd1_0
#define CE p1_1
#define CE_DIR pd1_1
#define RD p1_2
#define RD_DIR pd1_2
#define WR p1_3
#define WR_DIR pd1_3

#define STA0 0x01
#define STA1 0x02

int lcd_init(void);
void lcd_wr_cmd(unsigned char cmd);
void lcd_wr_data(unsigned char data);
unsigned char lcd_rd_data(void);

t6963.c:
#include "t6963.h"
#include "skp_bsp.h"

int lcd_check_status(void);
void lcd_test_status(void);

inline void nop(void)
{
  _asm("NOP");
}

int lcd_init(void)
{
  int i;

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

  lcd_wr_data(0x00);
  lcd_wr_data(0x02);
  lcd_wr_cmd(0x42);    // graphics home address (0x200)

  lcd_wr_data(0x16);
  lcd_wr_data(0x00);
  lcd_wr_cmd(0x43);    // graphics area set

  lcd_wr_data(0x00);
  lcd_wr_data(0x00);
  lcd_wr_cmd(0x40);    // text home address (0x0000)

  lcd_wr_data(0x16);
  lcd_wr_data(0x00);
  lcd_wr_cmd(0x41);    // text area set

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

  lcd_wr_cmd(0x97);    // display mode

  lcd_wr_data(0x00);
  lcd_wr_data(0x00);
  lcd_wr_cmd(0x24);    // set address pointer


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

  return 0;
}


void lcd_wr_cmd(unsigned char cmd)
{
  lcd_test_status();

  DATA_DIR = 1;
  RD = 1;
  CD = 1;
  DATA = cmd; nop();
  CE = 0;
  WR = 0;
  nop(); nop();
  WR = 1;
  CE = 1;
  DATA_DIR = 0;
}


void lcd_wr_data(unsigned char data)
{
  lcd_test_status();

  DATA_DIR = 1;
  RD = 1;
  CD = 0;
  DATA = data; nop();
  CE = 0;
  WR = 0;
  nop(); nop();
  WR = 1;
  CE = 1;
  CD = 1;
  DATA_DIR = 0;
}


unsigned char lcd_rd_data(void)
{
  unsigned char data;

  lcd_test_status();

  DATA_DIR = 0;
  WR = 1;

  CD = 0;
  CE = 0;
  RD = 0;
  nop(); nop(); nop(); nop();
  data = DATA;
  RD = 1;
  CE = 1;
  DATA_DIR = 1;
  CD = 1;

  return data;
}


int lcd_check_status(void)
{
  int i;

  /* 20ms delay */
  for (i=0;i<50;i++) {
    _asm("NOP"); _asm("NOP"); _asm("NOP"); _asm("NOP");
_asm("NOP");
    _asm("NOP"); _asm("NOP"); _asm("NOP"); _asm("NOP");
_asm("NOP");
  }

  return 0;
}


void lcd_test_status(void)
{
  while (lcd_check_status() != 0)
    ;
}

Autor: Benedikt (Gast)
Datum:

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

Autor: Marko B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: thkais (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ermahnung (Gast)
Datum:

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

Autor: Marko B. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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? ;-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.