Forum: Mikrocontroller und Digitale Elektronik FT800 TFT Display am ATmega 1284P geht nicht


von Nitram E. (slexx)


Angehängte Dateien:

Lesenswert?

Hallo ich habe ein Display FT800CB Display und ein ATmega 1284P, 16MHz 
und läuft mit Optiboot, programmiert wird mit der Arduino IDE.

Jetzt hatte ich das Display am UNO gehabt, da hat alles Funktunoiert. 
Angeschlossen wird es beim UNO ->

SCK  =  13
MISO =  12
MOSI =  11
CS   =  9
PD   =  4
INT  =  3

Jetzt wollte ich es an meinem 1284 anschließen, naja nix funktioniert.
Aber der Bildschirm ist schon mal weiß und bleibt nicht dunkel.
Natürlich habe ich versucht die PINs anders zu setzen, muss ich ja auch 
da die PINbelegung natürlich anders ist.
Ich habe das Diplay normal beim 1284 an den SPI BUS angeschlossen und 
die 3 extra Pins -

CS an 12,
PD an 13 und
INT an 2.

Die 3 extra PINS habe ich auch im Programm per Define Anweisung belegt. 
Jetzt habe ich versucht mit mein bisschen Programmierwissen die LIB zu 
untersuchen aber auch da stehe ich da wie blöööd. Waaaas IST DAS 
Problem?
Ist die PINbelegung falsch oder die LIB passt nicht?
Ich hoffe ihr könnt mir vlt helfen. Anbei PINOUT Atmega 1284 für Arduino 
IDE und die .h für das Display und mein selbstgebautes 1284 Board(leider 
nicht beschriftet)

: Bearbeitet durch User
von Nitram E. (slexx)


Lesenswert?

Es benutzen ja gerade relativ viele das FT800... Hat denn keiner eine 
Lösung? :'(

von Rudolph (Gast)


Lesenswert?

Ist eben sehr speziell mit dem 1284 als Arduino und noch wenig 
Informationen.

Zumindest in dem angehängten Include ist die Zuordnung noch anders.

#define FT_CS_PIN     9
#define FT_PDN_PIN    4
#define FT_INT_PIN     3
#define FT_DISPENABLE_PIN  7
#define FT_AUDIOENABLE_PIN  1

von Nitram E. (slexx)


Lesenswert?

Die hatte ich auch versucht zu ändern aber ohne Erfolg. :(

von Rudolph (Gast)


Lesenswert?

Mach doch erstmal ein Test-Programm bei dem Du mit den ausgewählten Pins 
wackelst und schau nach, ob das auch jeweils so passiert.

So, um zu verifizieren, dass die Arduino IDE die Nummern auch genau so 
interpretiert wie Du sie angibst.
1
void setup()
2
{
3
  pinMode(12, OUTPUT);
4
  digitalWrite(12, HIGH);
5
}
6
7
void loop()
8
{
9
}
1
void setup()
2
{
3
  pinMode(12, OUTPUT);
4
  digitalWrite(12, LOW);
5
}

Klappt das überhaupt genau so an den Pins welche über die Nummer 
angesprochen werden sollen?

Und in das Include gehören die Änderungen rein.

von Nitram E. (slexx)


Lesenswert?

Ja die include habe ich ergänzt.
Wie meinst du das mit wackeln?

Also muss ich den Pin12 als Output deklarieren, richtig?

von Rudolph (Gast)


Lesenswert?

Na 0/1 mit den Pins, ohne das Display, erstmal feststellen, ob die Pins 
auch wie geplant funktionieren.

Ohne Deine Hardware lässt sich das für jemand anderes schlecht 
reproduzieren.
Und ob Deine Arduino IDE wirklich PD4 als D12 behandelt lässt sich ohne 
weitere Infos auch nicht nachvollziehen.

Und wenn die Pins so funktionieren wie sie sollen und es dann immer noch 
nicht geht, hilft der Blick mit dem Oszilloscope um zu schauen, was der 
SPI so macht - im Zusammenhang mit CS.

von Mandi (Gast)


Lesenswert?

probier mal das:

UNO-Arduino-Pin:       1284p-Arduino-Pin:
  SCK  =  13                  7
  MISO =  12                  6
  MOSI =  11                  5
  CS   =  9                   4
  PD   =  4         PD4      12
  INT  =  3         INT1     11

siehe Pinout 1284p:

http://pighixxx.deviantart.com/art/Atmega1284p-352919461

MfG. Mandi

von Nitram E. (slexx)


Lesenswert?

Mandi schrieb:
> probier mal das:
>
> UNO-Arduino-Pin:       1284p-Arduino-Pin:
>   SCK  =  13                  7
>   MISO =  12                  6
>   MOSI =  11                  5
>   CS   =  9                   4
>   PD   =  4         PD4      12
>   INT  =  3         INT1     11
>
> siehe Pinout 1284p:
>
> http://pighixxx.deviantart.com/art/Atmega1284p-352919461
>
> MfG. Mandi

Hi, Ich habe es mal ausprobiert....keine Besserung. :(
Kann es an den SPI CLK Frequenzen liegen?

von Rudolph R. (rudolph)


Lesenswert?

Martin T. schrieb:
> Kann es an den SPI CLK Frequenzen liegen?

Nein, grundsätzlich erstmal nicht, der SPI Takt darf beim Init nicht 
höher sein als 11 MHz und dann 30 MHz, das schafft der Mega1284 gar 
nicht.

Ich betreibe den FT800 und den FT810 mit 8 MHz.

Wie sieht übrigens die Verdrahtung dazu aus?
Mit 8 MHz über drölf Meter Klingeldraht zu gehen klappt dann doch nicht. 
:-)

von Nitram E. (slexx)


Lesenswert?

Rudolph R. schrieb:
> Nein, grundsätzlich erstmal nicht, der SPI Takt darf beim Init nicht
> höher sein als 11 MHz und dann 30 MHz, das schafft der Mega1284 gar
> nicht.
>
> Ich betreibe den FT800 und den FT810 mit 8 MHz.
>
> Wie sieht übrigens die Verdrahtung dazu aus?
> Mit 8 MHz über drölf Meter Klingeldraht zu gehen klappt dann doch nicht.
> :-)

Also die länge der Kabel beträgt ca 6cm, aber auch wenn es an den Kabeln 
liegen würde...beim UNO funktioniert es auch. :(

Ich denke irgendwas passt nicht, ich habe jetzt 100 verschiede PIN 
Konfigurationen probiert und auch aus der LIB werde ich nicht schlau.
Mein Latein ist so langsam am Ende.

von Rudolph R. (rudolph)


Lesenswert?

Hmm, der Klassiker mit SPI vielleicht? PB4 (D4) nicht als Ausgang 
gesetzt?

Bist Du denn nun sicher, dass die zu benutzenden Pins so gesetzt werden 
wie Du es erwartest?

von Nitram E. (slexx)


Angehängte Dateien:

Lesenswert?

Rudolph R. schrieb:
> Hmm, der Klassiker mit SPI vielleicht? PB4 (D4) nicht als Ausgang
> gesetzt?
>
> Bist Du denn nun sicher, dass die zu benutzenden Pins so gesetzt werden
> wie Du es erwartest?



Erstmal danke für Euro Hilfe :P

Ich habe es jetzt endlich hinbekommen.
Erstmal habe ich wie Rudolph schon sagte den D4 auf Ausgang und High 
gesetzt.

Meine Konfiguration ist also beim Atmega 1284P mit Optiboot wie folgt:

SCK = 7
MOSI = 5
MISO = 6
CS = 4
PD = 12
INT = 11

Außerdem habe ich herausgefunden dass der TFT komischer weise nur bei 
3,3V funktioniert obwohl er beim UNO mit 5V funktionierte aber ich 
könnte mir auch gut vorstellen dass in meinem selbstgebauten Board der 
Wurm drin ist, EMV Problem, etc. vlt auch am Programmer oder doch an dem 
Kabel da zu dem Display ein kleines dünnes Flachbandkabel + Platine dazu 
war(kann man auch direkt am TFT anschließen). Werde ich wahrscheinlich 
noch raus finden.

von Rudolph R. (rudolph)


Lesenswert?

Ah, gar nicht gesehen, das ist ja ein FT800CB von HAOYU.
Ist das das FT800CB-HY43B, also 4,3"?

Wie ist denn bei dem der Touch-Screen so? Lässt sich das mit einem Stift 
bedienen, oder erkennt der Touch-Events auch nur, wenn man eine 
verhältnismässig grosse Fläche drückt?

von Nitram E. (slexx)


Lesenswert?

Rudolph R. schrieb:
> Ah, gar nicht gesehen, das ist ja ein FT800CB von HAOYU.
> Ist das das FT800CB-HY43B, also 4,3"?
>
> Wie ist denn bei dem der Touch-Screen so? Lässt sich das mit einem Stift
> bedienen, oder erkennt der Touch-Events auch nur, wenn man eine
> verhältnismässig grosse Fläche drückt?


Ja genau :) ist aber das CB-HY50B also 5.0".

Sowohl als auch, man kann es mit dem normalen finger bedienen nur beim 
Kalibrieren würde ich sehr genau mit dem Fingernagel in die Mitte der 
Punkte drücken. Aber kannst es auch mit einem Stift oder so machen.

Sonst finde ich das Teil einfach genial, viel weniger Programmtext als 
bei den ILI93xx oder so... außerdem viel BIGGER und sieht an sich klasse 
aus und kosten - tut's auch nicht viel.

von Rudolph R. (rudolph)


Lesenswert?

Hmm, interessant, bei meinem FT810CB-HY50HD bekomme ich ja mit Stift gar 
keine Reaktion.
Kann ja irgendwie nicht sein, dass die bei dem TFT mit der höheren 
Auflösung das miesere Touch-Panel verklebt haben.

Vielleicht bestelle ich mir mal das FT800CB-HY50B und tausche die 
Platinen durch damit ich da den FT810 drauf habe.

Oder einfach das HY5-LCD für nur 20 USD bestellen. :-)

Die Kalibrierung kann man übrigens auch statisch eintragen.

Einmal genau machen, die Werte ausgeben lassen, danach reicht dann sowas 
hier:

ft800_memWrite32(REG_TOUCH_TRANSFORM_A, 0xffffaa39);
ft800_memWrite32(REG_TOUCH_TRANSFORM_B, 0xffffffc6);
ft800_memWrite32(REG_TOUCH_TRANSFORM_C, 0x0149aab3);
ft800_memWrite32(REG_TOUCH_TRANSFORM_D, 0x0000001d);
ft800_memWrite32(REG_TOUCH_TRANSFORM_E, 0x000041c5);
ft800_memWrite32(REG_TOUCH_TRANSFORM_F, 0xfff675ba);

Entgegen den ganzen Beispielen von FTDI nervt das deutlich weniger. :-)

: Bearbeitet durch User
von Nitram E. (slexx)


Lesenswert?

Rudolph R. schrieb:
> Hmm, interessant, bei meinem FT810CB-HY50HD bekomme ich ja mit Stift gar
> keine Reaktion.
> Kann ja irgendwie nicht sein, dass die bei dem TFT mit der höheren
> Auflösung das miesere Touch-Panel verklebt haben.
>
> Vielleicht bestelle ich mir mal das FT800CB-HY50B und tausche die
> Platinen durch damit ich da den FT810 drauf habe.
>
> Oder einfach das HY5-LCD für nur 20 USD bestellen. :-)
>
> Die Kalibrierung kann man übrigens auch statisch eintragen.
>
> Einmal genau machen, die Werte ausgeben lassen, danach reicht dann sowas
> hier:
>
> ft800_memWrite32(REG_TOUCH_TRANSFORM_A, 0xffffaa39);
> ft800_memWrite32(REG_TOUCH_TRANSFORM_B, 0xffffffc6);
> ft800_memWrite32(REG_TOUCH_TRANSFORM_C, 0x0149aab3);
> ft800_memWrite32(REG_TOUCH_TRANSFORM_D, 0x0000001d);
> ft800_memWrite32(REG_TOUCH_TRANSFORM_E, 0x000041c5);
> ft800_memWrite32(REG_TOUCH_TRANSFORM_F, 0xfff675ba);
>
> Entgegen den ganzen Beispielen von FTDI nervt das deutlich weniger. :-)

Hm das ist ja komisch, aber ich glaube da gab es auch Unterschiede 
zwischen den beiden was das Touchpanel betrifft aber von der Auflösung 
kann ich mich nicht beschweren. :)

Ja das Kalibrieren nervt richtig. Wie kann ich die Werte mir ausgeben 
lassen und wo muss

> ft800_memWrite32(REG_TOUCH_TRANSFORM_A, 0xffffaa39);
> ft800_memWrite32(REG_TOUCH_TRANSFORM_B, 0xffffffc6);
> ft800_memWrite32(REG_TOUCH_TRANSFORM_C, 0x0149aab3);
> ft800_memWrite32(REG_TOUCH_TRANSFORM_D, 0x0000001d);
> ft800_memWrite32(REG_TOUCH_TRANSFORM_E, 0x000041c5);
> ft800_memWrite32(REG_TOUCH_TRANSFORM_F, 0xfff675ba);

das hin? In void Calibrate() oder setup()??? :)

von Rudolph R. (rudolph)


Lesenswert?

Martin T. schrieb:
> Ja das Kalibrieren nervt richtig. Wie kann ich die Werte mir ausgeben
> lassen und wo muss
>
>> ft800_memWrite32(REG_TOUCH_TRANSFORM_A, 0xffffaa39);
>> ft800_memWrite32(REG_TOUCH_TRANSFORM_B, 0xffffffc6);
>> ft800_memWrite32(REG_TOUCH_TRANSFORM_C, 0x0149aab3);
>> ft800_memWrite32(REG_TOUCH_TRANSFORM_D, 0x0000001d);
>> ft800_memWrite32(REG_TOUCH_TRANSFORM_E, 0x000041c5);
>> ft800_memWrite32(REG_TOUCH_TRANSFORM_F, 0xfff675ba);
>
> das hin? In void Calibrate() oder setup()??? :)

Na, mit memread32() oder so ähnlich, weiss nicht genau aus dem Kopf wie 
das bei der Arduino lib ist, damit nach dem Kalibrieren mal die Register 
auslesen.
Und dann auf dem Display mit cmd_number() ausgeben.

Das Aufschreiben, vielleicht noch wie ich das gemacht habe auf Hex 
umrechnen.
Und anschliessend dann anstelle von Calibrate() die Werte in die 
Register schreiben.

Der saubere Weg wäre ja, die Werte einmal mit Calibrate() ermitteln zu 
lassen, auszulesen und dann in das EEPROM zu speichern.
Und dann Calibrate() über einen Menü-Punkt ausführen zu lassen, falls 
man mal merkt, dass das Touch-Panel gealtert ist.

Die meisten Arduino Beispiele sind zwar soweit nett, als richtige 
Software aber irgendwie Grütze, immer Calibrate() und die loop() ist 
leer, die Display-Liste wird nur einmal in den FT800 geworfen.

von Rudolph R. (rudolph)


Lesenswert?

Einen noch, poste mal bitte die Display-Settings für das FT800CB-HY50B.

Touch mit dem FT810CB-HY50B geht zwar jetzt, gestern habe ich aber auch 
noch ein FT800CB-HY50B bestellt und werde das dann auf den FT810 
upgraden. :-)

von Nitram E. (slexx)


Lesenswert?

Rudolph R. schrieb:
> Einen noch, poste mal bitte die Display-Settings für das FT800CB-HY50B.
>
> Touch mit dem FT810CB-HY50B geht zwar jetzt, gestern habe ich aber auch
> noch ein FT800CB-HY50B bestellt und werde das dann auf den FT810
> upgraden. :-)

Heute Abend, Bin gerade nicht daheme. :)

von Rudolph R. (rudolph)


Lesenswert?

Ach herrje, mit Glück habe ich das Display von den Chinesen in vier 
Wochen in der Post. :-)

von PETER (Gast)


Lesenswert?

// 11111111111111
// Zapis kalibracji do EEPROM
//********************************************************************** 
******************
void kalibracja() // kalibracja dotyku ekranu
{
FTImpl.DLStart(); // Otwieramy liste wyswietlania
FTImpl.ClearColorRGB(0x00, 0x00, 0x00); // Kolor czyszczenia czarny
FTImpl.Clear(1, 1, 1); // Czyścimy ekran
FTImpl.ColorRGB(0xFF, 0xFF, 0xFF); // Ustawiamy kolor bialy (R,G,B)
FTImpl.Cmd_Text((FT_DISPLAYWIDTH / 2), (FT_DISPLAYHEIGHT / 2), 30, 
FT_OPT_CENTER, flashtext(0));//Dotknij punkty
FTImpl.Cmd_FGColor(0xFFFF00); // Kolor pierwszego planu
FTImpl.Cmd_BGColor(0x444400); // Kolor drugiego planu
FTImpl.Cmd_Calibrate(0); // Kalibracja
FTImpl.DLEnd(); // Zamykamy liste wyswietlania
FTImpl.Finish(); // Renderujemu liste i czekamy na ukonczeni

// Pobranie zawartosci 12 rejestrow i wyswietlenie w konsoli
Serial.println(F("uint8_t touchCallibration[24] = {"));
for (uint8_t i = 0; i < 24; i++)
{
EEPROM.write(EEPROM_CALIBRATION_DATA_START + i, 
FTImpl.Read(REG_TOUCH_TRANSFORM_A + i));

if ((i % 4 == 0) && (i > 0)) Serial.println();
Serial.print(F("0x"));
Serial.print(FTImpl.Read(REG_TOUCH_TRANSFORM_A + i), HEX);
if (i < 23) Serial.print(F(", "));
}
EEPROM.write(0, 0xAF);
Serial.println();
Serial.println(F("};"));
nrmenu = 0;
}
//********************************************************************** 
******************
// w setup po inicjalizacji

if ((EEPROM.read(0) != 0xAF) || b == 3 ) //czy w EEPROM procesora o 
adresie 0 zawiera wartość 0xaf lub wciśnięty przycisk podczas 
uruchamiania
{
kalibracja(); //jeśli nie, wiec kalibrujemy ekran i zapisujemy wyniki w 
EEPROM procesora
}
else
{
for (int i = 0; i < 24; i++) // jeśli jest ... kopiujemy dane do 
rejestów "dotyku"
{
FTImpl.Write(REG_TOUCH_TRANSFORM_A + i, 
EEPROM.read(EEPROM_CALIBRATION_DATA_START + i));
}
}

von Rudolph R. (rudolph)


Lesenswert?

Hmm, ja und?
Die Kalibrier-Werte für den Touch des Displays ändern sich sowieso 
nicht, zumindest nicht merklich - über Monate hinweg.
Wofür die im EEPROM halten wenn man die auch statisch im Code haben 
kann?

Ich verwende sogar die gleichen Konstanten für verschiedene TFTs vom 
gleichen Typ.

Wenn man das kommerziell macht wäre es vielleicht nett der 
Kaffeemaschine oder was auch immer die Option zu spendieren, okay.

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.