RTV forum PL | NewsGroups PL

Problemy z odczytem współrzędnych w 4-przewodowym panelu dotykowym 160x80

Panel dotykowy - skanowanie nie działa

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Problemy z odczytem współrzędnych w 4-przewodowym panelu dotykowym 160x80

Saper/nolin11
Guest

Sat Dec 22, 2007 10:15 pm   



Witam,

Mam panel dotykowy 4 przewodowy na LCD graficznym (uruchomiony już) 160x80
(ci co kopią po alledrogo wiedzą jaki Smile ), 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ś?

Mister
Guest

Sun Dec 23, 2007 10:13 am   



Quote:
Mam panel dotykowy 4 przewodowy na LCD graficznym (uruchomiony już) 160x80
(ci co kopią po alledrogo wiedzą jaki Smile ), podłączony jest on do
ADC0-ADC3


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

Saper/nolin11
Guest

Sun Dec 23, 2007 2:15 pm   



Mister wrote:
Quote:
Mam panel dotykowy 4 przewodowy na LCD graficznym (uruchomiony już)
160x80 (ci co kopią po alledrogo wiedzą jaki Smile ), podłączony jest on
do ADC0-ADC3

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.


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
Neutral bo ta matryca w sumie to ma małą rezystancję kilkaset omów.


--
Saper/nolin11
gg:4476700
mailto:nolin11_USUN_TO@interia.pl
Delphi & PHP & MySQL & AVR-GCC - Rulllezzz!

Mister
Guest

Sun Dec 23, 2007 2:53 pm   



Quote:
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
Neutral bo ta matryca w sumie to ma małą rezystancję kilkaset omów.

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

Mister

Saper/nolin11
Guest

Sun Dec 23, 2007 6:27 pm   



Mister wrote:
Quote:
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.

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

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


--
Saper/nolin11
gg:4476700
mailto:nolin11_USUN_TO@interia.pl
Delphi & PHP & MySQL & AVR-GCC - Rulllezzz!

A. Grodecki
Guest

Sun Dec 23, 2007 7:13 pm   



Saper/nolin11 napisał(a):

Quote:
Mam panel dotykowy 4 przewodowy na LCD graficznym (uruchomiony już) 160x80
(ci co kopią po alledrogo wiedzą jaki Smile ), 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.

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.

--

Pozdrawiam,

A. Grodecki

"Wszystkie zwierzęta sa równe.
Ale te, które mają futerko w trzykolorowe pasy, są równiejsze."

Mister
Guest

Sun Dec 23, 2007 7:27 pm   



Quote:
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.

takie kombinowanie to raczej w panelach 5 przewodowych.

MiSter

Saper/nolin11
Guest

Sun Dec 23, 2007 8:32 pm   



Mister wrote:
Quote:
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.

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

Mister

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

--
Saper/nolin11
gg:4476700
mailto:nolin11_USUN_TO@interia.pl
Delphi & PHP & MySQL & AVR-GCC - Rulllezzz!

Saper/nolin11
Guest

Sun Dec 23, 2007 10:49 pm   



A. Grodecki wrote:
Quote:
Saper/nolin11 napisał(a):

Mam panel dotykowy 4 przewodowy na LCD graficznym (uruchomiony już)
160x80 (ci co kopią po alledrogo wiedzą jaki Smile ), 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.

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.

eeee mówisz chyba o 5 polowym.... zobacz AVR341 tam jest rysunek....
Dobra, mniejsza o to, ważne ,że działa Very Happy 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 Neutral
--
Saper/nolin11
gg:4476700
mailto:nolin11_USUN_TO@interia.pl
Delphi & PHP & MySQL & AVR-GCC - Rulllezzz!

elektroda NewsGroups Forum Index - Elektronika Polska - Problemy z odczytem współrzędnych w 4-przewodowym panelu dotykowym 160x80

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map