Panel dotykowy - skanowanie nie działa

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

Reply to
Saper/nolin11
Loading thread data ...

A dlaczego uzywasz 4 wejść analogowych? wystarczą dwa. Jeden dla X drugi dla Y. Panele 4 przewodowe są znacznie łatwiejsze w obsłudze w stosunku do 5 przewodowych.

MiSter

Reply to
Mister

A to w czymś przeszkadza? 2ch ADC (#1 i #2) i 2 porty (PA0 i PA3) łatwiej jest zmieniać progam.... i tylko to mam wolne (PC - graf_lcd_data, PD - graf_lcd_ctrl/rs232, PB - programator/lcd2x20 )

Jeszcze spróbuje dorobić kawałek elektroniki do kluczowania panelu (tranzystory podciągające do plusa/masy) - może porty nie dają rady prądowo :| bo ta matryca w sumie to ma małą rezystancję kilkaset omów.

Reply to
Saper/nolin11

tranzystory kluczujące? dwa przewody służą do podłączenia zasilania a dwa pomiarowe. No chyba że masz jakiś specjalny panel.

Mister

Reply to
Mister

He? Pierwsze słyszę, chyba miałeś doczynienia z innymi panelami.... mój ma 4 elektrody po jednej na bok i pomiar to jest tak:

  1. Ustawić X+ w Vcc , X- na GND i na Y+ (lub Y-) mierzyć napięcie, z tego mamy pozycję X,
  2. To samo tylko do Y+/- na Vcc/GND ,a mierzy się na X+ (lub X-) napięcie i z tego jest Y.

czyli jak chce czy nie to potrzeba 4 porty, ,a mi chodziło o to iż port procesora mogą nie dawać rady bo prąd płynie kilkunastu/dziesięciu mA ,a avr'y nie mają mocnego pull-up'a....

Reply to
Saper/nolin11

Saper/nolin11 napisał(a):

Z tego co wiem o panelach, to robisz jakąś głupotę. Typowy panel traktuje się jako 2 dzielniki napięcia o wspólnym polu rezystywnym a nie jako zmienne rezystory z zewnętrznym odniesieniem.

Reply to
A. Grodecki

takie kombinowanie to raczej w panelach 5 przewodowych.

MiSter

Reply to
Mister

Panel działa, co zrobiłem nie wiem :| . Topić uważam za zamknięty. Mogę wkleić działający kod, jak ktoś by chciał dochodzić co i jak :)

Reply to
Saper/nolin11

eeee mówisz chyba o 5 polowym.... zobacz AVR341 tam jest rysunek.... Dobra, mniejsza o to, ważne ,że działa :D to się liczy.

Dziękuję za poświęcony czas.

Ps. Problem leżał w przetworniku ADC po włączeniu ADC trzeba odczekać troche i dopiero startować konwersje :|

Reply to
Saper/nolin11

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.