mikrocontroller.net

Forum: Compiler & IDEs Touchscreen (tslib) "debounce"


Autor: Nils S. (kruemeltee) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich bastle gerade mit der tslib herum. Dabei stosse ich auf folgendes 
Problem und weiss gerade nicht weiter.

Wenn ich auf den Touchscreen tippe, werden gleich mehrere Clicks 
registriert.

Meine Funktion zum abfragen sie so aus:
...
clock_t time1;
...
int getxy(int *x, int *y) {
    int ret=0;
    while( (time1 + (CLOCKS_PER_SEC)) <= clock() ) {
      printf("x");
    }
    ret = ts_read(ts, &samp, 1);
    if(ret < 0) { printf("can't read from touchscreen!\n"); return(-1); }
  if(debug) printf("ts_debug: x: %d y: %d\n", samp.x, samp.y);
    *x = samp.x;
    *y = samp.y;
    time1 = clock();
    return 0;
}
clock_t ist ein unsigned int und clock() liefert die Anzahl der clocks 
seit Programmstart zurück. CLOCKS_PER_SEC ist ein #define, welches die 
Anzahl der Clocks pro Sekunde enthält.
time1 ist eine globale Variable (clock_t).

Normalerweise sollte er doch hier warten bis er in der Funktion 
fortfährt, bis eine Sekunde seit dem letzten Click vergangen ist, nur 
leider funzt das nicht, er fährt einfach so weiter fort.

Irgendwo ist ein Denkfehler drin und ich finde ihn nicht, vielleicht 
könnt ihr mir ja helfen.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die while-Bedingung macht keinen Sinn. "time1 + (CLOCKS_PER_SEC)" ist 
ein konstanter Wert (konstant innerhalb der Schleife), der auf 
kleiner-gleich gegen einen sich vergrößernden Wert getestet wird. Daraus 
ergibt sich, dass die Bedingung entweder sofort false, oder für immer 
(zumindest bis zum Überlauf des von clock() gelieferten Wertes) true 
ist.

Autor: Nils S. (kruemeltee) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmmm jetzt hab ich den Fehler entdeckt, das <= wurde zu > und er wartet 
mir brav die Sekunde.
Jetzt hab ich noch CLOCKS_PER_SEC/3, aber stosse auf ein weiteres 
Problem.

Er "erkennt" trotzdem immer mehrere Clicks auf einmal, die dann 
nacheinander, als stehen sie in einer Warteschlange, an getxy() gegeben 
werden.
Ich habe es schon mit einem dummy ts_read() in der Warteschleife 
versucht, aber dann kann ich nicht draufbleiben, es wird dann nur ein 
click gezählt, obwohl die getxy mehrfach aufgerufen wird.
Sprich ich habe einen Button, der eine Variable runterzählt. Ohne die 
Warteschleife kann ich auf dem Button bleiben und er zählt immer weiter 
runter (was so gewollt ist) und wenn ich den dummy-read einbaue, muss 
ich pro Runterzählen einmal drücken und wieder loslassen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.