Bräuchte Hilfe bei Touch-Controller-IC

Gast #5790111
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?
Gast #5790391
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.
Gast #5989469
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.