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
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.
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?
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;
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.