mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik T6963C initialisierung


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Dominik (Gast)
Datum:
Angehängte Dateien:

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

Autor: Sauger (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

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

MfG

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

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

MfG Spess

Autor: Dominik (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Interessanterweise haben Änderungen an der Grafikarea und Textarea keine 
Auswirkungen.

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

Autor: spess53 (Gast)
Datum:

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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein Busy Check sieht bei mir so aus:
//##########################################################
void CheckBusy(void)
//##########################################################
{
 unsigned char by;

 DATA_DIR_IN; //DatenPort auf Eingang zum lesen
 CTRL;    //Status Register lesen

 do         //Schleife Status Bits checken
  {
   CE_OFF;
   RD_OFF;
   NOP;    //Ein Waitstate für 8 MHZ
   NOP;    //plus noch einen für 16 MHZ
   by=READ_DATA; //Status lesen
   RD_ON;
   CE_ON;
  }while((by&3) != 3); //Solange STA0 oder STA1 = 0

 DATA;   //Zurück auf DisplayDaten schreiben
}

Autor: Daniel (Gast)
Datum:

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

Autor: Hans (Gast)
Datum:

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

Autor: Daniel M. (daniel_91)
Datum:

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

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.