Witam Wszystkich zainteresowanych tematem.
Otóż mam problem od dwóch tygodni męczy mnie pewien problem, a dokładnie zmuszenie ekranu dotykowego do współpracy z ATMega16. Ekran z telefonu HTC Tytn, kupionego na alledrogo za 20zl.
Ekran dotykowy (rezystancyjny) sprawdziłem omomierzem X+ i X- oraz Y+ i Y- jest ok (reaguje zwiększoną rezystancją na dotyk).
Panel jest podpięty z ATMegą pod PA1: x-, PA4: x+, PA2: y+ i PA3: y-.
AVCC podpiety przez kondensator 100nF do masy i dławik 10uH do VCC (zgodnie z dokumentacją Atmela - AVR341: Four and five-wire Touch Screen Controller), GND=GND oraz AREF 100nF.
Kod przyznam, że zerżnięty z innej stronki ( Link ), gdyż nie programowałem jeszcze przetworników ADC, nie bardzo wiem za bardzo o co tu chodzi.
Oto kod, który wykorzystuje:
Odczytywane współrzędne przesyłam na RS'a:
Nie wiem dlaczego, ale za każdym razem otrzymuje 1023 jako wynik X i Y:
W trakcie trwania programu, mogę także zmierzyć miernikiem napięcia np. osi X i zmienia się zależnie od nacisku od 5V do 0V .
Domyślam się iż jest to błahostka, ale męczę się już dwa tygodnie, próbowałem różnych kodów z różnych stron, w tym avrlib i inne pochodne do obsługi adc (jednak ten, który wybrałem wydaje mi się najbardziej 'czytelny').
Dodam jeszcze że układ chodzi na kwarcu 8MHz.
Pozdrawiam Serdecznie
Poprawiłem tytuł - regulamin p.11.1
[zumek]
Otóż mam problem od dwóch tygodni męczy mnie pewien problem, a dokładnie zmuszenie ekranu dotykowego do współpracy z ATMega16. Ekran z telefonu HTC Tytn, kupionego na alledrogo za 20zl.
Ekran dotykowy (rezystancyjny) sprawdziłem omomierzem X+ i X- oraz Y+ i Y- jest ok (reaguje zwiększoną rezystancją na dotyk).
Panel jest podpięty z ATMegą pod PA1: x-, PA4: x+, PA2: y+ i PA3: y-.
AVCC podpiety przez kondensator 100nF do masy i dławik 10uH do VCC (zgodnie z dokumentacją Atmela - AVR341: Four and five-wire Touch Screen Controller), GND=GND oraz AREF 100nF.
Kod przyznam, że zerżnięty z innej stronki ( Link ), gdyż nie programowałem jeszcze przetworników ADC, nie bardzo wiem za bardzo o co tu chodzi.
Oto kod, który wykorzystuje:
int16_t l;
uint16_t h;
uint16_t l1;
uint16_t h1;
void read_x(void)
{
DDRA = 0b00010010; // Output on PA4(5V) and PA1(GND), Input on PA4(ADC)
sbi(PORTA, 4); //pull PA4 to 5V
cbi(PORTA, 1); //pull PA1 to GND
_delay_ms(1);
ADMUX = (1 << MUX1);//ADC2
ADCSRA = (1 << ADEN)|(1 << ADSC)|(1<<ADPS2)|(1<<ADPS1);
while(ADCSRA & (1 << ADSC));
l = ADCL;
h = ADCH & 0x03;
h = h << 8;
h = h + l;
}
void read_y(void)
{
DDRA = 0b00001100; // Output on PC2(5V) and PC3(GND), Input on PA4(ADC)
sbi(PORTA, 2); //pull PA2 to 5V
cbi(PORTA, 3); //pull PA3 to GND
_delay_ms(1);
ADMUX = (1 << MUX2);//ADC4
ADCSRA = (1 << ADEN)|(1 << ADSC)|(1<<ADPS2)|(1<<ADPS1);
while(ADCSRA & (1 << ADSC));
l1 = ADCL;
h1 = ADCH & 0x03;
h1 = h1 << 8;
h1 = h1 + l1;
}
Odczytywane współrzędne przesyłam na RS'a:
znak = 'A';
for (;;)
{
USART_Transmit( znak );
znak = USART_Receive();
USART_write_text ( "X: " );
read_x();
USART_write_number( (int)h );
USART_write_text ( ", Y: " );
read_y();
USART_write_number( (int)h1 );
USART_write_text ( "\r\n" );
}
Nie wiem dlaczego, ale za każdym razem otrzymuje 1023 jako wynik X i Y:
X: 1023, Y: 1023
X: 1023, Y: 1023
W trakcie trwania programu, mogę także zmierzyć miernikiem napięcia np. osi X i zmienia się zależnie od nacisku od 5V do 0V .
Domyślam się iż jest to błahostka, ale męczę się już dwa tygodnie, próbowałem różnych kodów z różnych stron, w tym avrlib i inne pochodne do obsługi adc (jednak ten, który wybrałem wydaje mi się najbardziej 'czytelny').
Dodam jeszcze że układ chodzi na kwarcu 8MHz.
Pozdrawiam Serdecznie
Poprawiłem tytuł - regulamin p.11.1
[zumek]