mini2440 触摸屏分析

 

2440支持8 通道10 位ADC 和触摸屏接口

8通道:AIN0~AIN7,其中AIN4~AIN7为触摸屏复用
AIN4~YM
AIN5~YP
AIN6~XM
AIN7~XP
分辨率:10位,即数据位为10位

 
四种转换模式:
 
– 普通转换模式
– 分离的X/Y 方向转换模式
– 自动(顺序)X/Y 方向转换模式
– 等待中断模式

 
A/D 转换时间:
当PCLK 频率在50MHz 并且预分频器的值为49 时,共10 位的转换时间如下:
-----------------------------------------------
A/D 转换器频率 = 50MHz / (49+1) = 1MHz
转换时间 = 1/(1MHz / 5 周期) = 1/200KHz = 5μs
-----------------------------------------------

 
1. 普通转换模式:
单转换模式是最合适的通用ADC 转换。此模式可以通过设置ADCCON(ADC 控制寄存器)
初始化并且通过读写ADCDAT0(ADC 数据寄存器0)就能够完成。

 
2. 分离的X/Y 方向转换模式:
X 方向模式写X 方向转换数据到ADCDAT0,触摸屏接口产生中断源给中断控制器。
Y 方向模式写Y 方向转换数据到ADCDAT1,触摸屏接口产生中断源给中断控制器。
 
XP
XM
YP
YM
X Position
External Voltage
GND
AIN[5]
Hi-Z
Y Position
AIN[7]
Hi-Z
External Voltage
GND

 
3. 自动(顺序)X/Y 方向转换模式:
触摸屏控制器顺序变换触摸X 方向和Y 方向。
在自动方向转变模式中触摸控制器在写入X 测量数值到ADCDAT0 和写入Y 测量数值到ADCDAT1 后(低10位)
触摸屏接口产生中断源给中断控制器。
 
XP
XM
YP
YM
X Position
External Voltage
GND
AIN[5]
Hi-Z
Y Position
AIN[7]
Hi-Z
External Voltage
GND

 
4. 等待中断模式:
当笔尖落下时触摸屏控制器产生中断(INT_TC)信号。
等待中断模式设置值为rADCTSC=0xd3;
触摸屏控制器产生中断信号(INT_TC)后,必须清除等待中断模式。
(XY_PST 设置到无操作模式) 即寄存器ADCTSC的低两位必须清零。
 
XP
XM
YP
YM
Waiting for Interrupt
Pull UP
Hi-z
AIN[5]
GND

 

 
s3c2440集成了4线制电阻式的触摸屏接口,它的原理是通过测量横向和纵向的电阻值来获得触点的坐标。
触点坐标的检测是通过A/D转换来实现的

@,寄存器ADCTSC的第8位能够实现是触笔落下中断还是触笔抬起中断
@,寄存器ADCTSC的第3位可以选择上拉电阻的使能,
在等待中断模式下,上拉电阻要有效,
在触发中断后,上拉电阻要无效。 寄存器ADCTSC的低两位清零
@, 寄存器ADCTSC的第2位用于选择自动(连续)XY坐标转换模式
@, 触笔抬起/落下中断状态寄存器ADCUPDN的低2位能够判断触笔在何种状态下引起的中断
@, A/D延时寄存器ADCDLY可以设置开始中断到真正开始A/D转换这段时间的延时
@,ADCCON[0]用于启动AD转换


  1. #include "uart.h"
  2. #include "2440addr.h"
     
  3. #include "def.h"
     

  4.  
  5. #define ADCPRS 9    
     

  6.  
  7. int count=0;
     
  8. volatile int xdata, ydata;
     

  9.  

  10.  

  11.  
  12. void __irq AdcTsAuto(void)            //进入中断,进行转换,每触摸一下屏幕,就进入该函数,进行A/D转换
     
  13. {                                    //这就是中断处理函数的深意
     
  14.                                 //一个触摸中断为:触摸笔按下到触摸笔抬起,不抬起的话,中断就没结束
     
  15.     rADCTSC=(1<<3)|(1<<2)|(0<<0); //XP上拉禁止,自动连续XY坐标转换模式开启,清XY_PST
     
  16.     
     
  17.     rADCDLY=40000; //重设等待转换测量时间
     
  18.                                 
     
  19.     rADCCON|=0x1; //start ADC
     

  20.  
  21.     while(rADCCON & 0x1);        //检测ADC转换是否开始,开始后,该位会被自动清零
     
  22.     while(!(rADCCON & 0x8000)); //等待转换结束,可以读取转换后的数值了
     
  23.         
     
  24.     while(!(rSRCPND & (BIT_ADC))); //判断ADC的中断悬挂位,若为1,则说明该中断已经长生,可以处理按下的数据了
     
  25.     xdata=(rADCDAT0&0x3ff);    //读取X方向的转换数值    //ADCDAT为状态寄存器
     
  26.     ydata=(rADCDAT1&0x3ff);    //读取Y方向的转换数值
     
  27.             
     
  28.     rSUBSRCPND|=BIT_SUB_TC;    //清除中断标志
     
  29.     ClearPending(BIT_ADC);        
     
  30.     rINTSUBMSK=~(BIT_SUB_TC);    //重新打开中断,为触摸笔抬起中断做准备
     
  31.     rINTMSK=~(BIT_ADC);
     
  32.     
     
  33.          
     
  34.      //这一次的中断设为触笔抬起中断    ,触摸笔抬起了,一个触摸中断才算结束,才可以读取数据
     
  35.      rADCTSC =0xd3; //再设为等待中断模式
     
  36.      rADCTSC=rADCTSC|(1<<8); // 设置为触笔抬起中断,但不读取此中断的数据,因为按下和抬起是同一点,上面已经处理了按下的数据
     

  37.  
  38.             while(1)        //等待触笔的抬起
     
  39.             {
     
  40.              if(rSUBSRCPND & (BIT_SUB_TC))
     
  41.                  {
     
  42.                     break;    //说明笔尖已经抬起,一个触摸中断终于结束,下面读取数据吧
     
  43.                 }
     
  44.             }    
     

  45.  
  46.     Uart_Printf("count=%03d XP=%04d, YP=%04d\n", count++, xdata, ydata);//X-position Conversion data
     

  47.  
  48.     rADCDLY=50000;             //延时,等待串口输出
     
  49.     rADCTSC=rADCTSC&~(1<<8); //重新设为触摸笔按下中断,为下次的触摸做准备
     
  50.     rSUBSRCPND|=BIT_SUB_TC;        //清除中断标志
     
  51.     rINTSUBMSK=~(BIT_SUB_TC);    //重新开启中断
     
  52.     ClearPending(BIT_ADC);
     
  53. }
     

  54.  

  55.  

  56.  

  57.  
  58. void Test_Touchpanel(void)
     
  59. {
     
  60.    
     
  61.     rADCDLY=50000; //设置等待转换测量时间
     
  62.     rADCCON=(1<<14)+(ADCPRS<<6); //预分频使能,值为9
     
  63.                                 //A/D 转换器频率 = PCLK / (预分频值+1)
     
  64.                                 //转换时间 = 1/(AD转换频率/ 5 周期)
     
  65.     Uart_Printf("ADC touch screen test\n");
     
  66.                     //设为等待中断模式
     
  67.     rADCTSC=0xd3; //设为笔尖落下中断
     
  68.                     
     
  69.     pISR_ADC = (int)AdcTsAuto;//并联中断处理程序
     
  70.     rINTMSK=~BIT_ADC; //ADC总中断开启
     
  71.     rINTSUBMSK=~(BIT_SUB_TC);//ADC触摸屏子中断开启
     

  72.  
  73.     Uart_Printf("\nType any key to exit!!!\n");
     
  74.     Uart_Printf("\nTouch Screen Down, please...... \n");
     
  75.     Uart_Getch();    //该函数旨在等待用户的触摸,然后触发中断,并不其他实质意义,其实为等待触摸中断
     
  76.                     //直到用户从键盘随便输入一个字符后,结束该死循环,然后往下执行
     

  77.  
  78.     rINTSUBMSK|=BIT_SUB_TC;    //关闭ADC触摸屏子中断
     
  79.     rINTMSK|=BIT_ADC;        //关闭ADC总中断
     
  80.     Uart_Printf("Touch Screen Test is Finished!!!\n");
     
  81. }

 
流程:
1,在主函数里设置转换时间,由ADCDLY和ADCCON设定,然后,ADCTSC=0xd3设为等待中断模式,触摸笔按下 中断,开启中断后,用一个UART_Getch();等待用户触摸屏幕,产生中断
2,进入中断处理函数,
@设ADCTSC=(1<<3)|(1<<2)|(0<<0); XP上拉禁止,自动连续XY坐标转换模式开启,清XY_PST;
@重设转换时间,开启AD转换直到结束,读取数据寄存器ADCDAT0/1的转换值,为低10位
然后清除中断标志;@在设为ADCTSC =0xd3|(1<<8),等待中断模式,触摸笔抬起中断,直到触摸笔 抬起之后,一次中断完成,输出转换值;
@然后在设为ADCTSC=rADCTSC&~(1<<8),触摸笔按下中断,清中断标志,为下次中断做准备
3,用户从键盘输入后,结束程序

 

 
总结:
一个完整的触摸中断为按下到抬起,
中断处理程序中负责实现AD的转换,
转换后触屏得到的坐标为触摸屏的物理坐标,若和LCD的物理坐标不一致的话,则需要进行触摸屏的校正
中断只负责无条件的引导你进入中断处理程序的入口,具体程序的实现内容还得自己根据需要编写。这就是中断的真实含义。
转换后的数据保存在ADCDAT0/1这两个寄存器里,只需读取就可
注意等待中断的那个操作模式
ADC中断源包括两个子中断源,要注意设置

你可能感兴趣的:(接口,分辨率,触摸屏,通道,分频器)