Welcher Display Treiber ? :'( :'(

Ich hatte vor einiger Zeit dies Kit gekauft. Hatte einen ILI9325 Grafikchip und lief gut.

Nun habe ich mir 2 neue bestellt, und bekomme die Dinger nicht richtig zum laufen. Haben einen anderen Chip (9335 hiess das rar). Der Service hat mir als “Treiber” eine komplette Arduino 0022alpha mitgeschickt, und mit dem folgenden Beispielsketck läuft es, aber wie gesagt nur unter 0022

#define LCD_CS A3    
#define LCD_CD A2    
#define LCD_WR A1   
#define LCD_RD A0    
// you can also just connect RESET to the arduino RESET pin
#define LCD_RESET A4
//Duemilanove/Diecimila/UNO/etc ('168 and '328 chips) microcontoller:
// Color definitions
#define	BLACK           0x0000
#define	BLUE            0x001F
#define	RED             0xF800
#define	GREEN           0x07E0
#define CYAN            0x07FF
#define MAGENTA         0xF81F
#define YELLOW          0xFFE0 
#define WHITE           0xFFFF

#include "TFTLCD.h"

TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);

void setup(void) {
  Serial.begin(9600);
  Serial.println("8 Bit LCD test!");
  
  
  tft.reset();
  
  uint16_t identifier = tft.readRegister(0x0);
  if (identifier == 0x9325) {
    Serial.println("Found ILI9325");
  } else if (identifier == 0x9328) {
    Serial.println("Found ILI9328");
  } else {
    Serial.print("Unknown driver chip ");

  }  
    Serial.println(identifier, HEX);
    Serial.println(identifier);
 
  tft.initDisplay();
  
  testtext(RED);
  delay(2000);
  testlines(CYAN);
  delay(500);
  testfastlines(RED, BLUE);
  delay(500);
  testdrawrects(GREEN);
  delay(500);
  testfillrects(YELLOW, MAGENTA);
  delay(500);
  tft.fillScreen(BLACK);
  testfillcircles(10, MAGENTA);
  testdrawcircles(10, WHITE);
  delay(500); 
  testtriangles();
  delay(500); 
  testfilltriangles();
  delay(500); 
  testRoundRect();
  delay(500); 
  testFillRoundRect();
}

void loop(void) {
  for (uint8_t rotation=0; rotation<4; rotation++) {
    tft.setRotation(rotation); 
    testtext(RED);
    delay(1000);
  }
}



void testFillRoundRect() {
  tft.fillScreen(BLACK);
  
  for (uint16_t x=tft.width(); x > 20 ; x-=6) {
    tft.fillRoundRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, x/8,  tft.Color565(0, x, 0));
 }
}

void testRoundRect() {
  tft.fillScreen(BLACK);
  
  for (uint16_t x=0; x < tft.width(); x+=6) {
    tft.drawRoundRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, x/8, tft.Color565(x, 0, 0));
 }
}

void testtriangles() {
  tft.fillScreen(BLACK);
  for (uint16_t i=0; i<tft.width()/2; i+=5) {
    tft.drawTriangle(tft.width()/2, tft.height()/2-i,
                     tft.width()/2-i, tft.height()/2+i,
                     tft.width()/2+i, tft.height()/2+i, tft.Color565(0, 0, i));
  }
}

void testfilltriangles() {
  tft.fillScreen(BLACK);
  
  for (uint16_t i=tft.width()/2; i>10; i-=5) {
    tft.fillTriangle(tft.width()/2, tft.height()/2-i,
                     tft.width()/2-i, tft.height()/2+i,
                     tft.width()/2+i, tft.height()/2+i, 
                     tft.Color565(0, i, i));
    tft.drawTriangle(tft.width()/2, tft.height()/2-i,
                     tft.width()/2-i, tft.height()/2+i,
                     tft.width()/2+i, tft.height()/2+i, tft.Color565(i, i, 0));    
  }
}
void testtext(uint16_t color) {
  tft.fillScreen(BLACK);
  tft.setCursor(0, 20);
  tft.setTextColor(color);
  tft.setTextSize(1);
  tft.println("Hello World!");
  tft.setTextSize(2);
  tft.println(1234.56);
  tft.setTextSize(3);
  tft.println(0xDEADBEEF, HEX);
}

void testfillcircles(uint8_t radius, uint16_t color) {
  for (uint16_t x=radius; x < tft.width(); x+=radius*2) {
    for (uint16_t y=radius; y < tft.height(); y+=radius*2) {
      tft.fillCircle(x, y, radius, color);
    }
  }  
}

void testdrawcircles(uint8_t radius, uint16_t color) {
  for (uint16_t x=0; x < tft.width()+radius; x+=radius*2) {
    for (uint16_t y=0; y < tft.height()+radius; y+=radius*2) {
      tft.drawCircle(x, y, radius, color);
    }
  }  
}


void testfillrects(uint16_t color1, uint16_t color2) {
 tft.fillScreen(BLACK);
 for (uint16_t x=tft.width()-1; x > 6; x-=6) {
   //Serial.println(x, DEC);
   tft.fillRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color1);
   tft.drawRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color2);
 }
}

void testdrawrects(uint16_t color) {
 tft.fillScreen(BLACK);
 for (uint16_t x=0; x < tft.width(); x+=6) {
   tft.drawRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color);
 }
}

void testfastlines(uint16_t color1, uint16_t color2) {
   tft.fillScreen(BLACK);
   for (uint16_t y=0; y < tft.height(); y+=5) {
     tft.drawHorizontalLine(0, y, tft.width(), color1);
   }
   for (uint16_t x=0; x < tft.width(); x+=5) {
     tft.drawVerticalLine(x, 0, tft.height(), color2);
   }
  
}

void testlines(uint16_t color) {
   tft.fillScreen(BLACK);
   for (uint16_t x=0; x < tft.width(); x+=6) {
     tft.drawLine(0, 0, x, tft.height()-1, color);
   }
   for (uint16_t y=0; y < tft.height(); y+=6) {
     tft.drawLine(0, 0, tft.width()-1, y, color);
   }
   
   tft.fillScreen(BLACK);
   for (uint16_t x=0; x < tft.width(); x+=6) {
     tft.drawLine(tft.width()-1, 0, x, tft.height()-1, color);
   }
   for (uint16_t y=0; y < tft.height(); y+=6) {
     tft.drawLine(tft.width()-1, 0, 0, y, color);
   }
   
   tft.fillScreen(BLACK);
   for (uint16_t x=0; x < tft.width(); x+=6) {
     tft.drawLine(0, tft.height()-1, x, 0, color);
   }
   for (uint16_t y=0; y < tft.height(); y+=6) {
     tft.drawLine(0, tft.height()-1, tft.width()-1, y, color);
   }

   tft.fillScreen(BLACK);
   for (uint16_t x=0; x < tft.width(); x+=6) {
     tft.drawLine(tft.width()-1, tft.height()-1, x, 0, color);
   }
   for (uint16_t y=0; y < tft.height(); y+=6) {
     tft.drawLine(tft.width()-1, tft.height()-1, 0, y, color);
   }
}


void testBars() {
  uint16_t i,j;
  for(i=0; i < tft.height(); i++)
  {
    for(j=0; j < tft.width(); j++)
    {
      if(i>279) tft.writeData(WHITE);
      else if(i>239) tft.writeData(BLUE);
      else if(i>199) tft.writeData(GREEN);
      else if(i>159) tft.writeData(CYAN);
      else if(i>119) tft.writeData(RED);
      else if(i>79) tft.writeData(MAGENTA);
      else if(i>39) tft.writeData(YELLOW);
      else tft.writeData(BLACK);
    }
  }
}

Die TFTLCD Lib scheint schon älter zu sein und will nicht unter 1.6.5, die Zeile #include <WProgram.h> habe ich schon gegen

#if ARDUINO >= 100
 #include "Arduino.h"
 #include "Print.h"
#else
 #include "WProgram.h"
#endif

ausgetauscht, aber es hagelt Fehler. Ich habe nun schon Stunden verbracht, alle möglichen Libs auszuprobieren, hab aber nichts gefunden, was läuft. Ko,pilieren tut vieles, aber das LCD bleibt weiss.
Welche Lib ist den der legitime und kompatible Nachfolger von der TFTLCD ?

Mit der Adafruit_TFTLCD.h habe ich es schon mit allen drei Möglichkeiten probiert:
#define USE_ADAFRUIT_SHIELD_PINOUT
#define USE_ADAFRUIT_SHIELD_PINOUT 1
//#define USE_ADAFRUIT_SHIELD_PINOUT

No way in. Wer hat die rettende Info?

Schon mal UTFT probiert?

Da gibt es mehrere Versionen davon:

#define ITDB24          3   // ILI9325C (8bit)
#define ITDB24D     4   // ILI9325D (8bit)
#define ITDB24DWOT      4   // ILI9325D (8bit)

Wie muss dann diese Zeile heissen? UTFT myGLCD(HX8357B,38,39,40,41);

UTFT myGLCD(ITDB24,A3,A2,A1,A0);

Oder was gebe ich für einen Typ an?

Und was muss ich noch ändern?

Gibt sogar noch mehr:

#define ITDB24 3 // ILI9325C (8bit)
#define ITDB24D 4 // ILI9325D (8bit)
#define ITDB24DWOT 4 // ILI9325D (8bit)
#define TFT01_24_8 4 // ILI9325D (8bit)
#define DMTFT24104      4   // ILI9325D (8bit)
#define DMTFT28103      4   // ILI9325D (8bit)
#define TFT01_24_16 5 // ILI9325D (16bit)

Siehe UTFT.h

Du übergibst den Display Typ. Nicht den Chip. Was da passt musst du ausprobieren. ITDB24 oder TFT01_24_8 sind aber gute Kandidaten

Die Parameter im Konstruktor sind wie folgt:

UTFT(byte model, int RS, int WR, int CS, int RST, int SER=0);

Siehe auch: http://www.rinkydinkelectronics.com/files/UTFT_Requirements.pdf Seite 4

Sonst musst du erst mal nichts machen. Wenn es mal geht solltest du in memorysaver.h die Treiber deaktivieren die du nicht brauchst. Das spart etwas Speicher

Das hab ich auch gerade gefunden.

hab jetzt UTFT myGLCD(ITDB24,A2,A1,A3,A4);

da im Beispielsketch

#define LCD_CS A3    
#define LCD_CD A2    
#define LCD_WR A1   
#define LCD_RD A0

Steht. Allerdings was ist RD ?

Keine Ahnung.

Mit dem Display haben aber wohl noch andere Probleme. Vielleicht hilft das: https://forum.arduino.cc/index.php?topic=223769.msg2287509#msg2287509

Unter dem Video ist ein Link zu einer wohl modifizierten Adrafruit Lib

:frowning: Hat noch nichts gebracht, das Video hat es zwar bewiesen, aber meines geht immer noch nicht.

RD hab ich inzwischen gelesen, müsste auf HIGH, allerdings bin ich mit der Zeile
UTFT myGLCD(ITDB24,A2,A1,A3,A4);
noch nicht ganz klar. Muss ich da für ITDB24 alles nacheinander durchprobieren und hoffen, dass meine Pinzuweisungen stimmen?

Lässt sich aus dem Sketch für die IDE 0022 nix passendes rauslesen?

Nun habe ich was halbwegs passendes gefunden, nun tritt ein neues Kuriosum auf:

Ich habe 2 im Prinzip identische Displays. Zusammen bestellt, zusammen gekommen, äusserlich gleich, Aufdruck, etc. alles gleich.

Bei dem Beispiel mit der IDE022 gehen beide.

bei dem Testprogramm von http://misc.ws/2015/01/24/lcd-touch-screen-information/ gehen beide, gleiche serielle Ausgabe, gleiche ID.

Bei dem folgenden Sketch geht nur eines von beiden (die Lib ist auch von der Seite):

#define LCD_CS A3    
#define LCD_CD A2    
#define LCD_WR A1   
#define LCD_RD A0    
// you can also just connect RESET to the arduino RESET pin
#define LCD_RESET A4
//Duemilanove/Diecimila/UNO/etc ('168 and '328 chips) microcontoller:
// Color definitions
#define  BLACK           0x0000
#define BLUE            0x001F
#define RED             0xF800
#define GREEN           0x07E0
#define CYAN            0x07FF
#define MAGENTA         0xF81F
#define YELLOW          0xFFE0 
#define WHITE           0xFFFF

#include "TFTLCD.h"

TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);

void setup(void) {
  Serial.begin(9600);
  Serial.println("8 Bit LCD test!");
  
  
  tft.reset();
  
  uint16_t identifier = tft.readRegister(0x0);
  if (identifier == 0x9325) {
    Serial.println("Found ILI9325");
  } else if (identifier == 0x9328) {
    Serial.println("Found ILI9328");
  } else {
    Serial.print("Unknown driver chip ");
    Serial.println(identifier, HEX);

  }  

  tft.initDisplay();


}

void loop(void) {
  
    testtext(RED);
    delay(2000);

}


void testtext(uint16_t color) {
  tft.fillScreen(BLACK);
  tft.setCursor(0, 20);
  tft.setTextColor(RED);
  tft.setTextSize(4);
  tft.println("Hello World!");
  tft.setTextColor(YELLOW);
  tft.setTextSize(2);
  tft.println(1234.56);
  tft.setTextSize(3);
  tft.println(0xDEADBEEF, HEX);
}

Ich werd noch zum Hirsch :'( :'(

Wenn sich die Displays unterschiedlich verhalten, könnte das am I2C Bus liegen (Vcc 3V?, Pullups...). Evtl. hat ja eines der Displays schon eine Macke (Eingang mit Elektrostatik gekillt?), oder eine andere Firmware-Version?

Kein I2C, sind 8 Datenleitungen. Haben 5V, keine Pullups notwendig gekillt glaube ich eher nicht, da es ja mit dem Beispiel Sketch in der Arduino IDE 0022 perfekt funktioniert. Haben die Grafikchips eine FW ? Gute Frage. Bevor ich mich da noch viel länger rumärgere, lass ich das Scheissding 3 Monate liegen und google dann nochmal.