搜索
bottom↓
回复: 15

改善6410 触摸屏驱动(wince)

[复制链接]

出0入0汤圆

发表于 2010-9-27 10:27:44 | 显示全部楼层 |阅读模式
效果:不抖动,不跳点,平滑,灵敏度还过得去。4.3 寸的OK,七寸的没有时间搞,有空的GGMM的搞搞吧。
这里上传图不方便,原文放博客了http://blog.csdn.net/gooogleman/archive/2010/09/11/5877407.aspx

很多世面上的6410 开发板触摸屏效果都不尽人意,友坚的做了这么久了,也没有解决掉,后来客户问起来就说是硬件问题了。的确,细心地朋友会发现,友坚的触摸屏居然有压屏现象:就是按住当前点,但是压力会传递到另外一个点上,这个就是触摸屏质量问题了。飞凌TE6410和华天正real6410的没有压屏,但是也存在抖动和反应迟钝问题。具体表现为:首先是打开软键盘,按下键盘按钮的时候,你会发现软键盘按钮很难弹起来,嘿嘿,黑好一阵子才消失,这应该是采样函数太久导致的;其次就是双击一个图标,有时候需要很大力才能打开,我估计是中断没有产生造成的,这个得好好分析,因为有时候并不需要那么大力气就能打开,这个是明天的工作了。

我手里正好有个real6410 板子,都具备了上述两种现象。因为前段时间整过2440 的触摸屏,所以我一下子就找到了第一个问题所在:在real6410 开发板的touch驱动的TSP_GetXY(int *px, int *py)函数,我找到了原因所在——我晕,在里面居然用了延时不算,还加了两个sleep(1),你说能不慢嘛!飞凌OK2440的触摸屏效果是不错的,于是我比较这两个函数,发现OK2440 的驱动写的精简合理,于是我就照着弄起来。去掉延时,去掉sleep(如果不去会导致触摸屏采样数据严重失准),把代码改成如下之后,触摸屏软键盘的弹起慢问题解决。

static BOOL

TSP_GetXY(int *px, int *py)

{

    //int i,j,k;

    //int temp;

    //int x[TSP_SAMPLE_NUM], y[TSP_SAMPLE_NUM];

         INT i;

    INT dx, dy;

         INT x, y;

         INT xsum, ysum;

    //int TimeOut = 100;  // about 100ms

    EnterCriticalSection(&g_csTouchADC);

    for (i = 0; i < TSP_SAMPLE_NUM; i++)

    {

            

                   //#define ADCTSC_AUTO_ADC         (UD_SEN_DOWN    |YM_SEN_EN|YP_SEN_DIS|XM_SEN_DIS|XP_SEN_DIS|PULL_UP_DIS|AUTO_PST_EN|XY_PST_NOP)

        g_pADCReg->ADCTSC = ADCTSC_AUTO_ADC;    // Auto Conversion

                   // add @2010.09.02

                   //g_pADCReg->ADCTSC = (0<<8)|(1<<7)|(1<<6)|(0<<5)|(1<<4)|(1<<3)|(1<<2)|(0);                        

        g_pADCReg->ADCCON |= ENABLE_START_EN;    // ADC Conversion Start

                   //A/D conversion starts by enable.  

                   //If READ_START is enabled, this value is not valid.

                   //0 = No operation 1 = A/D conversion starts and this bit is cleared after the start-up.

                   //

        while (g_pADCReg->ADCCON & ENABLE_START_EN);// wait and do nothing

                 //Sleep(1);

        //{   // Wait for Start Bit Cleared

        //    if(TimeOut-- < 0)

        //    {

        //        RETAILMSG(ZONE_ERROR,(TEXT("ADC cannot start\n")));

        //        goto ADCfails;

        //    }        

            //Sleep(1); // mask @2010.06.02

        //}

        //TimeOut = 100;  // about 100ms

        //End of conversion flag(Read only)

                   //0 = A/D conversion in process --1 = End of A/D conversion

                  

        while (!(g_pADCReg->ADCCON & ECFLG_END)); // if A/D conversion in process and do nothing

                 //Sleep(1);

        //{    // Wait for ADC Conversion Ended

        //    if(TimeOut-- < 0)

        //    {

        //        RETAILMSG(ZONE_ERROR,(TEXT("ADC Conversion cannot be done\n")));

        //        goto ADCfails;

        //    }        

            //Sleep(1); // mask @2010.06.02

        //}

        x = D_XPDATA_MASK(g_pADCReg->ADCDAT0);

        y = D_YPDATA_MASK(g_pADCReg->ADCDAT1);

                   xsum += x;

                   ysum += y;

                  

    }

    LeaveCriticalSection(&g_csTouchADC);

         *px = xsum / TSP_SAMPLE_NUM;

         *py = ysum / TSP_SAMPLE_NUM;

         //-----------------------------------------------------------------------

         RETAILMSG(TRUE,(TEXT("touch :*px= %d\r\n"),*px));

         RETAILMSG(TRUE,(TEXT("touch :*py= %d\r\n"),*py));

         //----------------------- add @2010.09.02  make interrupt stop---------------

         

         g_pADCReg->ADCTSC = (1<<8)|(1<<7)|(1<<6)|(0<<5)|(1<< 4)|(0<<3)|(0<<2)|(3);                                   

    dx = (*px > x) ? (*px - x) : (x - *px);

         dy = (*py > y) ? (*py - y) : (y - *py);

         //-----------------------------------------------------------------------

         RETAILMSG(TRUE,(TEXT("touch :dx= %d\r\n"),dx));

         RETAILMSG(TRUE,(TEXT("touch :dy= %d\r\n"),dy));

         

         return ((dx > TSP_INVALIDLIMIT || dy > TSP_INVALIDLIMIT) ? FALSE : TRUE);

         

}

——为了保留原始足迹,所以很多语句只是屏蔽了,请大家仔细点看。

虽然这个采样函数问题得到解决,但是触摸屏的下一个问题得解决。为什么会有时候很大力才会产生中断呢?这个话题明天再来说吧吧。嘿嘿

                                                                                                       ——gooogleman @2010.09.02

——续 @2010-9-3

刚才仔细看了打印信息,发现其实已经产生中断,但是双击就是打不开图标,到底为什么没有打开图标呢?需要啥条件?我初步猜测是抖动造成的,因为抖动导致两次采样的差异过大,所以系统认为不是双击。到底是不是,让我继续看。

——续@2010-9-8

后来我发现,之所以real6410 会抖动,是因为没有加入一些数据处理算法,DETAIL_SAMPLING 这个宏没有定义。嘿嘿,我加入定义,O(∩_∩)O哈哈哈~居然效果很好,一点都不抖动了,不过感觉还是不灵敏。咋回事呢?去掉sleep灵敏度有所提高,还是不够灵敏,说明是算法效率不够快,这个算法看上去很简单了,看上去没有改进的可能性了,那我再把ADC 延迟减小吧。

#define TSP_ADC_DELAY   (300)  // 40000 ——》300 chang gooogleman @2010.09.04

就这样,触摸屏就很好用了,操控性很好,灵敏度也不错了——说实在的,我还是觉得不满意,还是稍微有点不灵敏,我现在想唯一的的办法就是减少采样次数了,不过这样是否会抖动也难说,有空再整整吧(刚才试验改成4次抖动得很,导致右键也不出来了,貌似灵敏度也是不咋的,看来灵敏度是再难提高了!)。

最后在这里说明一下这个触摸屏要注意的事情:

一、              千万别在驱动关键部分放延时,sleep之类的东西,这个驱动入门书籍都有提到。去年我拿到idea6410的时候曾经多次向友坚反应这个问题,这样的触摸效果也拿出来卖,实在有点雷人,今年五月份idea6410貌似效果还是没有改进,当时问友坚,他们的答复是硬件问题,布线不良,带宽等因素,目前我用real6410试验,手里没有idea6410,所以无法验证了(不过我对比real6410 和idea6410的触摸屏驱动几乎一摸一样的)。

二、              关于 TSP_ADC_DELAY           的取值我试验过不能低于300,低于这个数字触摸屏就有点抖动了。

三、              目前我只是在real6410 4.3 寸LCD套餐上试验过,这几天我会在real6410 7寸LCD上试验,下周再在TE6410/OK6410 4.3 /7 寸LCD上试验,到时候再来报告结果。

——2010-9-11 拿到real6410 的7寸LCD 装上去,很不幸,在4.3 寸LCD 跑的很欢快的触摸屏驱动到了 七 寸LCD上变得很不堪:照样存在抖动,并且导致LCD右上角的区域无法响应触摸了!不过我觉得七寸不用修改那么多,只要把采样点加多点就OK了,有空再调试吧。This is it!



本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/gooogleman/archive/2010/09/11/5877407.aspx

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

发表于 2010-9-28 09:36:09 | 显示全部楼层
我顶,我学习了!谢谢!

出0入0汤圆

发表于 2010-9-30 12:38:44 | 显示全部楼层
回复【楼主位】goooogleman 谷歌男
-----------------------------------------------------------------------

帮我推荐本学习wince的书好嘛?
不研究底层驱动,最好带H264等编码和网络。
9261开发板用的ce5.0,0k6410用的是ce6.0,能买本5.0,6.0都兼顾到的好处。
谢谢楼主了。

令问wince有无边框的视频播放器么?

出0入0汤圆

 楼主| 发表于 2010-10-4 20:33:03 | 显示全部楼层
没有做过播放器,只会一点基础的驱动。
http://blog.csdn.net/gooogleman/archive/2008/11/11/3266887.aspx
书籍看看这个吧

出0入0汤圆

发表于 2010-10-6 08:07:08 | 显示全部楼层
楼主这是08年你推荐的书,最近你没有买wince的书么?

出0入0汤圆

发表于 2010-10-7 08:11:12 | 显示全部楼层
回复【3楼】goooogleman 谷歌男
-----------------------------------------------------------------------

中毒了,昨天在宁波书城买了4本。
Windows CE 工程实践完全解析    --李大为
Windows CE嵌入式开发标准教程--华清远见
Windows CE 使用开发技术(第二版)--张冬泉等
Windows CE 实验与实践--基于s3c2410   周立功

另外看想找本基于ATMEL ARM9的书没找到,都是抄来抄去2410,郁闷。

出0入0汤圆

发表于 2010-10-7 09:50:04 | 显示全部楼层
呵呵,多谢分享

出0入0汤圆

 楼主| 发表于 2010-10-21 12:30:40 | 显示全部楼层
回复【4楼】yulutong 土土狗
楼主这是08年你推荐的书,最近你没有买wince的书么?
-----------------------------------------------------------------------

没有买过了,因为我发现那些书不如自己看源码,看微软自带帮助好。
中文书入门才需要的。

出0入0汤圆

发表于 2010-11-22 00:08:48 | 显示全部楼层
gooogleman,七寸触摸屏存在抖动,D右上角的区域无法响应触摸等问题解决了吗?我也遇到这个情况,google后发现很多人都遇到了。

出0入0汤圆

发表于 2010-11-23 14:51:45 | 显示全部楼层
MARK

出0入0汤圆

发表于 2010-11-23 20:43:18 | 显示全部楼层
七寸触摸屏换ads7946芯片的压力测试功能可以完美解决抖动

出0入0汤圆

发表于 2010-11-23 20:49:30 | 显示全部楼层
D右上角无法响应触摸,我也遇到过,我的解决办法:去掉触摸屏四根信号线的滤波电容,或者换200~400pf之间的电容。

出0入0汤圆

 楼主| 发表于 2010-11-25 09:43:58 | 显示全部楼层
回复【11楼】llf021421 马中马
d右上角无法响应触摸,我也遇到过,我的解决办法:去掉触摸屏四根信号线的滤波电容,或者换200~400pf之间的电容。
-----------------------------------------------------------------------

不错,不错,3Q,我试试,有个客户正好要我调试 七寸的触摸屏呢,所以我就一直在等这个任务。
哈哈哈,人要加上电容,现在去掉反而OK了。
另外2440 wince触摸屏驱动去抖动,去跳点的文章我也写好了,经过验证的。
CSDN 的博客出毛病了,发不了,我发在我的博客园博客了。
在这里,测试LCD 是3.5 寸的PDA。
http://www.cnblogs.com/gooogleman/archive/2010/11/18/1881017.html

出0入0汤圆

发表于 2011-7-11 11:37:29 | 显示全部楼层
这个要好好学习。

出0入0汤圆

发表于 2011-11-24 15:39:39 | 显示全部楼层
MARK

出0入0汤圆

发表于 2012-1-14 16:31:48 | 显示全部楼层
mark
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-3 09:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表