moritz schrieb:
> ich habe ein Display mit einem GT911 Touch-Controller
Wie schön für dich.
Also:
1 | /* der Block ab 0x8140 im GOODIX GT911 */
|
2 | /* Block wird beim Init des Touch vom Controller gefüllt! */
|
3 | struct TIdentInfo
|
4 | { char ProductID[4];
|
5 | byte BCDFirmwareLO;
|
6 | byte BCDFirmwareHI;
|
7 | byte XResolutionLow;
|
8 | byte XResolutionHigh;
|
9 | byte YResolutionLow;
|
10 | byte YResolutionHigh;
|
11 | byte VendorID;
|
12 | };
|
13 |
|
14 | struct TouchKoordinaten
|
15 | { byte TrackID;
|
16 | byte X_low;
|
17 | byte X_high;
|
18 | byte Y_low;
|
19 | byte Y_high;
|
20 | byte Size_low;
|
21 | byte Size_high;
|
22 | byte reserved;
|
23 | };
|
24 |
|
25 | struct TCoordinateInfo
|
26 | { byte BufferStatus;
|
27 | struct TouchKoordinaten Point[5];
|
28 | };
|
29 |
|
30 | /* die Adressen im Touch-Controller */
|
31 | #define EventFeld 0x814E // hier struct TCoordinateInfo
|
32 | #define EventLaenge (1+(5*8))
|
33 |
|
34 | #define Kommandofeld 0x8040
|
35 | #define KommandoLaenge 1
|
36 |
|
37 | #define VendorIdent 0x814A
|
38 | #define VendorLaenge 1
|
39 |
|
40 | #define KonfigFeld 0x8047
|
41 | #define KonfigLaenge (1 + 0x8100 - 0x8047)
|
42 |
|
43 | #define IdentVersion 0x8140
|
44 | #define IdentLaenge 10
|
moritz schrieb:
> Allerdings
> scheint der Controller keine Berührung zu erkennen, da sowohl der
> Interrupt-Ausgangständig auf Low bleibt, der den uC über eine Berührung
> informieren soll, als auch die Register, in denen mutmaßlich die
> Positionen stehen, Null sind.
Da liegst du aber daneben. Also, der Touchcontroller versucht ganz
verzweifelt, seine Touchdaten loszuwerden, schafft es aber nicht.
Deshalb ist INT auch ständig low.
Ja, es ist ein SCHEISSTRICK, den uns der Hersteller nicht verraten hat:
Um die Daten abholen zu können, mußt du im Interruptprogramm zunächst
das byte Bufferstatus mit einer Null beschreiben und dann erst die 5
Koordinatenblöcke auslesen. Sonst wird das nichts in Ewigkeit.
Also nochmal:
- Int geht auf low, damit soll die ISR gestartet werden
- ISR: zuerst schreibe auf Adresse 0x814E im Touchcontroller ne 0
- ISR: lies aus Touchcontroller ab 0x814E alles aus, also den ganzen
struct TCoordinateInfo.
- jetzt sollte für etwa 13 ms INT wieder auf high gehen.
Noch ne Besonderheit dieser Controller: Sie kennen kein Touch-Up Event.
Du mußt also im µC eine Zeitüberwachung einbauen: Wenn für so etwa
100..200 ms kein INT vom Touchcontroller gekommen ist, dann bedeutet
das, daß der/die Finger vom Display entfernt worden sind, also generiere
dann ein Touch-Up Ereignis.
Im Gegensatz dazu kennen die FT5336 sowohl Touch-DOWN, Touch-MOVE als
auch Touch-UP.
W.S.