Hallo,
ich habe nach einem Beispiel Code ein Touchscreen implementiert. Die
Touchabfrage ist Interrupt gesteuert. An welchen Stellen muss der
Touchinterrupt in der Regel gelöscht werden?
Normalerweise stelle ich mir das so vor, dass der Touchabgefragt wird
und dann kurz vor der nächsten Abfrage wieder gecleart werden muss.
In dem folgenden Programmkonstrukt funktioniert die Abfrage zwar, aber
ein Touch wird nur registriert, wenn "feste drücke". Das kann so nicht
richtig sein:
1
...
2
while(1)
3
{
4
show_menu(menuzaehler);// zeige Menu
5
clear_Touch();// lösche Touchinterrupt
6
delayms(50);// Entprelle Touch -> so dass nicht mehrere Touchs detektiert werden
HIGH LEVEL LOW LEVEL schrieb:> gecleart
Du meinst gelöscht?
Beim Drücken legt die ISR die Koordinaten zusammen mit einem Status-Bit:
'gedrückt' ab. Beim Loslassen wird das Status-Bit auf 'losgelassen'
geändert.
Damit kann man den aktuellen Zustand bewerten. Gelöscht wird nichts.
Es handelt sich um das Touch Panel Interrupt Clear Bit:
"
Write Function Touch Panel Interrupt Clear Bit
0 : No operation.
1 : Clear the touch interrupt.
Read Function Touch Panel Interrupt Status
0 : No Touch Panel interrupt happens.
1 : Touch Panel interrupt happens.
"
Hallo,
du solltest die Funktion clear_touch() nur aufrufen wenn auch ein Touch
aufgetreten ist!
Ein Entprellen ist in der Regel nicht erforderlich, stattdesen liest man
die Werte mehrfach aus und mittelt das Ergebnis. Natürlich nur wenn
deine Funktion die Rohwerte vom AD-Wandler liest.
Zeig doch mal den Rest von deinem Touchcode.
Sascha
Danke sehr Sascha,
Selbst in dem Beispiel Code wird die Funktion clear_Touch() IMMER
aufgerufen und dann wenn ein Touch auftritt nochmals in der Funktion
TP(), in der die Koordinaten berechnet werden. Diesen BeispielCode habe
ich versucht auf meine Bedürfnisse umzuschreiben.
ich kann mal den kompletten Beispiel Code vom Controller aufzeigen:
1
/////////////Touch the interrupt judgment
2
bitTouch_Status(void)
3
{
4
uchartemp;
5
LCD_CmdWrite(0xF1);//INTC
6
temp=LCD_DataRead();
7
if((temp&0x04)==0x04)
8
/*temp=LCD_StatusRead();
9
if ((temp&0x10)==0x10)*/
10
return1;
11
else
12
return0;
13
}
14
//////////////Touch the coordinate display
15
voidTP(void)
16
{unsignedintlx,ly,i;
17
Delay10ms(1);
18
X1=0;
19
X1|=ADC_X();
20
i=(X1<<2);
21
X1=i|((ADC_XY()&0x03));
22
23
Y1=0;
24
Y1|=ADC_Y();
25
i=(Y1<<2);
26
Y1=i|((ADC_XY()>>2)&0x03);
27
28
tabx[0]=X1/1000;
29
tabx[1]=X1%1000/100;
30
tabx[2]=X1%100/10;
31
tabx[3]=X1%10;
32
taby[0]=Y1/1000;
33
taby[1]=Y1%1000/100;
34
taby[2]=Y1%100/10;
35
taby[3]=Y1%10;
36
37
FontWrite_Position(100,60);//Set the display position
38
LCD_CmdWrite(0x02);
39
String("X = ");
40
LCD_DataWrite(tabx[0]|=0x30);
41
//Delay1ms(1);
42
LCD_DataWrite(tabx[1]|=0x30);
43
//Delay1ms(1);
44
LCD_DataWrite(tabx[2]|=0x30);
45
//Delay1ms(1);
46
LCD_DataWrite(tabx[3]|=0x30);
47
//Delay1ms(1);
48
49
FontWrite_Position(100,140);//Set the display position
50
LCD_CmdWrite(0x02);
51
String("Y = ");
52
LCD_DataWrite(taby[0]|=0x30);
53
//Delay1ms(1);
54
LCD_DataWrite(taby[1]|=0x30);
55
//Delay1ms(1);
56
LCD_DataWrite(taby[2]|=0x30);
57
//Delay1ms(1);
58
LCD_DataWrite(taby[3]|=0x30);
59
//Delay1ms(1);
60
61
Write_Dir(0x40,0x00);//The drawing mode
62
63
lx=(480-(((X1-50))*10/18));
64
ly=(272-(((Y1-63))*10/33));
65
66
MemoryWrite_Position(lx,ly);//Memory write position
67
LCD_CmdWrite(0x02);//Memory write Data
68
LCD_DataWrite(0x07);
69
LCD_DataWrite(0xe0);
70
LCD_DataWrite(0x07);
71
LCD_DataWrite(0xe0);
72
MemoryWrite_Position(lx,ly+1);//Memory write position
73
LCD_CmdWrite(0x02);////Memory write Data
74
LCD_DataWrite(0x07);
75
LCD_DataWrite(0xe0);
76
LCD_DataWrite(0x07);
77
LCD_DataWrite(0xe0);
78
79
Write_Dir(0xf1,0x04);//clear INT state Must be clean TP_interrupt
80
X1=0;
81
Y1=0;
82
}
83
84
voidmain(void)
85
{
86
// ...
87
while(1)
88
{
89
Write_Dir(0xf0,0x04);//open interruption
90
Write_Dir(0x71,0x00);//set to 4-wire touch screen
91
Write_Dir(0x70,0xB2);//open the touch function, touch the parameter settings
92
93
//Delay100ms(50);
94
while(next)
95
{
96
Write_Dir(0xf1,0x04);//clear INT state Must be clean TP_interrupt
Hier habe ich die ganzen Funktionsnamen aus dem Code-Beispiel verwendet.
Was mich wundert, dass in dem Beispiel Code die Funktionen open
interruption, set to 4-wire und open touch function auch in jedem Zyklus
aufgerufen werden
Das Display ist einfach zu unempfindlich, d.h. ich muss mit dem Finger
schon lange und feste drücken, damit es zuverlässig reagiert. Es handelt
sich wie schon gesagt um ein resistives Display. Wenn ich mit einem
Touch Pen das Display betätige reagiert es deutlich schneller.
Ich habe also zwei Probleme
1. Display reagiert zu langsam
2. Man muss zu feste Drücken
Ich bin mir unsicher ob dies ein Software Problem ist Oder ob dies bei
diesem Display "fertigungsbedingt einfach so ist"
HIGH LEVEL LOW LEVEL schrieb:> Ich bin mir unsicher ob dies ein Software Problem ist Oder ob dies bei> diesem Display "fertigungsbedingt einfach so ist"
Vielleicht hast Du es auch kaputt gedamaged.
Hallo,
was machen die ADC_X und ADC_XY Funktionen? Werte vom Display holen -
nehme ich mal an. Da die Touchauswerung ja offensichtlich im
Displaycontroller integriert ist wird sich da in Sachen Empfindlichkeit
nicht viel machen lassen.
Man könnte die Toucherkennung evl. selbst machen indem man immer nur die
Wandlerwerte ausliest, geht aber nur wenn das Display dort
kontinuierlich Messwerte liefert. Wie ist das Display an den Controller
angebunden?
Sascha