Hallo Forum ich habe ein kleines Problem stehe aber im Moment auf dem Schlauch und habe keine Vernünftige Idee das zu lösen. Ich habe ein Arduino Due mit einem 5Zoll TFT (ER-TFTM050-5 von Buydisplay) mit integriertem Touch Controller GSL1680. Zwischen DUE und Display ist ein Shield mit LevelShifter (5V / 3.3V). Läuft soweit alles ok mit der UTFT libary. In der BEschreibung zum Touch Controller steht dass er ein Interrupt verwendet wenn ein Ereignis (drücken auf den Touchscreen). Doch leider sieht die "Realität anders aus. Der Touch Controller sendet den Interrupt aber anders. Je nach Zeitdauer des drückens produziert der GSL1680 ehtliche Interrupts. Die Interrupst sind 1ms lang und haben eine Pause von 20ms. Also wird die Digitale Leitung nicht nur einmal sondern wechselt zigmal von High to Low. Da wird die Auswertung mittels Interrupt Routine zum Nervenspiel.... Den Interrupt habe ich so eingerichtet: - attachInterrupt(digitalPinToInterrupt(48), isr_touch, FALLING); Die ISR: void isr_touch(){ touch_flag = true; Serial.println("touch "); //nur zur Veranschaulichung } Die Abfrage des GSL1680: void read_touch(){ if (touch_flag == true){ noInterrupts(); Serial.print("read touch"); int n= read_data(); for(int i=0; i<n; i++){ Serial.print(ts_event.coords[i].finger); Serial.print(" "),Serial.print(ts_event.coords[i].x); Serial.print(" "), Serial.print(ts_event.coords[i].y); Serial.println(""); } touch_flag = false; menu_flag = true; interrupts(); } } hat vielleicht jemand eine Idee wie ich das Lösen kann ? Gruss Thomas
Du möchtest ja auch mitbekommen, wenn der Benutzer seinen Finger über das Display bewegt, deshalb schickt der Controller ständig die neuen Koordinaten per Interrupt. Du müsstest in der Interrupt-Routine oder ausgelöst durch die Interruptroutine in der Hauptschleife die Koordinaten abholen und hinterlegen. Dann musst Du entscheiden wann Du auf den Touch reagieren willst. Entweder beim ersten Impuls ("Key down") und die ignorierst die weiteren, die im Abstand von 20ms kommen. Oder Du wartest bis keine Updates mehr kommen ("Key up") und ignorierst alle vorher. D.h. in beiden Fällen musst Du einen Timeout definieren -> z.B. ab 40ms kein Update hast Du das "Key Up" Event. Auf Code-Seite setzt Du jedesmal ein Timestamp, wenn ein Int kommt:
1 | lastTouch = getMillis() |
Und in der Hauptschleife:
1 | if (getMillis() - lastTouch > 40) { |
2 | // koordinaten auswerten, button ermitteln, aktion starten |
3 | } |
:
Bearbeitet durch User
Hallo Conny Danke für deinen Input. Funktioniert aber nicht wirklich Ich habe Tasten auf dem Display, so dass es eher eine statische Abfrage ist nichts zum wischen oder so :-). Aber deine Erklärung macht Sinn. Die if Anweisung in der loop ist immer wahr, weil millis() ja immer hoch zählt nach dem Start und die lastTouch ja nur beim eintreffen des Interrupts. Oder sehe ich das falsch ? gruss Thomas
Hi Thomas, im Prinzip ist das if immer wahr wenn kein Button (mehr) gedrückt ist. Um es zu einem Key Up Event zu machen muss man es noch ein bisschen ausbauen, das stimmt. Irgendwie so:
1 | if (getMillis() - lastTouch > 40 && buttonDown) { |
2 | buttonDown = false; |
3 | // jetzt auswerten welcher Button es war etc. |
4 | } |
Und im Interrupt buttonDown auf true setzen. Das ist jetzt nicht komplett ausformuliert, aber ich hoffe die Idee kommt rüber.
Hallo Conny Ja "jetzt" habe ich deine Idee langsam verstanden :-) Ich versuche das mal umzusetzen. Gruss Thomas
Hallo Thomas, Ich stehe gerade vor dem gleichen Problem. Ich versuche den GSL1680 mit meinem F4-Discovery zum Laufen zu bringen. Die I2C-Kommunikation funktioniert tadellos. Der IRQ-Pin wird von mir testweise in einer while(1)-Schleife eingelesen. Der IRQ-Pin toggelt wie verrückt, selbst wenn ich den Touchscreen NICHT berühre! Drücke ich ein paar mal auf dem Screen herum, bekomme ich ab und zu plausible Werte für die X- und Y-Position, jedoch sehr unzuverlässig. Bist du diesbezüglich schon weitergekommen? Ich frage mich, ob das mit der Firmware zusammenhängt, die man bei der Initialisierung per I2C aufspielt. Viele Grüße Julian
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.