Forum: Projekte & Code QTOUCH ohne ASF (C Sourcecode)


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Peter D. (peda)


Angehängte Dateien:

Bewertung
3 lesenswert
nicht lesenswert
Anbei mal der komplette Sourcecode für QTouch mit dem ADC.
Das Beispiel ist für die ATmega48..328[A/P/PA/PB]. Es läßt sich leicht 
auf andere AVRs und mehr Touchtasten anpassen.
Benutzt werden PORTC4 und PORTC5. Über PORTB1 erfolgt die Ausgabe der 
ADC-Werte mit 9600 Baud.
Getestet wurde es auf dem STK500. Als Sensorflächen wurden 2 der 
2-poligen Kabel angeschlossen. Gesteuert wird mit den Tasten ein 
Lauflicht an PORTD.

Funktion:
Zwischen den Wandlungen wird die S&H-Stufe auf 0V entladen. Der Touchpin 
wird auf VCC geladen und vor der Wandlung hochohmig geschaltet. Die 
S&H-Stufe entlädt dann die Pinkapazität und es erfolgt die Wandlung. Bei 
Annäherung steigt die Ladung (Spannung).
Zur Störunterdrückung erfolgt eine Mittelwertbildung. Der Wert bei 
losgelassener Taste wird automatisch gespeichert.
Als Schwellwert für gedrückt wurde 10 festgelegt. Bei größeren 
Sensorflächen kann man den Wert erhöhen. Außer dem Schwellwert sind 
keine weiteren Einstellungen nötig.
Die weitere Verarbeitung erfolgt dann in gewohnter Weise durch meine 
Entprell-Lib. Die 10ms werden durch einen Zähler im ADC-Interrupt 
erzeugt.
Die Routine erfolgt über den ADC-Interrupt im Hintergrund. Die Mainloop 
wird also nicht ausgebremst.
Hier der ADC-Code:
ISR(ADC_vect)
{
  static uint8_t touch_no;
  touch[touch_no].val += ADC - (touch[touch_no].val>>TOUCH_AVG);
  switch (touch_no++)
  {
    case 0:
      TOUCH_PORT0 = 1;                                  // charge next Touch Input
      TOUCH_DDR0 = 1;
      TOUCH_DDR1 = 0;
      TOUCH_PORT1 = 0;                                  // open Touch Input
      ADMUX = 1<<REFS0 | TOUCHMUX1;                     // S&H
      break;
    default:
      touch_no = 0;
      TOUCH_PORT1 = 1;                                  // charge next Touch Input
      TOUCH_DDR1 = 1;
      TOUCH_DDR0 = 0;
      TOUCH_PORT0 = 0;                                  // open Touch Input
      ADMUX = 1<<REFS0 | TOUCHMUX0;                     // S&H
      break;
  }
  ADCSRA = ADCSRA_START;
  ADMUX = ADMUX_GND;                                    // S&H GND after conversion complete
Im Anhang das komplette Beispiel.
Ich würde mich freuen, wenn jemand seine Erfahrungen damit berichten 
könnte.

von Apollo M. (Firma: @home) (majortom)


Bewertung
-1 lesenswert
nicht lesenswert
Peter D. schrieb:
> für QTouch mit dem ADC.

... hast du dir mal die quellen von qtouch angesehen?
weil, da gibt es wesentlich mehr funktionalität bzgl. automatischer 
störunterdrückung, sicherer erkennung in verrauschter/emv lastiger 
umgebung, ...

daher sprechen wir hier nur über eine touch function mit adc,
1-pin/key ohne reference pin - oder?


die code size der reinen touch fct ist auch nicht optimal umgesetzt.
es gibt auch gute source quellen in github zu finden. bei interesse kann 
ich dir auch was schicken.


deine "source qualität" ansonsten finde ich im vergleich zu dem 
low-level der hier sonst so erscheint recht gut!


mt

von Peter D. (peda)


Bewertung
1 lesenswert
nicht lesenswert
Apollo M. schrieb:
> ... hast du dir mal die quellen von qtouch angesehen?

Wenn ich wüßte, wo man die findet. Kannst Du mal was verlinken?
Ich hab das so verstanden, daß die QTouch-Lib nur per AS7 Wizzard direkt 
in das Projekt eingefügt werden kann, also nicht als C-Code vorliegt.

Ich hab aber noch weiter experimentiert und eine einfachere Variante 
gefunden. Der Vergleichswert wird direkt nach dem Reset gemessen, d.h. 
die Tasten dürfen beim Einschalten nicht betätigt sein. Es ist auch 
keine Mittelwertbildung nötig, die Entprellung reicht aus.

Apollo M. schrieb:
> daher sprechen wir hier nur über eine touch function mit adc,
> 1-pin/key ohne reference pin - oder?

Die ADC-Auslesungen sind sehr langzeitstabil, eine extra Referenzfläche 
habe ich daher nicht vorgesehen.

Apollo M. schrieb:
> deine "source qualität" ansonsten finde ich im vergleich zu dem
> low-level der hier sonst so erscheint recht gut!

Danke.

von Axel S. (a-za-z0-9)


Bewertung
-1 lesenswert
nicht lesenswert

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.

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