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.
Ich hoffe ihr könnt mir weiterhelfen, ich weiss nicht mehr weiter.Code: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; }
Gruß
Bernd
Lesezeichen