Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Ложные срабатывания touсh screen'а
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Novichok1
Всем здравствуйте!
Работаю с LPC2478, подключил внешний дисплей 800x480, к нему завел сенсорную панель через контроллер TSC2046. Все нормально работает, но тут появилась проблема ложных срабатываний сенсорной панели! Проявляется это в основном в следующих условиях: когда нажимаешь на край экрана, то сперва сигнал обрабатывается нормально: показывает курсор куда надо, но после того, как уберешь стилус с экрана, то курсор перемещается куда - то в начало экрана!

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

И при условии ((r2 == 0)&&(r1 >= 2)) считаю, что нажатие было.
Подскажите, как избавиться от этого глюка.
aaarrr
Цитата(Novichok1 @ Nov 30 2009, 14:46) *
Подскажите, как избавиться от этого глюка.

С TSC2046 дела не имел, но на самодельном контроллере тачскрина на ATmega8 подобную проблему устранил повторной проверкой наличие нажатия после считывания координат.
richie
Хм, в отсутствии ошибки расчёта уверен?
Очень на это похоже.
Novichok1
Интересно получается, если вставляю повторную проверку нажатия после основного цикла, то все прекрасно работает:
Код
    //Опускаем 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;
}
richie
Кури даташит на драйвер TSC2046.
Что-то не так при обмене данными по SPI делаешь или какая-то плохо вычитанная фича самого драйвера.
aaarrr
А в чем глубокий смысл чтения и перезаписи потом по голове z1 и z2?
skripach
Можно несколько раз координаты читать и сравнивать значения с привязкой ко времени конечно.
Novichok1
Цитата
А в чем глубокий смысл чтения и перезаписи потом по голове z1 и z2?

Согласен, это атавизм)
Но, что при повторном затирании z1, z2, что без них, при таком варианте выскакивают ложные срабатывания:
Код
  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);

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


А при втором варианте, они не проявляются.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.