Forum: Mikrocontroller und Digitale Elektronik AD7843 Touchwerte nach kurzer Zeit weg


von Bernd S. (mms)


Lesenswert?

Hi,

hab grad ein etwas merkwürdiges Verhalten vom AD7843 feststellen müssen. 
Über einen externen Interrupt (PIRQ-Signal) wird bekannt gegeben, dass 
ein Touch-Event aufgetreten ist; wenn ich jetzt sofort via SPI die 
"Koordinaten des Touches" auslese, funktioniert es; warte ich aber etwas 
länger, ohne irgendetwas zu tun, wird nichts mehr ausgegeben, wenn ich 
die "Koordinaten des  Touches" auswerten möchte.

Arbeite mit dem STM32F103 Prozessor. Eigentlich wollte ich nämlich gern 
einen Timer-Interrupt verwenden + Entprellungsroutine -> aber danach 
kann ich nichts mehr über SPI vom AD7843 auslesen. Setze ich nur den 
externen Interrupt ein, funktioniert es; allerdings liefern manche 
Touches falsche Informationen (sprich die Koordinaten passen überhaupt 
nicht)...

Gruß
Bernd

von Holger S. (holli_1)


Lesenswert?

Definiere doch bitte mal "etwas länger warten". Ich habe ca. 30 ms 
Entprellzeit, damit funktioniert es ohne Probleme. Direkt nach dem IRQ 
zu lesen verursacht auch bei mir ab und zu falsche Koordinaten. Der 
Logikanalysator zeigt auch oft ein Prellen des PenIRQ.

von Bernd S. (mms)


Lesenswert?

Im Timer-Interrupt hatte ich die Entprellroutine von Peter Danegger 
verwendet. Wartezeit 200ms

>>Direkt nach dem IRQ zu lesen verursacht auch bei mir ab und zu falsche 
>>Koordinaten.

Das beobachte ich auch; Rufst du deine Entprellroutine aus einem 
Timer-Interrupt auf oder aus dem externen Interrupt (der aufgerufen 
wird, wenn sich das PIRQ Signal ändert?

von Bernd S. (mms)


Lesenswert?

1
void TIM3_IRQHandler(void)       
2
{
3
4
  static unsigned char ct0, ct1, rpt;
5
  unsigned char i=0; 
6
7
8
  i = key_state ^ ~(GPIOE->IDR >> 9); 
9
  ct0 = ~( ct0 & i ); 
10
    ct1 = ct0 ^ (ct1 & i); 
11
  i &= ct0 & ct1;  
12
13
  if(i != 0)
14
    i = i; 
15
16
  key_state ^= i;
17
  key_press |= key_state & i; 
18
19
  //short key detection
20
    if(get_key_press( ~key_state & ( 1<<KEY2 ) ))
21
  {
22
     //touch press event 
23
    TouchPressEvent(STATE_PEN_PRESSED); 
24
  }
25
26
  //timer flag muss gelöscht werden
27
  TIM3->SR &= ~(1<<0);  
28
}

Hier ist mal meine Interrupt-Routine; In TouchPressEvent wird ein 
Event-Flag gesetzt, so dass dann über die main() Routine der AD7843 
angesprochen wird.

Hab den Timer auch mal auf 1000µs gesetzt - aber keinen Erfolg gehabt. 
Der PIRQ ist low-active;

von Holger S. (holli_1)


Lesenswert?

200ms sind sehr viel, ich messe bei kurzen Berührungen des Touchscreens 
IRQ-Zeiten von 50-150 ms Dauer. Die Prellen dauert, wenn vorhanden, so 
bis 20 ms. Selten länger, meistens noch unter 10ms.
Ich programmiere noch in Bascom. Am Anfang habe ich die Werte sofort in 
der Interrupt-Routine gelesen, mit den bekannten Folgen. Jetzt läuft das 
in der Hauptschleife als Portabfrage mit Entprellung, der AVR hat sonst 
kaum was zu tun. Die Entprellzeit ist da 25ms. Während der Wartezeit 
habe ich auch den Pull-up des Ports aktiv. Zum Messen wird der 
deaktiviert.
Probiere mal eine Entprellzeit von 20-30ms, damit sollte es 
funktionieren.

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.