Forum: Mikrocontroller und Digitale Elektronik TFT320 SSD1289 mit SPI Schnittstelle über ATmega2560 ansteuern


von christian S. (Firma: Gast) (vivien)


Lesenswert?

Hallo Freunde,

ich habe mir eine TFT320 SSD1289 gekauft und ich möchte das Display mit 
der SPI Schnittstelle mit einem ATmega2560 ansteuern.

Haben Sie vielleicht ein Tipp wie ich dann anfangen soll.

Ich habe schon mal paar library von TFT bei mir.

Danke im Vorau

Vivien

von Kurt H. (Firma: KHTronik) (kurtharders)


Lesenswert?

Hallo Vivien,
von ramtex gibt es eine kostenpflichtige Library. Wenn Du genau weisst, 
welche Grafikhfunktionen Du benötigst, ist es keine große Aktion, die 
Grundfunktionen selbst zu schreiben. Am schwierigsten fand ich bei einem 
ähnlichen Display den Startcode. Wenn man erst einmal das erste Pixel 
gesetzt hat muss man nur die richtigen Teile zusammensuchen (Line, 
Kreis...).
Bleibt noch die Frage, welche Ansteuerung (16-Bit, 8Bit, SPI) Du für die 
Grafik verwenden willst.
Grüße, Kurt

von christian S. (Firma: Gast) (vivien)


Lesenswert?

Kurt Harders schrieb:

> Bleibt noch die Frage, welche Ansteuerung (16-Bit, 8Bit, SPI) Du für die
> Grafik verwenden willst.

Danke für die rasche Antwort Kurt

Die Ansteuerung die, ich für die Grafik verwenden will, ist eigentlich 
Egal im moment. Aber ich würde sagen, dass ich mit dem 8Bit SPI anfangen 
werde.

hast du vielleicht ein Besipiel der Ansteuerung eineS TFT LCD mit 
SPI-Schnistelle?

Grüße Vivien

von Kurt H. (Firma: KHTronik) (kurtharders)


Angehängte Dateien:

Lesenswert?

Hallo Vivien,
ich lege Dir mal die Ansteuerung für einen HX8347-I-Controller bei. Da 
die Controller recht ähnlich sind, hilft es Dir vielleicht. Angesteuert 
wird der Display bei mir mit 18 Bit (3x6 für RGB).
Bei der SPI-Ansteuerung werden die Daten meist nur in Bytes aufgeteilt, 
die Befehle bleiben oft gleich oder sehr ähnlich.
Oberhalb des gezeigten Codes ist dann eine Softwareschicht, die Linien, 
Zeichen und Kreisbögen kann. Vieles davon ist aus dem Internet kopiert 
(Interpolationsroutinen...) anderes auf meinem Mist gewachsen.
Für meine Anwendung stellt der verwendete ATMega645 Funktionen auf 
Anwendungsebene bereit. Z.B. FügeLinieHinzu, ZeichneGrafik, 
SetzeMenueItem, ZeichneMenue, ZeigeText...
Der unangenehmste Teil der Inbetriebnahme ist die Initialisierung. Da 
sollt man sich in aller Ruhe die meist gut dokumentierten Abläufe aus 
der Doku anschauen.
Viel Spass, Kurt

von christian S. (Firma: Gast) (vivien)


Lesenswert?

Hallo Kurt,

Danke für deine Dateien. Ich glaube, dass es schon mal eine gute anfang 
für mich ist.
Ich werde mich dransetzen und versuchen das Display über SPI im Lauf zu 
kriegen.

Erstmal möchte ich nur kleine Texte oder Zahlen auf dem Diplay zeigen 
lassen und dann kann ich weiter mit dem IMAGE... programmieren.

Grüß Vivien

von christian S. (Firma: Gast) (vivien)


Lesenswert?

Hallo Kurt,

ich habe noch eine Frage.

die Befehle TFT_N_WR, TFT_N_WR, TFT_N_CS. wo hast du die dann 
initialisiert(bzw haben sie keine Define wert? oder Port zuweisung)?

Gruß Vivien

: Bearbeitet durch User
von Kurt H. (Firma: KHTronik) (kurtharders)


Lesenswert?

Hallo Vivien,

fang mit Punkten an :-)
Danach kannst Du ja diese Routinen anpassen:
1
void TFTGraphics_drawPixel(int16_t x, int16_t y) {
2
  TFTDriver_setRAMAddress(x, y);
3
  TFTDriver_outputPixel(currentContext.currentColor);
4
}
5
6
void TFTGraphics_drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1) {
7
  int16_t dx =  abs(x1-x0), sx = x0<x1 ? 1 : -1;
8
  int16_t dy = -abs(y1-y0), sy = y0<y1 ? 1 : -1;
9
  int16_t err = dx+dy, e2; /* error value e_xy */
10
11
  for(;;){  /* loop */
12
    TFTGraphics_drawPixel(x0, y0);
13
    if (x0==x1 && y0==y1) break;
14
    e2 = 2*err;
15
    if (e2 > dy) { err += dy; x0 += sx; } /* e_xy+e_x > 0 */
16
    if (e2 < dx) { err += dx; y0 += sy; } /* e_xy+e_y < 0 */
17
  }
18
}
19
20
void TFTGraphics_drawCircle(int16_t x0, int16_t y0, int16_t radius) {
21
  int16_t f = 1 - radius;
22
  int16_t ddF_x = 0;
23
  int16_t ddF_y = -2 * radius;
24
  int16_t x = 0;
25
  int16_t y = radius;
26
27
  TFTGraphics_drawPixel(x0, y0 + radius);
28
  TFTGraphics_drawPixel(x0, y0 - radius);
29
  TFTGraphics_drawPixel(x0 + radius, y0);
30
  TFTGraphics_drawPixel(x0 - radius, y0);
31
32
  while(x < y) {
33
    if(f >= 0) {
34
      y--;
35
      ddF_y += 2;
36
      f += ddF_y;
37
    }
38
    x++;
39
    ddF_x += 2;
40
    f += ddF_x + 1;
41
42
    TFTGraphics_drawPixel(x0 + x, y0 + y);
43
    TFTGraphics_drawPixel(x0 - x, y0 + y);
44
    TFTGraphics_drawPixel(x0 + x, y0 - y);
45
    TFTGraphics_drawPixel(x0 - x, y0 - y);
46
    TFTGraphics_drawPixel(x0 + y, y0 + x);
47
    TFTGraphics_drawPixel(x0 - y, y0 + x);
48
    TFTGraphics_drawPixel(x0 + y, y0 - x);
49
    TFTGraphics_drawPixel(x0 - y, y0 - x);
50
  }
51
}
Die Interpolationen sind aus Wikipedia übernommen.

Und hier die defines:
1
#define TFT_BUS_LOW PORTA // low byte
2
#define TFT_BUS_HIGH PORTC  // high byte
3
#define TFT_BUS_16_17 PORTG  // Bit 17+18
4
#define TFT_CMD PORTD
5
#define TFT_DDR DDRD
6
7
#define TFT_N_CS PD1
8
#define TFT_DNC PD2
9
#define TFT_N_WR PD0
10
#define TFT_N_RD PD4
11
#define TFT_N_TFT_RESET PD3
Grüße, Kurt

: Bearbeitet durch User
von Gerhard G. (g_g)


Lesenswert?

Hallo,

ist das ein aufgelötetes TFT Display

So was ähnliches: http://www.geeetech.com/wiki/index.php/3.2TFT_LCD

Dann hat es zu 100% eine parallele Schnittstelle (8 oder 16 Bit Bus).


Gruß

G.G

von christian S. (Firma: Gast) (vivien)


Lesenswert?

Gerhard Gehlert schrieb:
> ist das ein aufgelötetes TFT Display
>
> So was ähnliches: http://www.geeetech.com/wiki/index.php/3.2TFT_LCD
>

Hallo Gehlert,

ich benutze genau dieses TFT.

Gruß

Vivien

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.