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

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

), 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

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

), 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."
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

.
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

), 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

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
--
Saper/nolin11
gg:4476700
mailto:nolin11_USUN_TO@interia.pl
Delphi & PHP & MySQL & AVR-GCC - Rulllezzz!