Hallo,
ich versuche grade das resistive Touchpanel meines Displays mit einem
xMega 128A1 auszulesen.
Das TP ist ein 4-wire TP.
Angeschlossen ist es an Port A wie folgt:
PA0 > Y-
PA1 > X+
PA2 > Y+
PA3 > X-
Mein Code sieht so aus:
1 | int main(void){
|
2 | uint8_t xpos, ypos;
|
3 | int8_t buffer[10];
|
4 |
|
5 | //ADC Konfiguration
|
6 | ADCA.CTRLA = 0x01; // ADC aktivieren
|
7 | ADCA.CTRLB = 0x0C; // unsigned mode 8Bit und Freilauf Modus
|
8 | ADCA.REFCTRL = 0x20; // Referenz VCC
|
9 | ADCA.EVCTRL = 0x80; // sweepmode for channel 0,1 and 2
|
10 | ADCA.PRESCALER = 0x02; // prescaler to 16 = 2MHz@32Mhz Systemclock
|
11 |
|
12 |
|
13 | //Konfiguration der einzelnen Kanäle
|
14 | ADCA.CH0.CTRL = 0x01; //single-ended-positive
|
15 | ADCA.CH0.MUXCTRL = 0x08;// PA1 als ADCPin
|
16 | ADCA.CH1.CTRL = 0x01; //single-ended-positive
|
17 | ADCA.CH1.MUXCTRL = 0x10;//PA2 als ADCPin
|
18 |
|
19 | while(1){
|
20 | PORTA.DIR = 0x05;
|
21 | PORTA.OUT |= (1<<PIN2); //PA2 (Y+) High
|
22 | PORTA.OUT &= ~(1<<PIN0); //PA0 (Y-) Low
|
23 |
|
24 | _delay_ms(50);
|
25 | xpos = ADCA_CH0RES; // ADC_Wert von PA1 (X+) in xpos einlesen
|
26 | PORTA.DIR = 0x0A;
|
27 | PORTA.OUT |= (1<<PIN1); //PA1 (X+) High
|
28 | PORTA.OUT &= ~(1<<PIN3);//PA3 (X-) Low
|
29 | ypos = ADCA_CH1RES;// ADC_Wert von PA2 (Y+) in ypos einlesen
|
30 |
|
31 | sprintf( buffer, "X: %d", xpos );
|
32 | write_string(buffer, 10,10, BLACK, RED,0);
|
33 | sprintf( buffer, "Y: %d", ypos );
|
34 | write_string(buffer, 10,20, BLACK, RED,0);
|
35 | _delay_ms(50);
|
36 | }return 0;
|
37 | }
|
Das Programm soll die ADC Werte erstmal auf dem Display anzeigen. Es
zeigt lediglich einen X Wert von 255 und Y Wert von 55 an.
Wenn ich das TP ans Multimeter hänge verändert sich der Wert
Positionsabhängig von ca 0.27-3.2V.
Hat einer von euch vielleicht eine Idee woran es liegen könnte?