Forum: Mikrocontroller und Digitale Elektronik Arduino Display Probleme


von David (Gast)


Angehängte Dateien:

Lesenswert?

Hallo euch alle,
ich habe ein Problem mit meinem Touchscreen an meinen Arduino UNO.
Ich muss bei mehrfach verschatelten Anweißungen das Display neu 
"initaliesieren", wodurch das Display kurz weiß wird, was nerft.
Ohne "Neuinitialiesirung" wird das Display weiß, wenn ich was zeichnen 
möchte.

Ich habe den Sketch mit Problem angehängt und die beiden Stellen mit dem 
selben Porblem mit Kommentaren mit Problembeschreibung markiert im loop 
Bereich.

von David (Gast)


Lesenswert?

Ah ja, ich verwende folgendes Display:
http://www.ebay.de/itm/182351447657?_trksid=p2057872.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT

Den Controller des Displays muss ich noch nachgucken.

von Joachim B. (jar)


Lesenswert?

du könntes die Display Hintergrundbeleuchtung aus dem Quelltext extra 
ansteuern, also aus der LIB entnehmen, wird ja nur ein Port sein der es 
on/off schaltet.

Mir ist deine Beschreibung unklar, wieso neu initialisieren, musste ich 
nie, wenn ich was lösche überschreibe ich gesetzte Pixel mit black, als 
Text oder Block.

: Bearbeitet durch User
von David (Gast)


Lesenswert?

Das kommt mir auch kommisch vor. Es ist so als wenn der Microcontroller 
vergisst, wie er das Display richtig anzusteuern hat.
Ich werde mal, wenn ich genügend Zeit finde, das auf Video aufzunehmen.

von npn (Gast)


Lesenswert?

Joachim B. schrieb:
> du könntes die Display Hintergrundbeleuchtung aus dem Quelltext extra
> ansteuern, also aus der LIB entnehmen, wird ja nur ein Port sein der es
> on/off schaltet.

Glaubst du, daß dafür ein ganzer Port benötigt wird? Ich glaube, ein 
Pin, also ein Bit reicht.

von Joachim B. (jar)


Lesenswert?

alter bipolarer Freund du hast Recht habe mich vertippt.

von npn (Gast)


Lesenswert?

Joachim B. schrieb:
> alter bipolarer Freund du hast Recht habe mich vertippt.

Okay :-)

von David (Gast)


Lesenswert?

So hier könnt ihr das Problem in Videoform sehen:

Nur "tft.begin(identifier);" im setup():
https://www.youtube.com/watch?v=sM_etlgVOiM&feature=youtu.be

mit wiederholten "tft.begin(identifier);" in den verschachtelten 
if-Abfragen neben dem schon in der setup-Methode vorkommenden 
"tft.begin(identifier);" :
https://www.youtube.com/watch?v=a9-MRCoRIaY&feature=youtu.be

von Joachim B. (jar)


Lesenswert?

ich machte das anders

ich merkte mir den alten Text

überschrieb den mit Textfarbe black schaltete die Textfarbe um und 
schreibe den neuen Text in der gewünschten Farbe
1
#define TS_1_SWITCH p.x >= 80 && p.x <160 &&  p.y > 48 && p.y < 112
2
3
  if(!ts.bufferEmpty())
4
  { p = ts.getPoint();   // Retrieve a point  
5
    p.x = map(p.x, TS_MINX, TS_MAXX, 0, tft.width()); p.y = map(p.y, TS_MINY, TS_MAXY, 0, tft.height());       
6
7
    if( TS_1_SWITCH )
8
    { MScreen(SCREEN_CLR, M1); tft.setTextColor(ILI9341_BLACK); tft.setTextSize(MED_TEXT); 
9
      if(tft1_col==ILI9341_GREEN)         // int.
10
      { tft.setCursor((239 - (MED_TEXT * 4 * 6)), (MED_TEXT * 2 * 8)+(MITTELOFFSET/2)+Y1_OFFSET); tft.print(F("int.")); tft1_col=ILI9341_RED; 
11
        DAC_PORT |= (1<<DAC1_EXT1); Serial.println(F("Umschaltung 1 auf extern")); tft.setTextColor(tft1_col); tft.setTextSize(MED_TEXT); 
12
        tft.setCursor((239 - (MED_TEXT * 4 * 6)), (MED_TEXT * 2 * 8)+(MITTELOFFSET/2)+Y1_OFFSET); tft.print(F("ext.")); MScreen(SCREEN_PRT, M1);
13
      } // if(tft1_col==ILI9341_GREEN)
14
      else                                // ext.
15
      { tft.setCursor((239 - (MED_TEXT * 4 * 6)), (MED_TEXT * 2 * 8)+(MITTELOFFSET/2)+Y1_OFFSET); tft.print(F("ext.")); tft1_col=ILI9341_GREEN; 
16
        DAC_PORT &= ~(1<<DAC1_EXT1); Serial.println(F("Umschaltung 1 auf intern")); tft.setTextColor(tft1_col); tft.setTextSize(MED_TEXT); 
17
        tft.setCursor((239 - (MED_TEXT * 4 * 6)), (MED_TEXT * 2 * 8)+(MITTELOFFSET/2)+Y1_OFFSET); tft.print(F("int.")); MScreen(SCREEN_PRT, M1);
18
      }
19
    } // if( TS_1_SWITCH )
20
21
    delay(20);
22
    while( !ts.bufferEmpty() ) 
23
      p = ts.getPoint();   // Retrieve a point  
24
25
  } // if(!ts.bufferEmpty())

wozu soviel Aufwand bei dir mit Init?

: Bearbeitet durch User
von David (Gast)


Lesenswert?

Die meisten Int-Variablen werden noch wiederverwendet, aber ich mache 
erst einmal die ganze Interface, da derzeitig nur das Display angekommen 
ist und der Rest noch im Versand ist.

von David (Gast)


Lesenswert?

Hab ein bisschen mit dem Code von Joachim gespielt, aber keine 
besserung. Sogar bei folgenden Testcode gibt es das selbe Problem und 
das ist nicht viel:

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

#define YP A1
#define XM A2
#define YM 7
#define XP 6

#define MINPRESSURE 10
#define MAXPRESSURE 1000

#include <stdint.h>
#include <Adafruit_GFX.h>
#include "TouchScreen.h"
#include <MCUFRIEND_kbv.h>
MCUFRIEND_kbv tft;

#define BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define YELLOW  0xFFE0
#define WHITE   0xFFFF

TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);

uint16_t displayId;

void setup() {
  tft.reset();
  displayId = tft.readID();
  tft.begin(displayId);
  tft.fillScreen(BLACK);

  tft.setRotation(1);
  tft.drawRect(0,0,400,240,WHITE);
}

void loop() {

  TSPoint p = ts.getPoint();
  if (p.z > 10 && p.z < 1000) {
    tft.setTextSize(6);
    tft.setTextColor(WHITE);
    tft.setCursor(10,10);
    tft.print("TEST");
  }

}


Ich habe auch mal den Microcontroller gegen einen neuen Unbenutzten 
getauscht (vieleicht ist ja im RAM-Bereich was hin), aber mit dem neuen 
Controller ist es das selbe. Und die mitgelieferten Beispiele laufen 
einwandfrei. Also Hardwareseitig kann man einen Fehler fast 
ausschließen.

von Joachim B. (jar)


Lesenswert?

David schrieb:
....... Und die mitgelieferten Beispiele laufen
> einwandfrei. Also Hardwareseitig kann man einen Fehler fast
> ausschließen.

arrrrrr.....


was läuft? das was du hier eben schriebst?

igendwie fehlt

delay(20);
    while( !ts.bufferEmpty() )
      p = ts.getPoint();   // Retrieve a point

am Ende

du bekommst ja mehr Events also wenn eine Aktion ausgelöst wurde:

if (p.z > 10 && p.z < 1000) {
    tft.setTextSize(6);

sollte am Ende Buffer leeren und eine kleine Wartezeit sein

Wenn auch dein Mini Code nicht läuft weiss ich nicht mehr weiter, bei 
mir läuft es mit mehr Code und ohne Zeitbegrenzung.

Wenn du es nicht genauer beschreibst "was wann wie" kann dir keiner mehr 
helfen!

von David (Gast)


Angehängte Dateien:

Lesenswert?

Du hast so wie es scheint eine andere touchscreen-libary als ich. Meine 
kennt so wie es aussieht kein bufferEmpty() z.B. (zumindest mekert er 
bei mir herum).
Ach ja, der Testcode basiert auf eine beim touchscreen mitgelieferten 
Demo, die mal anhänge.

Das Problem kann man auch so beschreiben:Display kann nach z.b. 
if-abfragen nur genutzt werden, wenn tft.begin(); vor dem nutzen des 
Displays vorkommt.
Quasi als wenn man wenn man mit der seriellen Schnittstelle (bei 
seriellen schnittstelle ist keinerlei Probleme, die wird nur für 
sinbildliche Metapher zum Erklären des Problems genutzt) etwas senden 
möchte müsste man nicht nur direkt zu begin des Programmes 
Serial.begin(9600); ausführen sondern auch nach if-Abfragen zum 
Beispiel.

Wenn du möchtest, kann ich dir meine zum touchscreen mitgelieferte 
touchscreen-libary hier posten. wahrscheinlich ist die anders als deine.

von David (Gast)


Angehängte Dateien:

Lesenswert?

So ich habe jetzt eine andere mitgelieferte Demo "ausgeschlachtet" und 
damit funktioniert es bischer recht gut. Ich lade den Code mal hoch 
falls jemand anders in Zukunft Probleme hat (Ist aber kaum kommentiert 
und beinhaltet einiges an Testcode). Und ich habe in den Code der bei 
meinen Touchscreen enthaltenen Touchscreen-Libary geguckt in die hat 
KEINE Funktion bufferEmpty(). Also ist dieser Code nur für diejenigen 
geeignet, deren mitgelieferte Libary kein bufferEmpty() hat.
Ich werde mich hier wieder melden wenn es doch noch Probleme geben 
sollte.

Aber vielen Danke euch allen für eure Hilfe.

von Rudolph R. (rudolph)


Lesenswert?

Gibt es eigentlich auch irgendwo einen Schaltplan zu dem namelosen Teil?

von David (Gast)


Angehängte Dateien:

Lesenswert?

Auf Anfrage sendet der Händler den Schaltplan, Demos und die Libaries.
Ich hänge mal den mitgelieferten Schaltplan an so wie der mir von 
Händler zugeschickt wurde.

von Rudolph R. (rudolph)


Lesenswert?

Danke, sowas ist immer interessant.

Sind da wirklich 74HC245 drauf als Pegelwandler bestückt?
Die mit 3,3V zu versorgen und 5V Pegel anzulegen wäre gewagt.
Und zwar sowohl für den Arduino, als auch für das Shield.

Aber erstmal müssten die 3,3V überhaupt stabil sein, wie der AMS117-3.3 
das ohne Kondensator zuverlässig machen soll ist schon erstaunlich.
Oder was auch immer da wirklich verbaut ist in dem SOT-89 Gehäuse.

Die Beschaltung vom SD-Sockel ist quasi nicht vorhanden, funktionieren 
damit wirklich irgendwelche Karten?

LCD_DB3 auf MOSI und LCD_DB5 auf MISO macht bestimmt Freude in der 
Software.

Erst habe ich ja gedacht die Dinger sehen günstig aus, jetzt halte ich 
die für billigen Ramsch.

von David (Gast)


Lesenswert?

Was erwartet man für 9€ inklusive Versand. Aber für erste Versuche gut 
genug (wenn was schief läuft und das Ding hinüber ist, waren nur 9€).

von Rudolph R. (rudolph)


Lesenswert?

David schrieb:
> Was erwartet man für 9€ inklusive Versand.

Grundsätzliche Funktion ohne das man Gefahr läuft das was abfackelt ist 
sicher kein Luxus.

von David (Gast)


Lesenswert?

Mich faszieniert, das die nicht einfach 3,3V vom Ardiuno-Board selber 
genohmmen haben.

von Rudolph R. (rudolph)


Lesenswert?

David schrieb:
> Mich faszieniert, das die nicht einfach 3,3V vom Ardiuno-Board selber
> genohmmen haben.

Dafür reicht der Strom nicht den der 3,3V Regler auf dem Arduino liefern 
kann.
Die SD Karte alleine könnte schon zu viel sein, in Kombination mit dem 
TFT sicher, da sowohl die Logik-Versorgung als auch die 
Hintergrund-Beleuchtung aus den 3,3V gespeist werden.

Würde mich auch nicht wundern, wenn das TFT "abstürzt" wenn man im 
Betrieb eine SD-Karte einlegt.

: Bearbeitet durch User
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.