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


von Peter D. (peda)


Angehängte Dateien:

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:
1
ISR(ADC_vect)
2
{
3
  static uint8_t touch_no;
4
  touch[touch_no].val += ADC - (touch[touch_no].val>>TOUCH_AVG);
5
  switch (touch_no++)
6
  {
7
    case 0:
8
      TOUCH_PORT0 = 1;                                  // charge next Touch Input
9
      TOUCH_DDR0 = 1;
10
      TOUCH_DDR1 = 0;
11
      TOUCH_PORT1 = 0;                                  // open Touch Input
12
      ADMUX = 1<<REFS0 | TOUCHMUX1;                     // S&H
13
      break;
14
    default:
15
      touch_no = 0;
16
      TOUCH_PORT1 = 1;                                  // charge next Touch Input
17
      TOUCH_DDR1 = 1;
18
      TOUCH_DDR0 = 0;
19
      TOUCH_PORT0 = 0;                                  // open Touch Input
20
      ADMUX = 1<<REFS0 | TOUCHMUX0;                     // S&H
21
      break;
22
  }
23
  ADCSRA = ADCSRA_START;
24
  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)


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)


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)


Lesenswert?


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.