PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Touchfeldabfrage funktioniert nicht richtig



Diabolo
02.01.2011, 13:16
Hallo miteinander,

ich bin neu hier und habe gleich mal eine Frage zur programmierung einer Touchfeldabfrage:

Ich lasse mir die x und y Koordinaten bei meinem GLCD anzeigen, jedoch stimmen die Werte nicht überein.
Ich bekomme bei bei dieser Programmierung einen x-Wert von 738 raus, ohne das Touchfeld berührt zu haben. Eigentlich sollte es doch null sein, oder?
(Ich hab momentan die y-werte ausgeblendet).
Die Werte müßten doch eigentlich beide null sein, bei nicht gedrückten Touchfeld und 1027/1027 bei rechts oben gedrückten Feld.


Angeschlossen hab ich die vier Touchanschlüsse an die ADC 0-3 ohne irgendwelche zusätzliche Beschaltungen. Ist das überhaupt richtig?
Alle Codebeispiele die ich finden kann sind in Bascom geschrieben aber keines in C.


uint16_t readADC(uint8_t channel) {

uint8_t i;
uint16_t result = 0;

// Den ADC aktivieren und Teilungsfaktor auf 128 stellen
ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);

// Kanal des Multiplexers waehlen
// Interne Referenzspannung verwenden (also 2,56 V)
ADMUX = channel | (1<<REFS1) | (1<<REFS0);

// Den ADC initialisieren und einen sog. Dummyreadout machen
ADCSRA |= (1<<ADSC);
while(ADCSRA & (1<<ADSC));

// Jetzt 4x die analoge Spannung auslesen
// und dann Durchschnittswert ausrechnen.
for(i=0; i<3; i++) {
// Eine Wandlung
ADCSRA |= (1<<ADSC);
// Auf Ergebnis warten...
while(ADCSRA & (1<<ADSC));

result += ADCW;
}

// ADC wieder deaktivieren
ADCSRA &= ~(1<<ADEN);

result /= 4;

return result;
}

unsigned int touch_x(void)
{

x=0;
// Spannung an Y Pins anlegen //
SET_OUTPUT(TOUCH_Y1);
SET_OUTPUT(TOUCH_Y2);
TOUCH_Y1_LOW;
TOUCH_Y2_HIGH;

// Potential am X1 Pin messen //
SET_INPUT(TOUCH_X1);
SET_INPUT(TOUCH_X2);
_delay_ms (500); // warte 1 msec.
uint16_t x = readADC(TOUCH_X2);

return (unsigned int) x;
}

unsigned int touch_y(void)
{

y=0;
// Spannung an X Pins anlegen //
SET_OUTPUT(TOUCH_X1);
SET_OUTPUT(TOUCH_X2);
TOUCH_X1_LOW;
TOUCH_X2_HIGH;

// Potential am Y1 Pin messen //
SET_INPUT(TOUCH_Y1);
//SET_INPUT(TOUCH_Y2);
_delay_ms (100); // warte 1 msec.
uint16_t y = readADC(TOUCH_Y1);

return (unsigned int) y;
}
void readtouch()
{
/* Einlesen der Touchkoordinaten */
x = touch_x(); // links-recht
// x = 1003-x;

_delay_ms (100); // warte 1 msec.
// y = touch_y(); // hoch-runter
// y = 977-y;

}


Ich hoffe ihr könnt mir weiterhelfen, ich weiss nicht mehr weiter.

Gruß
Bernd