Chinaunix首页 | 论坛 | 博客
  • 博客访问: 482065
  • 博文数量: 98
  • 博客积分: 3265
  • 博客等级: 中校
  • 技术积分: 1227
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-23 00:29
文章分类

全部博文(98)

文章存档

2012年(6)

2011年(83)

2010年(9)

分类: 嵌入式

2011-03-19 23:26:22

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. #define ADCPRS 9    

  5. int count=0;
  6. volatile int xdata, ydata;



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

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

  31.             while(1)        //等待触笔的抬起
  32.             {
  33.              if(rSUBSRCPND & (BIT_SUB_TC))
  34.                  {
  35.                     break;    //说明笔尖已经抬起,一个触摸中断终于结束,下面读取数据吧
  36.                 }
  37.             }    

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

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




  45. void Test_Touchpanel(void)
  46. {
  47.    
  48.     rADCDLY=50000; //设置等待转换测量时间
  49.     rADCCON=(1<<14)+(ADCPRS<<6); //预分频使能,值为9
  50.                                 //A/D 转换器频率 = PCLK / (预分频值+1)
  51.                                 //转换时间 = 1/(AD转换频率/ 5 周期)
  52.     Uart_Printf("ADC touch screen test\n");
  53.                     //设为等待中断模式
  54.     rADCTSC=0xd3; //设为笔尖落下中断
  55.                     
  56.     pISR_ADC = (int)AdcTsAuto;//并联中断处理程序
  57.     rINTMSK=~BIT_ADC; //ADC总中断开启
  58.     rINTSUBMSK=~(BIT_SUB_TC);//ADC触摸屏子中断开启

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

  63.     rINTSUBMSK|=BIT_SUB_TC;    //关闭ADC触摸屏子中断
  64.     rINTMSK|=BIT_ADC;        //关闭ADC总中断
  65.     Uart_Printf("Touch Screen Test is Finished!!!\n");
  66. }

流程:
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中断源包括两个子中断源,要注意设置
阅读(3358) | 评论(0) | 转发(0) |
0

上一篇:MICRO2440 IIC_AT24C08学习

下一篇:static探究

给主人留下些什么吧!~~