Forum: Mikrocontroller und Digitale Elektronik Bräuchte Hilfe bei Touch-Controller-IC


von moritz (Gast)


Lesenswert?

Liebe Mikrocontroller-Community,

ich habe ein Display mit einem GT911 Touch-Controller, der per I2C 
angesteuert wird. Leider wurde offenbar ab einer bestimmten Revision die 
register map aus dem Datenblatt entfernt, und eine alte Version ist nur 
auf Chinesisch zu finden. Kann sich jemand erklären, warum der 
Hersteller sowas macht? Ich bin gerade ein wenig ratlos wie man ohne 
diese map damit arbeiten soll. Übersehe ich da irgendwas 
offensichtliches?

Ich habe ein Datenblatt eines ähnlichen ICs des Herstellers gefunden, in 
dem möglicherweise die gleiche register map benutzt wird. 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. Im Datenblatt steht nicht, ob man noch 
irgendwas initialisieren muss, oder was sonst noch zu tun ist. Hat 
jemand Erfahrung mit diesem oder anderen Touch-Controllern, der mir 
sagen kann ob man da normalerweise irgendwelche bestimmten Einstellungen 
vornehmen muss bevor überhaupt irgendwas erkannt wird?

von online PDF Übersetzung (Gast)


Lesenswert?

Es gibt mich, Google mich doch Mal(siehe Name)

von W.S. (Gast)


Lesenswert?

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.

von moritz (Gast)


Lesenswert?

Wao, ich bin sprachlos! Das hätte mich bestimmt Tage gekostet das 
herauszufinden (wenn überhaupt). Damit hast du mir wirklich 
weitergeholfen, vielen lieben Dank für die Erklärung und Mühe!

von Markus (Gast)


Lesenswert?

Hallo W.S.

ich stand vor dem gleichen Problem wie Moritz. Vielen Dank für deinen 
ausführlichen Erklärungen.
Das man den Bufferstatus zurücksetzen muss steht in den offiziellen 
Datenblätter nicht.

Ein Touch Up Event kennt dieser Controller schon. Er wird jedoch nur 
ersichtlich wenn die Reihenfolge geändert wird in der ISR:
1. Int geht auf low, damit soll die ISR gestartet werden
2. ISR: lies aus Touchcontroller ab 0x814E alles aus, also den ganzen
struct TCoordinateInfo. Das Byte an der Adresse 0x814E zeigt an wieviele 
Finger erkannt wurden (Bit 0 - 3). Wenn Touch Up dann ist bit0-3 = 0. 
Wenn Bit7 = 1, dann sind die Koordinaten gültig. Bit7 = 0, Daten 
ungültig 1ms später nochmals auslesen
3. ISR: schreibe auf Adresse 0x814E im Touchcontroller ne 0

Gruss Markus

Update:
Mittlerweile habe ich ein GT911 Programming Guide gefunden:
https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&ved=2ahUKEwjrirXZsvrkAhVQqaQKHTYjD4IQFjABegQIABAC&url=https%3A%2F%2Fwww.crystalfontz.com%2Fcontrollers%2FGOODIX%2FGT911ProgrammingGuide%2F478%2F&usg=AOvVaw1b9mH08uDh7bQ-djXDwEVQ

Auf Seite 26 ist der Readout Process beschrieben.

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.