Forum: Mikrocontroller und Digitale Elektronik T6963C initialisierung


von Dominik (Gast)


Angehängte Dateien:

Lesenswert?

Hey,

ich sitze nun seit einigen Stunden an meinem LCD Display:

http://www.lcd-module.de/pdf/grafik/dip240-7.pdf

Wie der angehängte Code zeigt, initialisiere ich das Display indem ich 
Grafik/Text Home/Area Adressen setze und anschließend den Speicher 
säubere.

Letzteres scheint leider nicht zu funktionieren da das Display voll ist 
mit "7" im Text-Mode(Grafik off) und im Grafik-Mode(Text off) mit 
Balken.

Ich vermute dass es an der Art der Speichersäuberung liegt denn sonst 
scheint mich der t6963c ja zu verstehen (Mode-Wechsel).


Interessant ist auch, dass vor der speichersäuberung nur die Hälfte des 
Bildschirms voll ist mit den Balken/"7"


Hat jemand Erfahrung mit dem T6963c und kann mir sagen, was ich falsch 
mache?

Hier noch der Code. betrieben mit einem ATXMega128.


/*
 * lcd_driver.c
 *
 * Created: 03.03.2012 19:53:09
 *  Author:
 */
#define F_CPU 32000000
#include <avr/io.h>
#include <stdlib.h>
#include <util/delay.h>

#define LCD_DATA PORTK
#define LCD_CMD  PORTA

#define LCD_CE    PIN0_bm
#define LCD_nRST  PIN1_bm   //LowActive Reset
#define LCD_RD    PIN2_bm
#define LCD_LED    PIN3_bm  //LowActive LED-On
#define LCD_WR    PIN4_bm  //Write/Read
#define LCD_CD    PIN6_bm  //Command/Data


void lcd_Init()
{
  LCD_CMD.DIRSET = LCD_CE;
  LCD_CMD.DIRSET = LCD_nRST;
  LCD_CMD.DIRSET = LCD_RD;
  LCD_CMD.DIRSET = LCD_LED;
  LCD_CMD.DIRSET = LCD_WR;
  LCD_CMD.DIRSET = LCD_CD;

  LCD_CMD.OUTSET = LCD_CE;
  LCD_CMD.OUTSET = LCD_nRST;
  LCD_CMD.OUTSET = LCD_RD;
  LCD_CMD.OUTSET = LCD_LED;
  LCD_CMD.OUTCLR = LCD_WR;
  LCD_CMD.OUTCLR = LCD_CD;

  LCD_DATA.DIRSET = 0xFF;

  lcd_Reset();

  lcd_sendData(0x00);
  lcd_sendData(0x00);
  lcd_sendCommand(0x42);

  lcd_sendData(0x14);

  lcd_sendData(0x00);
  lcd_sendCommand(0x43);

  lcd_sendData(0x00);
  lcd_sendData(0x17);
  lcd_sendCommand(0x40);

  lcd_sendData(0x14);
  lcd_sendData(0x00);
  lcd_sendCommand(0x41);


  lcd_sendCommand(0x80);
  lcd_sendCommand(0x98);

  lcd_clearGfxMem();
  lcd_clearTxtMem();
}


void lcd_Reset()
{
  LCD_CMD.OUTCLR = LCD_nRST;
  _delay_ms(10);
  LCD_CMD.OUTSET = LCD_nRST;
}


void lcd_wait()
{
  uint8_t status;
  LCD_DATA.DIR = 0x00;
  LCD_CMD.OUTCLR = LCD_RD;
  LCD_CMD.OUTSET = LCD_WR;
  LCD_CMD.OUTCLR = LCD_CE;
  LCD_CMD.OUTSET = LCD_CD;

  while (LCD_DATA.IN & 0x03 != 0x03) {}

  LCD_DATA.DIR = 0xff;
  return status;
}

void lcd_sendCommand(uint8_t cmd)
{
  lcd_wait();
  LCD_DATA.OUT = cmd;
  LCD_CMD.OUTSET = LCD_CD;
  LCD_CMD.OUTCLR = LCD_WR;
  LCD_CMD.OUTSET = LCD_RD;

  LCD_CMD.OUTCLR = LCD_CE;
  _delay_us(50);
  LCD_CMD.OUTSET = LCD_CE;
}

void lcd_sendData(uint8_t data)
{
  lcd_wait();
  LCD_DATA.OUT = data;
  LCD_CMD.OUTCLR = LCD_CD;
  LCD_CMD.OUTCLR = LCD_WR;
  LCD_CMD.OUTSET = LCD_RD;

  LCD_CMD.OUTCLR = LCD_CE;
  _delay_us(50);
  LCD_CMD.OUTSET = LCD_CE;
}

void lcd_setAdr(uint8_t msByte, uint8_t lsByte)
{
  lcd_sendData(lsByte);
  lcd_sendData(msByte);
  lcd_sendCommand(0x24);
}


void lcd_clearGfxMem()
{
  lcd_setAdr(0x00, 0x00);

  for(uint16_t i=0; i<0x16FF; i++)
  {
    lcd_sendData(0);
    lcd_sendCommand(0xC0);
  }
}

void lcd_clearTxtMem()
{
  lcd_setAdr(0x17, 0x00);

  for(uint16_t i=0x1700; i<0xFFFF; i++)
  {
    lcd_sendData(0x00);
    lcd_sendCommand(0xC0);
  }
}

von Sauger (Gast)


Angehängte Dateien:

Lesenswert?

Moin,

dein Code ist zu gut dokumentiert um da durchzusteigen. Im Anhang das DB 
zum t6963 achte aufs Timing.

MfG

von spess53 (Gast)


Lesenswert?

Hi

Zumindest deine Werte für Grafik-/Textarea stimmen nicht: 240/8 = 30 
(0x1E).

MfG Spess

von Dominik (Gast)


Lesenswert?

Interessanterweise haben Änderungen an der Grafikarea und Textarea keine 
Auswirkungen.

Kann es vielleicht an den 3,3V liegen die mein XMega nur rausbringt?

von spess53 (Gast)


Lesenswert?

Hi

>Kann es vielleicht an den 3,3V liegen die mein XMega nur rausbringt?

Eigentlich nicht. L.t. Datenblatt erkennt er 2,8V als H.

MfG Spess

von holger (Gast)


Lesenswert?

Ein Busy Check sieht bei mir so aus:
1
//##########################################################
2
void CheckBusy(void)
3
//##########################################################
4
{
5
 unsigned char by;
6
7
 DATA_DIR_IN; //DatenPort auf Eingang zum lesen
8
 CTRL;    //Status Register lesen
9
10
 do         //Schleife Status Bits checken
11
  {
12
   CE_OFF;
13
   RD_OFF;
14
   NOP;    //Ein Waitstate für 8 MHZ
15
   NOP;    //plus noch einen für 16 MHZ
16
   by=READ_DATA; //Status lesen
17
   RD_ON;
18
   CE_ON;
19
  }while((by&3) != 3); //Solange STA0 oder STA1 = 0
20
21
 DATA;   //Zurück auf DisplayDaten schreiben
22
}

von Daniel (Gast)


Lesenswert?

Hallo Dominik,
ich wollte nachfragen wie es um das Projekt mit der Initialisierung 
aussieht? Hast du das am Laufen und könntest mir den Code zu kommen 
lassen?
Bin selber auch daran den T6963 Controller zusammen mit einem 
ATXmega256A3U ans Laufen zu bringen, komme aber nicht ganz klar damit.

MfG Daniel

von Hans (Gast)


Lesenswert?

Daniel schrieb:
> Bin selber auch daran den T6963 Controller zusammen mit einem
> ATXmega256A3U ans Laufen zu bringen, komme aber nicht ganz klar damit.

Woran hängt es denn?
Schaltplan richtig? Sromversorgung ok? Timings passen?

von Daniel M. (daniel_91)


Lesenswert?

Hallo zusammen,

ich habe ebend ein neues Thema eröffnet (ATmega644 Timer1 Interrupt 
unregelmäßig). In dem angehängten Ordner ist auch eine Datei für ein LCD 
mit T6369C drin. Ist zwar in dem Code nur 64 Pixel hoch, aber das kann 
leicht durch die Defines in der h-Datei geändert werden. Der Code 
funktioniert einwandfrei, es sind auch dieverse Grafikfunktionen dabei. 
Ich denke auch, dass er ausreichend dokumentiert ist, um Probleme im 
eigenden Code zu finden und zu beheben.

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.