6091|12

85

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

ARM板开发触摸屏程序,出现飘屏!急求解决办法! [复制链接]

我用ARM板测试一个触摸屏程序,偶尔出现飘屏!
源码如下:


  1. #include "def1.h"
  2. #include "2440addr.h"
  3. #include "2440lib.h"
  4. #include "config.h"


  5. #define REQCNT 30
  6. #define ADCPRS 9        //YH 0627
  7. #define LOOP 1

  8. void  AdcTsAuto(void);

  9. int TouchPanelCnt=0;  // 触摸屏次数的记录

  10. struct TouchLocation
  11. {
  12.         volatile int x;
  13.         volatile int y;
  14. }TPxyLocation = {0,0};
  15. volatile int test_x;
  16.         volatile int test_y;
  17. INT8U ts_status;//触摸屏的状态(校准还是测试)
  18. //static U16 ts_lefttop_x,ts_lefttop_y,ts_rightbot_x,ts_rightbot_y,ts_leftbot_x,
  19.                    //ts_leftbot_y,ts_righttop_x,ts_righttop_y;
  20. struct TouchLocation TestPoint[8] = {0};

  21. extern void AdcTsAuto_Handler(void);
  22. extern OS_EVENT  *TP_m_box;
  23. //extern OS_EVENT  *Cal_m_box;           
  24. //extern OS_EVENT  *Lag_m_box;

  25. //unsigned int buf[3][2];
  26. U16 Ptx[6],Pty[6],tmp[6] = {0,0,0,0,0,0};

  27. //U8 index = 0;
  28. void AdcTsAuto(void)
  29. {
  30.          int i;
  31.         U32 saveAdcdly;

  32.     if(rADCDAT0&0x8000)
  33.     {
  34.                 //Uart_Printf("\nStylus Up!!\n");
  35.                 rADCTSC&=0xff;        // Set stylus down interrupt bit
  36.     }
  37.     //else
  38.            
  39.         //        Uart_Printf("\nStylus Down!!\n");

  40.         rADCTSC=(1<<3)|(1<<2);         //Pull-up disable, Seq. X,Y postion measure.
  41.         saveAdcdly=rADCDLY;
  42.         rADCDLY=40000;                 //Normal conversion mode delay about (1/50M)*40000=0.8ms

  43.         rADCCON|=0x1;                   //start ADC


  44.    
  45.    for(i=0;i<5;i++)
  46.     {
  47.        // rADCTSC  = (1<<7)|(1<<6)|(0<<5)|(1<<4)|(1<<3)|(1<<2)|(0);   
  48.       
  49.           rADCTSC=(1<<3)|(1<<2);         //Pull-up disable, Seq. X,Y postion measure.
  50.         saveAdcdly=rADCDLY;
  51.         rADCDLY=40000;                 //Normal conversion mode delay about (1/50M)*40000=0.8ms
  52.       
  53.         rADCCON |= 0x1;             //Start Auto conversion
  54.         while(rADCCON & 0x1);       //Check if Enable_start is low
  55.         while(!(0x8000&rADCCON));   //Check ECFLG
  56.       while(!(rSRCPND & (BIT_ADC)));  //check if ADC is finished with interrupt bit
  57.       
  58.                 Pty[i] = (0x3ff&rADCDAT1);
  59.         Ptx[i] = (0x3ff&rADCDAT0);
  60.         
  61.         
  62.        //OSPrintf("----- ========(%04d,%04d)=======\n",Ptx[i], Pty[i]);  
  63.     }
  64.    // buf[3][0] =((buf[0][0] + buf[1][0] + buf[2][0])/3)*10;
  65.     //buf[3][1] =((buf[0][1] + buf[1][1] + buf[2][1])/3)*10;
  66.     Ptx[5]=(Ptx[0]+Ptx[1]+Ptx[2]+Ptx[3]+Ptx[4])/5;
  67.     Pty[5]=(Pty[0]+Pty[1]+Pty[2]+Pty[3]+Pty[4])/5;
  68.     OSPrintf(" ========(%04d,%04d)=======\n",Ptx[5], Pty[5]);
  69.    
  70.    

  71.            
  72. //OSPrintf("----- ========(%04d,%04d)=======\n",TPxyLocation.x,TPxyLocation.y);
  73.      TPxyLocation.x=Ptx[5]*10;
  74.      TPxyLocation.y=Pty[5]*10;
  75.      //TPxyLocation.x=TPxyLocation.x*10;
  76.     // TPxyLocation.y=TPxyLocation.y*10;
  77.             
  78.         //OSMboxPost(TP_m_box,(void*)1);
  79.          //YH 0627, To check Stylus Up Interrupt.
  80.          rSUBSRCPND|=BIT_SUB_TC;
  81.          ClearPending(BIT_ADC);
  82.          rINTSUBMSK&=~(BIT_SUB_TC);
  83.          rINTMSK&=~(BIT_ADC);
  84.                          
  85.          rADCTSC =0xd3;    //Waiting for interrupt
  86.          rADCTSC=rADCTSC|(1<<8); // Detect stylus up interrupt signal.

  87.                         while(1)                //to check Pen-up state
  88.                         {
  89.                          if(rSUBSRCPND & (BIT_SUB_TC))        //check if ADC is finished with interrupt bit
  90.                                  {
  91.                                         //Uart_Printf("Stylus Up Interrupt~!\n");
  92.                                        
  93.                                         break;        //if Stylus is up(1) state
  94.                                 }
  95.                         }       
  96.                        
  97.     //Uart_Printf("count=%03d  XP=%04d, YP=%04d\n", TouchPanelCnt++, TPxyLocation.x, TPxyLocation.y);    //X-position Conversion data            
  98.         OSMboxPost(TP_m_box,(void*)1);
  99.         rADCDLY=saveAdcdly;
  100.         rADCTSC=rADCTSC&~(1<<8); // Detect stylus Down interrupt signal.
  101.     rSUBSRCPND|=BIT_SUB_TC;
  102.     rINTSUBMSK &=~(BIT_SUB_TC);        // Unmask sub interrupt (TC)     
  103.     ClearPending(BIT_ADC);
  104. }
  105. void Test_Touchpanel(void)
  106. {
  107.     //OSPrintf("ADC touch screen test\n");
  108.     //OSPrintf("[1] calibration touch screen \n");
  109.    // OSPrintf("Please touch the location of left top \n");
  110.     //ts_status = TS_JUSTIFY_LEFTTOP;
  111.    
  112.     rADCDLY=50000;                  //Normal conversion mode delay about (1/3.6864M)*50000=13.56ms
  113.     rADCCON=(1<<14) | (ADCPRS<<6);//| (0<<3) | (0<<2) | (0<<1) | (0);   
  114.         //ADCPRS En, ADCPRS Value
  115.            rADCTSC=0xd3;  //Wfait,XP_PU,XP_Dis,XM_Dis,YP_Dis,YM_En

  116.    // pISR_ADC = (uint32)AdcTsAuto_Handler;
  117.    pISR_ADC = (int)AdcTsAuto;
  118.         rINTMSK &= ~BIT_ADC;       //ADC Touch Screen Mask bit clear
  119.         rINTSUBMSK &= ~(BIT_SUB_TC);
  120. }
复制代码


谁能帮我看看这段代码有问题麽!
此帖出自ARM技术论坛

最新回复

谢谢各位的关注,跟电压有点关系,呵呵!  详情 回复 发表于 2010-4-15 15:46
点赞 关注
 

回复
举报

68

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
呃。。。。帮你项一下吧,太专业,我还停留在OS上开发应用的阶段。。来学习学习
此帖出自ARM技术论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
仅仅是多次采样求平均还是不够的,
在求平均之前最好先去除一个最大值和一个最小值,
特别是在轻按时这个差值会很大,从而导致楼主所说的问题。
此帖出自ARM技术论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

4
 
把触摸屏采样时间调大一点即可
此帖出自ARM技术论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 2 楼 sunrain_hjb 的回复:
仅仅是多次采样求平均还是不够的,
在求平均之前最好先去除一个最大值和一个最小值,
特别是在轻按时这个差值会很大,从而导致楼主所说的问题。


MARK,学习下。
此帖出自ARM技术论坛
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

6
 
每次采样时,需要与前几次的平均值比较,差别很大的叫“野点”,应该去除。这个叫滤波;当前后两次的差值小于某个值时,这个值也不能要,这个叫去抖动。
一般来说,触摸屏 应该做 去抖动 和 滤波。
一般来说, 去抖动 和 滤波需要在驱动层做。但如果你是用linux的话,请搜索下libts,它已经在应用层帮你做得很好了。
此帖出自ARM技术论坛
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 5 楼 sikinzen 的回复:
每次采样时,需要与前几次的平均值比较,差别很大的叫“野点”,应该去除。这个叫滤波;当前后两次的差值小于某个值时,这个值也不能要,这个叫去抖动。
一般来说,触摸屏 应该做 去抖动 和 滤波。
一般来说, 去抖动 和 滤波需要在驱动层做。但如果你是用linux的话,请搜索下libts,它已经在应用层帮你做得很好了。


。。
此帖出自ARM技术论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

8
 
果真高手如云,多谢,菜鸟先学习一下
此帖出自ARM技术论坛
 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(初级)

9
 
最好先检查一下硬件,看ADC的参考电压是否稳,还是说参考电压上面有毛刺出现.
此帖出自ARM技术论坛
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

10
 
引用 2 楼 sunrain_hjb 的回复:
仅仅是多次采样求平均还是不够的,
在求平均之前最好先去除一个最大值和一个最小值,
特别是在轻按时这个差值会很大,从而导致楼主所说的问题。


不错的办法。呵呵。
此帖出自ARM技术论坛
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

11
 
你说的漂屏,不知有多严重,如果是开发板,用别人的程序看一下,有没有这个问题,一般都是硬件问题造成的,也就是AD采样不稳定。软件能做的,也就是数字滤波,比如采8次,回来放到一个数据,去掉最大值,去掉最小值,然后求平均值,三星官方BSP里面的TOUCH驱动,也都是这样做的。
此帖出自ARM技术论坛
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

12
 
刚才打错了一个字:

你说的漂屏,不知有多严重,如果是开发板,用别人的程序看一下,有没有这个问题,一般都是硬件问题造成的,也就是AD采样不稳定。软件能做的,也就是数字滤波,比如采8次,回来放到一个数组,去掉最大值,去掉最小值,然后求平均值,三星官方BSP里面的TOUCH驱动,也都是这样做的。


此帖出自ARM技术论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

13
 
谢谢各位的关注,跟电压有点关系,呵呵!
此帖出自ARM技术论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表