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
Es benutzen ja gerade relativ viele das FT800... Hat denn keiner eine Lösung? :'(
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
Die hatte ich auch versucht zu ändern aber ohne Erfolg. :(
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.
Ja die include habe ich ergänzt. Wie meinst du das mit wackeln? Also muss ich den Pin12 als Output deklarieren, richtig?
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.
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
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?
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. :-)
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.
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?
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.
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?
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.
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
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()??? :)
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.
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. :-)
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. :)
Ach herrje, mit Glück habe ich das Display von den Chinesen in vier Wochen in der Post. :-)
// 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)); } }
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.