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转换
- #include "uart.h"
-
#include "2440addr.h"
-
#include "def.h"
-
-
#define ADCPRS 9
-
-
int count=0;
-
volatile int xdata, ydata;
-
-
-
-
void __irq AdcTsAuto(void) //进入中断,进行转换,每触摸一下屏幕,就进入该函数,进行A/D转换
-
{ //这就是中断处理函数的深意
-
//一个触摸中断为:触摸笔按下到触摸笔抬起,不抬起的话,中断就没结束
-
rADCTSC=(1<<3)|(1<<2)|(0<<0); //XP上拉禁止,自动连续XY坐标转换模式开启,清XY_PST
-
-
rADCDLY=40000; //重设等待转换测量时间
-
-
rADCCON|=0x1; //start ADC
-
-
while(rADCCON & 0x1); //检测ADC转换是否开始,开始后,该位会被自动清零
-
while(!(rADCCON & 0x8000)); //等待转换结束,可以读取转换后的数值了
-
-
while(!(rSRCPND & (BIT_ADC))); //判断ADC的中断悬挂位,若为1,则说明该中断已经长生,可以处理按下的数据了
-
xdata=(rADCDAT0&0x3ff); //读取X方向的转换数值 //ADCDAT为状态寄存器
-
ydata=(rADCDAT1&0x3ff); //读取Y方向的转换数值
-
-
rSUBSRCPND|=BIT_SUB_TC; //清除中断标志
-
ClearPending(BIT_ADC);
-
rINTSUBMSK=~(BIT_SUB_TC); //重新打开中断,为触摸笔抬起中断做准备
-
rINTMSK=~(BIT_ADC);
-
-
-
//这一次的中断设为触笔抬起中断 ,触摸笔抬起了,一个触摸中断才算结束,才可以读取数据
-
rADCTSC =0xd3; //再设为等待中断模式
-
rADCTSC=rADCTSC|(1<<8); // 设置为触笔抬起中断,但不读取此中断的数据,因为按下和抬起是同一点,上面已经处理了按下的数据
-
-
while(1) //等待触笔的抬起
-
{
-
if(rSUBSRCPND & (BIT_SUB_TC))
-
{
-
break; //说明笔尖已经抬起,一个触摸中断终于结束,下面读取数据吧
-
}
-
}
-
-
Uart_Printf("count=%03d XP=%04d, YP=%04d\n", count++, xdata, ydata);//X-position Conversion data
-
-
rADCDLY=50000; //延时,等待串口输出
-
rADCTSC=rADCTSC&~(1<<8); //重新设为触摸笔按下中断,为下次的触摸做准备
-
rSUBSRCPND|=BIT_SUB_TC; //清除中断标志
-
rINTSUBMSK=~(BIT_SUB_TC); //重新开启中断
-
ClearPending(BIT_ADC);
-
}
-
-
-
-
-
void Test_Touchpanel(void)
-
{
-
-
rADCDLY=50000; //设置等待转换测量时间
-
rADCCON=(1<<14)+(ADCPRS<<6); //预分频使能,值为9
-
//A/D 转换器频率 = PCLK / (预分频值+1)
-
//转换时间 = 1/(AD转换频率/ 5 周期)
-
Uart_Printf("ADC touch screen test\n");
-
//设为等待中断模式
-
rADCTSC=0xd3; //设为笔尖落下中断
-
-
pISR_ADC = (int)AdcTsAuto;//并联中断处理程序
-
rINTMSK=~BIT_ADC; //ADC总中断开启
-
rINTSUBMSK=~(BIT_SUB_TC);//ADC触摸屏子中断开启
-
-
Uart_Printf("\nType any key to exit!!!\n");
-
Uart_Printf("\nTouch Screen Down, please...... \n");
-
Uart_Getch(); //该函数旨在等待用户的触摸,然后触发中断,并不其他实质意义,其实为等待触摸中断
-
//直到用户从键盘随便输入一个字符后,结束该死循环,然后往下执行
-
-
rINTSUBMSK|=BIT_SUB_TC; //关闭ADC触摸屏子中断
-
rINTMSK|=BIT_ADC; //关闭ADC总中断
-
Uart_Printf("Touch Screen Test is Finished!!!\n");
-
}
流程:
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中断源包括两个子中断源,要注意设置
阅读(3350) | 评论(0) | 转发(0) |