Forum: Mikrocontroller und Digitale Elektronik Clear Interrupt State Touchscreen


von HIGH LEVEL LOW LEVEL (Gast)


Lesenswert?

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
7
while(Touchstatus())         // Touch gedrückt???
8
{
9
Abfrage_Koordinaten();       // Koordinaten ermitteln
10
clear_Touch();               // lösche Touchinterrupt
11
if(((XPOS >=650)&&(XPOS<=725))&&((YPOS >=450)&&(YPOS<=544)))
12
{}
13
if(((XPOS >=650)&&(XPOS<=725))&&((YPOS >=450)&&(YPOS<=544)))
14
{}
15
if(((XPOS >=650)&&(XPOS<=725))&&((YPOS >=450)&&(YPOS<=544)))
16
{}
17
// ...
18
clear_Touch();               // lösche Touchinterrupt
19
20
}
21
}

von m.n. (Gast)


Lesenswert?

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.

von HIGH LEVEL LOW LEVEL (Gast)


Lesenswert?

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.
"

von Sascha W. (sascha-w)


Lesenswert?

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

von HIGH LEVEL LOW LEVEL (Gast)


Lesenswert?

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
bit Touch_Status(void)
3
{  
4
    uchar temp;
5
  LCD_CmdWrite(0xF1);//INTC  
6
  temp =LCD_DataRead();
7
  if ((temp&0x04)==0x04)
8
  /*temp=LCD_StatusRead();
9
  if ((temp&0x10)==0x10)*/
10
  return 1;
11
  else 
12
  return 0;
13
}
14
//////////////Touch the coordinate display
15
void TP(void)  
16
{unsigned int lx,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
void main(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 
97
Delay10ms(5);
98
           if(Touch_Status())
99
             {
100
            TP();
101
             }
102
      else
103
      {
104
            FontWrite_Position(100,60); 
105
                      LCD_CmdWrite(0x02);
106
            String("X = 0000");
107
            FontWrite_Position(100, 140); 
108
            LCD_CmdWrite(0x02);
109
            String("Y = 0000");   
110
      }
111
}
112
}
113
}

von HIGH LEVEL LOW LEVEL (Gast)


Lesenswert?

Es kann ja nicht sein, dass der touch Interrupt an 3 Stellen gecleart 
werden muss.

Vom Gefühl her hätte ich es so aufgebaut:
1
Write_Dir(0xf0,0x04);//open interruption
2
Write_Dir(0x71,0x00);//set to 4-wire touch screen
3
Write_Dir(0x70,0xB2);//open the touch function, touch the parameter Settings
4
5
while(1)
6
{
7
while (Touch_Status()) // Touchpanel gedrückt?
8
{
9
TP(); // Ermittle Koordinaten inklusive Touch Interrupt clearen
10
// Koordinaten verarbeiten
11
12
}
13
14
}

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

von HIGH LEVEL LOW LEVEL (Gast)


Lesenswert?

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"

von m.n. (Gast)


Lesenswert?

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.

von Sascha W. (sascha-w)


Lesenswert?

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

von HIGH LEVEL LOW LEVEL (Gast)


Lesenswert?

Der Controller ist an den MCU via SPI angeschlossen.
ADC_X und ADC_XY geben nur die Touch Koordinaten über SPI zurück
1
/////////Read TP the X coordinate
2
unsigned char ADC_X(void)
3
{
4
        unsigned char temp;
5
        LCD_CmdWrite(X_TOUCH_HIGH);             //TPXH   X_coordinate high byte
6
        temp=LCD_DataRead();
7
  return temp;
8
}
9
10
/////////Read TP the Y coordinate
11
unsigned char ADC_Y(void)
12
{
13
        unsigned char temp;
14
        LCD_CmdWrite(Y_TOUCH_HIGH);             //TPYH    Y_coordinate high byte
15
        temp=LCD_DataRead();
16
        return temp;
17
}
18
19
////////////Read TP the XY coordinates, the coordinates (high)
20
unsigned char ADC_XY(void)
21
{
22
        unsigned char temp=0;
23
        LCD_CmdWrite(0x74);             //TPXYL    bit[3:2] Y_coordinate low byte  bit[1:0] X_coordinate low byte
24
        temp=LCD_DataRead();
25
        return temp;
26
27
}

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.