Witam,
Mam panel dotykowy 4 przewodowy na LCD graficznym (uruchomiony już) 160x80 (ci co kopią po alledrogo wiedzą jaki :) ), podłączony jest on do ADC0-ADC3 w atMega32 (wejścia podciągnięte 20k do Vcc) panel ma w poziomie ~590R i w pionie ~390R; i mam problem w odczycie koordynatów z tego. Po internecie kopałem, pojawiają się miejscami opisy skanowania panelu ale nie różnią się one od mojego poza kolejnością skanowania. Zaś problem jaki mam to to iż wartości X i Y są takie same gdziekolwiek bym nie dotknął panel , precyzując: zmieniają się w zakresie od 100 do 900 ale X i Y są identyczne (np. dotknę panel w środku przy górnej elektrodzie to X=Y=550 ,a powinno być (według mnie) X= ~550 , Y= ~800-1000,albo na środku przy dolnej elektrodzie to też X=Y=550 ,a powinno być X= ~550 i Y= ~100 ). A więc mam kod taki jak poniżej, opierałem się na AN-AVR341 (na razie chce zrobić aby to działało jak ma działać, potem zrobię obsługę na timerach i itd...): <code>
void Hi_Z_CONFIG(void) { DDR(TP_ADC_PORT) |= (1<<TP_XP_PIN); DDR(TP_ADC_PORT) &= ~(1<<TP_XM_PIN); DDR(TP_ADC_PORT) &= ~(1<<TP_YP_PIN); DDR(TP_ADC_PORT) &= ~(1<<TP_YM_PIN);
PORT(TP_ADC_PORT) &= ~(1<<TP_XP_PIN); PORT(TP_ADC_PORT) &= ~(1<<TP_XM_PIN); PORT(TP_ADC_PORT) &= ~(1<<TP_YP_PIN); PORT(TP_ADC_PORT) |= (1<<TP_YM_PIN); }
void X_SCAN_CONFIG(void) { DDR(TP_ADC_PORT) |= (1<<TP_XP_PIN); DDR(TP_ADC_PORT) |= (1<<TP_XM_PIN); PORT(TP_ADC_PORT) |= (1<<TP_XP_PIN); PORT(TP_ADC_PORT) &= ~(1<<TP_XM_PIN); // X- = GND , X+ = Vcc
DDR(TP_ADC_PORT) &= ~(1<<TP_YP_PIN); DDR(TP_ADC_PORT) &= ~(1<<TP_YM_PIN); PORT(TP_ADC_PORT) &= ~(1<<TP_YP_PIN); PORT(TP_ADC_PORT) &= ~(1<<TP_YM_PIN); // Y+ = HiZ=ADC , Y- = HiZ }
void Y_SCAN_CONFIG(void) { DDR(TP_ADC_PORT) &= ~(1<<TP_XP_PIN); DDR(TP_ADC_PORT) &= ~(1<<TP_XM_PIN); PORT(TP_ADC_PORT) &= ~(1<<TP_XP_PIN); PORT(TP_ADC_PORT) &= ~(1<<TP_XM_PIN); // X+ = HiZ=ADC , X- = HiZ
DDR(TP_ADC_PORT) |= (1<<TP_YP_PIN); DDR(TP_ADC_PORT) |= (1<<TP_YM_PIN); PORT(TP_ADC_PORT) |= (1<<TP_YP_PIN); PORT(TP_ADC_PORT) &= ~(1<<TP_YM_PIN); // Y+ = Vcc , Y- = GND }
void PanelInit(void) { ADMUX = 0x00; ADCSRA = 1<<ADPS1 | 1<<ADPS2 | 1<<ADATE; DDR(TP_ADC_PORT) &= ~(1 << TP_XP_PIN | 1<<TP_XM_PIN | 1<<TP_YP_PIN |
1<<TP_YM_PIN); PORT(TP_ADC_PORT) &= ~(1 << TP_XP_PIN | 1<<TP_XM_PIN | 1<<TP_YP_PIN | 1<<TP_YM_PIN); NOP(); // Standby mode Hi_Z_CONFIG(); }uint16_t GetADCValue(uint8_t ch) { // Set-up Channel ADMUX = 0x07 & ch; // Setup ADC & power on ADC ADCSRA |= (1<<ADPS1) | (1<<ADPS2); // Start conv. ADCSRA |= 1<<ADSC | 1<<ADEN; while ((ADCSRA & (1<<ADIF)) != (1<<ADIF)) {} ADCSRA &= ~(1<<ADEN); // off ADC & disable FreeRunningMode ADCSRA |= 1<<ADIF; return ADC; // return ADC value }
void PanelScan(void) { glcd_setTextCursor(5,0); glcd_str_P((prog_char*)PSTR("Po=")); glcd_setTextCursor(6,0); glcd_str_P((prog_char*)PSTR("Pi=")); glcd_setTextCursor(7,0); glcd_str_P((prog_char*)PSTR("Da="));
X_SCAN_CONFIG(); delay1us(10); // oczekiwanie na ustabilizowanie sie poziomów na pinach PanelPos.x = GetADCValue(TP_YP_CH) / TP_RES_DIV_X; // DEBUG glcd_setTextCursor(3,9); glcd_hex_byte(ADCSRA); glcd_str_P((prog_char*)PSTR(" ")); glcd_hex_byte(ADMUX); glcd_str_P((prog_char*)PSTR(" ")); glcd_hex_byte(SFIOR); glcd_str_P((prog_char*)PSTR(" ")); glcd_hex_byte(SREG);
glcd_setTextCursor(5,3); glcd_bin_byte(PORTA); glcd_setTextCursor(6,3); glcd_bin_byte(PINA); glcd_setTextCursor(7,3); glcd_bin_byte(DDRA); // DEBUG INFO - END
// Set-up ports - get Y value Y_SCAN_CONFIG(); delay1us(10); PanelPos.y = GetADCValue(TP_XP_CH) / TP_RES_DIV_Y; // DEBUG INFO glcd_setTextCursor(4,9); glcd_hex_byte(ADCSRA); glcd_str_P((prog_char*)PSTR(" ")); glcd_hex_byte(ADMUX); glcd_str_P((prog_char*)PSTR(" ")); glcd_hex_byte(SFIOR); glcd_str_P((prog_char*)PSTR(" ")); glcd_hex_byte(SREG); glcd_setTextCursor(5,12); glcd_bin_byte(PORTA); glcd_setTextCursor(6,12); glcd_bin_byte(PINA); glcd_setTextCursor(7,12); glcd_bin_byte(DDRA);
// DEBUG INFO - END
// Standby mode Hi_Z_CONFIG(); } </code>
I właśnie jak przesuwam w poziomie palcem to wartości mi się zmieniają,a jak w pionie to praktycznie nic, i są takie same X i Y. Dla próby, wykomentowałem sobie jedną oś skanowania (,a potem drugą) i niby powinna mi się wartość zmieniać tylko w jednej osi ale nic się nie zmieniało więc zaczynam zastanawiać się nad sprawnością tego panelu dotykowego... Albo jednak jakiś błąd popełniam w odczycie? Może ktoś kto bawił się już panelami dotykowymi podpowie/poradzi coś?