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
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