реклама на сайте
подробности

 
 
> Ложные срабатывания touсh screen'а
Novichok1
сообщение Nov 30 2009, 11:46
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 73
Регистрация: 8-07-09
Пользователь №: 51 032



Всем здравствуйте!
Работаю с LPC2478, подключил внешний дисплей 800x480, к нему завел сенсорную панель через контроллер TSC2046. Все нормально работает, но тут появилась проблема ложных срабатываний сенсорной панели! Проявляется это в основном в следующих условиях: когда нажимаешь на край экрана, то сперва сигнал обрабатывается нормально: показывает курсор куда надо, но после того, как уберешь стилус с экрана, то курсор перемещается куда - то в начало экрана!

Силу давления считаю, как в мануале, со своими коэффициентами:
Код
        r1 = (5*(x)*(4096/z1 - 1) - (4096-y))/4096;
        r2 = temp_x*(z2/z1 - 1)/4096;

И при условии ((r2 == 0)&&(r1 >= 2)) считаю, что нажатие было.
Подскажите, как избавиться от этого глюка.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Novichok1
сообщение Nov 30 2009, 12:23
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 73
Регистрация: 8-07-09
Пользователь №: 51 032



Интересно получается, если вставляю повторную проверку нажатия после основного цикла, то все прекрасно работает:
Код
    //Опускаем CS
    ACTIVATE_CS;

    do
    {

        SPI::SPI_Exchange(z1_query,&z1);
        SPI::SPI_Exchange(z2_query,&z2);

        SPI::SPI_Exchange(x_query,&temp_x);
        SPI::SPI_Exchange(y_query,&temp_y);

//        SPI::SPI_Exchange(z1_query,&z1);
//        SPI::SPI_Exchange(z2_query,&z2);


        if(z1!=0)
        {
            r1 = (5*(temp_x)*(4096 - z1) - z1*(4096-temp_y))/(4096*z1);
            r2 = (temp_x*(z2 - z1))/(4096*z1);
        }
        else
        {
            r1 = (5* temp_x*(0 - 1) - (4096-temp_y))/4096;
            r2 = 1;
        }
    }while((r2 != 0)||(r1 < 2));

    SPI::SPI_Exchange(z1_query,&z1);
    SPI::SPI_Exchange(z2_query,&z2);
    if(z1!=0)
    {
        r1 = (5*(temp_x)*(4096 - z1) - z1*(4096-temp_y))/(4096*z1);
        r2 = (temp_x*(z2 - z1))/(4096*z1);
    }
    else
    {
        r1 = (5* temp_x*(0 - 1) - (4096-temp_y))/4096;
        r2 = 1;
    }

    //Поднимаем CS
    DEACTIVATE_CS;


А если делать ее в основном цикле, после получения координат, то все ломается:

Код
    //Опускаем CS
    ACTIVATE_CS;

    do
    {

        SPI::SPI_Exchange(z1_query,&z1);
        SPI::SPI_Exchange(z2_query,&z2);

        SPI::SPI_Exchange(x_query,&temp_x);
        SPI::SPI_Exchange(y_query,&temp_y);

        SPI::SPI_Exchange(z1_query,&z1);
        SPI::SPI_Exchange(z2_query,&z2);


        if(z1!=0)
        {
            r1 = (5*(temp_x)*(4096 - z1) - z1*(4096-temp_y))/(4096*z1);
            r2 = (temp_x*(z2 - z1))/(4096*z1);
        }
        else
        {
            r1 = (5* temp_x*(0 - 1) - (4096-temp_y))/4096;
            r2 = 1;
        }
    }while((r2 != 0)||(r1 < 2));


    //Поднимаем CS
    DEACTIVATE_CS;



Цитата
Хм, в отсутствии ошибки расчёта уверен?
Очень на это похоже.


Такое ощущение, что ошибка кроется в передаче по SPI, но с внутренним дисплеем все проходит, как по маслу, а сигналы одни и те же. Так в чем же дело, есть у еще предположения, советы?

Проверял значения z1 и z2, вроде расчеты похожи на правду.





Все ломается, в смысле принимаются некорректные координаты, и калибровка оказывается неверной

Функция обмена данными по SPI:
Код
void SPI::SPI_Exchange(tU8 input, tU16 *output)
{
    SPI::Spi_Send(0);
    SPI::Spi_Send(0);
    SPI::Spi_Send(0);
    SPI::Spi_Send(input);
    SPI::Spi_Send(0);

    *output = S0SPDR;
}


Сообщение отредактировал Novichok1 - Nov 30 2009, 12:26
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 07:40
Рейтинг@Mail.ru


Страница сгенерированна за 0.01382 секунд с 7
ELECTRONIX ©2004-2016