mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik S1D13700 Init Timing Fehler


Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute.

Ich versuche schon länger ein 320x240 Display mit einem EPSON 
S1D1370002A1 zum rennen zu bekommen.

Mein Problem ist das irgendwas an der Init faul ist.
Ich habe das Teil bei Ebay gekauft und an einem Festrechner mit LCDInfo 
getestet. Es funktioniert prima.

Dann habe ich mich daran gemacht mit einem ATMEGA32 rumzuspielen.
Alle nötigen Pins habe ich verbunden und auch die Init habe ich mir 
angeschaut und umgesetzt. Die Kommunikation selbst funktioniert 
einwandfrei.

Das Problem ist, das das Teil scheinbar von der Mondphase abhängt.
Manchmal geht es an, manchmal nicht. Ich vermute das hat irgendwas mit 
den Timings zu tun.

Im folgenden meine Funktionen für Init und Kommunikation.
Meine Init:

void LcdInit(void)
{
  unsigned char ucDelay = 0,ucStartTime;
  unsigned int uiDelay = 0, uiStartTime;
  DATADIR |= 0xFF;
  CONTROLDIR |= ((1 << CDPIN) | (1 << CSPIN) |
                 (1 << RDPIN) | (1 << WRPIN) | (1 <<RSTPIN));
  RSTHIGH;
  WRLOW;
  RDLOW;
  CSLOW;
  EPSONDATA;

  ucDelay = 0;
  ucStartTime = TimerGet1SecTick();
  while (ucDelay < 3) // wait 3 sec
    ucDelay = TimerGet1SecDiff(ucStartTime);

  EpsonSendCmd(0x40); // SystemSet

  uiDelay = 0;
  uiStartTime = TimerGet1MSecTick();
  while (uiDelay < 40) // wait 200 msec
    uiDelay = TimerGet1MSecDiff(uiStartTime);

  EpsonSendData1(0x30);
  EpsonSendData1(0x05); // char width in px -1 (here 6)
  EpsonSendData1(0x07); // char height -1 (here 8)
  EpsonSendData1(0x34); // number of chars per row
  EpsonSendData1(0x87); // width
  EpsonSendData1(0xEF); // height 240 lines
  EpsonSendData1(0x35); // horizontal adress range register
  EpsonSendData1(0x00); 

  ucDelay = 0;
  ucStartTime = TimerGet1SecTick();
  while (ucDelay < 3) // wait 3 sec
    ucDelay = TimerGet1SecDiff(ucStartTime);

  EpsonSendCmd(0x40); // SystemSet

  uiDelay = 0;
  uiStartTime = TimerGet1MSecTick();
  while (uiDelay < 40) // wait 200 msec
    uiDelay = TimerGet1MSecDiff(uiStartTime);

  EpsonSendData1(0x30);
  EpsonSendData1(0x05); // char width in px -1 (here 6)
  EpsonSendData1(0x07); // char height -1 (here 8)
  EpsonSendData1(0x34); // number of chars per row
  EpsonSendData1(0x87); // width
  EpsonSendData1(0xEF); // height 240 lines
  EpsonSendData1(0x35); // horizontal adress range register
  EpsonSendData1(0x00); 

  uiDelay = 0;
  uiStartTime = TimerGet1MSecTick();
  while (uiDelay < 0xFF) // wait 200 msec
    uiDelay = TimerGet1MSecDiff(uiStartTime);

  EpsonSendCmd(0x44);               // SCROLL
  EpsonSendData2((unsigned int)(DISP1HOME));   // layer 1 home adress
  EpsonSendData1(0xFE);             // 240 Lines
  EpsonSendData2((unsigned int)(DISP2HOME));   // layer 2 home adress
  EpsonSendData1(0xFE);             // 240 Lines
  EpsonSendData2((unsigned int)(DISP3HOME));   // layer 3 home adress
  EpsonSendData2((unsigned int)0x0000);             // Dont care

  EpsonSendCmd(0x58); // DISPON/OFF
  EpsonSendData1(0x14); // no flash no cursor

  EpsonSendCmd(0x4C);          // Cursor direction right

  EpsonSendCmd(0x5B); // OVLAY
  EpsonSendData1(0x01); // ORMODE

  EpsonSendCmd(0x5A); // HDOTSCR
  EpsonSendData1(0x00);

  LcdClearLayer(1);

  uiDelay = 0;
  uiStartTime = TimerGet1MSecTick();
  while (uiDelay < 200) // wait 20 msec
    uiDelay = TimerGet1MSecDiff(uiStartTime);

  LcdClearLayer(2);

  uiDelay = 0;
  uiStartTime = TimerGet1MSecTick();
  while (uiDelay < 200) // wait 20 msec
    uiDelay = TimerGet1MSecDiff(uiStartTime);

  LcdClearLayer(3);

  uiDelay = 0;
  uiStartTime = TimerGet1MSecTick();
  while (uiDelay < 200) // wait 20 msec
    uiDelay = TimerGet1MSecDiff(uiStartTime);

  EpsonSendCmd(0x59); // DISPON/OFF
  EpsonSendData1(0x14); // no flash no cursor
  return;
}

void slope(unsigned char cnt)
{
  unsigned char i;
  for (i=0; i < cnt; i++)
    asm volatile("nop");
}

void EpsonSendCmd(unsigned char cmd)
{
  EPSONCMD;
  WRHIGH;
  CSHIGH;
  RDHIGH;
  DATAPORT = cmd;
  slope(20);
  CSLOW;
  slope(20);
  WRLOW;
  slope(20);
  WRHIGH;
  slope(20);
  CSHIGH;
}


void EpsonSendData1(unsigned char cmd)
{
  EPSONDATA;
  WRHIGH;
  CSHIGH;
  RDHIGH;
  DATAPORT = cmd;
  slope(20);
  CSLOW;
  slope(20);
  WRLOW;
  slope(20);  
  WRHIGH;
  slope(20);
  CSHIGH;
  EPSONCMD;
}
Data2 macht nichts anderes als zwei mal Data1 mit gesplittetem int 
aufzurufen.

Die Timerfunktionen sollten korrekt arbeiten. Da ich kein Oszi hab konte 
ich das nur über ein sekündliches Blinken in der Mainschleife 
überprüfen.
Im Datenblatt hab ich gelesen das die Karre ein bisschen Zeit braucht 
bis sie bereit für Befehle ist, das hab ich mit einigen Sekunden 
reichlich bemessen.

Wie gesagt, wenn es wirklich angeht, dann funktioniert auch mein 
restlicher Code. Der Knackpunkt ist wahrscheinlich wirklich wie ich 
sicher und reproduzierbar aus dem Sleepmode rauskomme. In den meisten 
Fällen sehe ich nur ein kurzes Leuchten der Hintergrundbeleuchtung 
unmittelbar nach der Init und dann ist Schluss.

Wenn irgendjemand mit dem Teil schon Erfahrungen gemacht hat wär ich 
dankbar für einen Hinweise.

Ach so: Clock sind ext. 16MHz und 24MHz am EPSON.
Mit internem 8MHz Clock hab ich auch schon probiert, geht auch nicht.

mfG
Christoph

Autor: Wolfgang-G (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich häng mich nur mal an, da ich Probleme mit S1D13305 habe

Autor: Peter Birkenstock (atmelfriend)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe hier ein Hitachi Display 320x240. Als Controller wird ein 
S1D13700 benutzt. Der haengt direkt am Adress/Datenbus von einem ATMega 
1281, Modus also Generic Direct.
Da ich dummerweise einen 40 MHz Oberton Quartz gekauft habe, laeuft der 
SID13700 bis ich den richtigen Quartz habe mit einem 25MHz Quartz. Hat 
den Nachteil, der zum Testen nicht so wild ist, das ich die 16 MHz Clock 
vom ATMega durch 2 teilen muss, sonst ist er zu schnell.
Es werden 3 Grafik Layers benutzt, kein Text Layer.
Anbei die Initialisierung:

    //Reset the chip
    S1d13700_Res_act;
    delay_ms(2);
    S1d13700_Res_inact
    delay_ms(5);

    //Exit sleep mode after reset
    S1d13700_Command;       //Set virtual a15 to 1
    S1_PSMR = 0x00;         //8008
    delay_us(100);
    S1_MCR = 0x30;          //Dummy write, see manual 8000
    delay_us(100);

    S1_MCR = 0x30;          //Single panel 8000
    S1_HCSR = 87;           //FX 8001
    S1_VCSR = 00;           //FY 8002

    S1_CBPRR = 39;          //Bytes per line (320 / 8) - 1 8003
//    S1_TCBPRR = 0xa9;         //Calculatory 40 MHz 8004
    S1_TCBPRR = 100;        //25 MHz
    S1_FHR = 239;           //240 lines 8005

    S1_HARR0 = 40;         //8006
    S1_HARR1 = 0;           //8007

    //First screen block starts at 0
    S1_SB1AR0 = 0x00;       //800b
    S1_SB1AR1 = 0x00;       //800c
    S1_SB1SR = 239;         //800d
    //Second screen block starts at 2580h = 320/8 * 240
    S1_SB2AR0 = 0x80;
    S1_SB2AR1 = 0x25;
    S1_SB2SR = 239;
    //Third screen block
    S1_SB3AR0 = 0x00;       //8011
    S1_SB3AR1 = 0x4b;       //8012
    //Forth screen block
    S1_SB4AR0 = 0x00;       //8013
    S1_SB4AR1 = 0x00;       //8014

    //Cursor, anyway not needed
    S1_CWR = 0x07;          //8015
    S1_CHR = 0x87;          //8016
    S1_DAR = 0x54;          //Display screen block 1..3 800a
    S1_CSDR = 0x00;         //Cursor shift direction 8017

    //Horizontal pixel scroll
    S1_HPSR =0x00;         //801b
    //Overlay control
    S1_OR = 0x1c;           //3 grafic layers, OR mode 8018


    #ifdef DEBUG_GEN
      printf("S1D13700: ");
    #endif
    if(S1_MCR != 0x30)
    {
        S1_DER = 0x00;          //Display off to avoid demages
        global_err = GLB_ERR_S1;
        #ifdef DEBUG_GEN
          printf("FAILURE!\r\n");
        #endif
    }
    else
    {
        S1_DER = 0x01;          //Display enable 8009
        #ifdef DEBUG_GEN
          printf("OK\r\n");
        #endif
    }

    //Erase the chip memory
    S1d13700_Data;                                      //Set the 
virtual A15 to Low
    memset((unsigned char*)S1d13700_MEMSTART, 0x00, S1d13700_MEMSIZE);

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.