Witam,
Ma panel dotykowy 4-przewodowy. Czytałem dokumentację atmela AV341 ale mam pewien problem. Chodzi o to że gdy chę odczytać dwie współrzędne w programie to nic mi nie mierzy. Jak wyłączę którąś z nich to wszystko jest ok i pomiar jest dobry. Nawet gdy mam tylko rozpoznawanie dotyku a potem odczyt x i y to i tak działa tylko odczyt dotyku i jedna oś. Nie wiem czy są dobrze ustawione porty. Próbowałem nawet przez tranzystory zasilać np X+ a jeden kanał adc do masy programowo, drugi do ADC na pomiar(chodziło o to by był HiZ gdy nie zasilam odpowiedniego kanału). I też mierzy dobrze tylko gdy jest jeden kanał.
a tutaj w main oraz for:
wydłużanie opóźnień też nic nie daje
Ma panel dotykowy 4-przewodowy. Czytałem dokumentację atmela AV341 ale mam pewien problem. Chodzi o to że gdy chę odczytać dwie współrzędne w programie to nic mi nie mierzy. Jak wyłączę którąś z nich to wszystko jest ok i pomiar jest dobry. Nawet gdy mam tylko rozpoznawanie dotyku a potem odczyt x i y to i tak działa tylko odczyt dotyku i jedna oś. Nie wiem czy są dobrze ustawione porty. Próbowałem nawet przez tranzystory zasilać np X+ a jeden kanał adc do masy programowo, drugi do ADC na pomiar(chodziło o to by był HiZ gdy nie zasilam odpowiedniego kanału). I też mierzy dobrze tylko gdy jest jeden kanał.
void gadc_x(void)
{
ADMUX|=(0<<MUX4)|(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(1<<MUX0);// wybór kanału ADC1
DDRD |=_BV(5);
DDRA |=_BV(0);
PORTA &=~_BV(0);
PORTD &=~_BV(5);
ADCSRA|=(1<<ADSC)|(1<<ADEN); //start
}
void gadc_y(void)
{
ADMUX|=(0<<MUX4)|(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(0<<MUX0);// wybór kanału ADC0
DDRD |=_BV(5);
DDRA |=_BV(1);
PORTA &=~_BV(1);
PORTD |=_BV(5);
ADCSRA|=(1<<ADSC)|(1<<ADEN); //start
}
a tutaj w main oraz for:
ADMUX|=(1<<REFS0)|(0<<REFS1); //Avcc z zewn kond przy Aref
ADMUX|=(0<<ADLAR); //bez przesuniecia w rejestrach ADCH i ADCL
ADCSRA|=(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
volatile uint8_t Low,High;
volatile uint16_t wynik;
double nap,x,y;
gadc_x();
_delay_ms(5);
Low=ADCL;
High=ADCH;
wynik=High<<8;
wynik=wynik|Low;
x=(wynik*5.05)/1024;
//gadc_y();
_delay_ms(5);
Low=ADCL;
High=ADCH;
wynik=High<<8;
wynik=wynik|Low;
y=(wynik*5.05)/1024;
wydłużanie opóźnień też nic nie daje