|
我是用的altera公司的DE2开发板上的GPIO,通过NIOSII来进行的调试AD7843的触摸屏,如果用查询的方式可以获得触摸的坐标,但是改用中断的时候就发现不可以了,老是进不去中断,不知道怎么一回事,有没有做过这方面东西的人啊。。。。。。。下面试一些程序:
//nIRQ中断初始化
void nIRQ_Initial(void)
{ IOWR_ALTERA_AVALON_PIO_IRQ_MASK(INT_BASE, 1); // 使能中断
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(INT_BASE, 0); // 清中断边沿捕获寄存器
alt_irq_register(
INT_IRQ, // 硬件中断号,从system.h复制
NULL,
nIRQ_ISR // 中断服务子函数
);
}
// 中断服务子函数
void nIRQ_ISR(void* context,unsigned long id)
{
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(INT_BASE, 0); // 清中断边沿捕获寄存器
printf("Hello from Nios II!\n");
if(ads_GetXY()) // 获得触摸的位置
{ printf("X=%d",X);
printf("Y=%d",Y);
}
}
// SPI开始状态
void ads_SPIStart(void)
{
Clr_ads_CLK;
Set_ads_nCS;
Set_ads_DIN;
Set_ads_CLK;
Clr_ads_nCS;
}
// SPI写一个byte
void ads_SPIWrite(u8 cmd)
{
u8 i;
Clr_ads_CLK;
for(i=0; i<8; i++) // 上升沿有效
{
IOWR_ALTERA_AVALON_PIO_DATA(MOSI_BASE,(cmd >> (7-i)) & 0x1); //先高位后低位 顺序写入8位数据
// ads_DIN = (cmd >> (7-i)) & 0x1; // MSB在前,LSB在后
Clr_ads_CLK;
Set_ads_CLK;
Clr_ads_CLK;
}
}
// SPI读12个bit
u16 ads_SPIRead(void)
{
u8 i;
u8 j;
u16 temp=0;
for(i=0; i<12; i++) // 下降沿有效
{
temp=temp<<1;
Set_ads_CLK;
Clr_ads_CLK;
j=ads_DOUT;
if(j)
{ temp++;
}
}
return temp; //temp的值就是读到的值
}
// 读取ADS7843采集到X、Y值
// 返回:超出屏幕范围,则返回0
bool ads_ReadXY(void)
{
ads_SPIStart();
ads_SPIWrite(0x90); // 水平坐标寄存器
X = ads_SPIRead();
ads_SPIWrite(0xd0); // 垂直坐标寄存器
Y = ads_SPIRead();
if((X>350 && X<3800) && (Y>300 && Y<3800)) // 根据自己的屏自行矫正
return 1; // 读数成功(范围限制)
else
return 0; // 读数失败
Set_ads_nCS;
}
// 处理从ADS7843读取的X、Y值,然后互换
#define SAMP_CNT 4
#define SAMP_CNT_DIV2 2
bool ads_GetXY(void)
{
u8 i, j, k, min;
u16 temp;
u16 tempXY[2][SAMP_CNT], XY[2];
for(i=0; i<SAMP_CNT; i++) // 采样
{
if(ads_ReadXY())
{
tempXY[0] = X;
tempXY[1] = Y;
}
}
for(k=0; k<2; k++) // 滤波
{ // 降序排列
for(i=0; i<SAMP_CNT-1; i++)
{
min=i;
for (j=i+1; j<SAMP_CNT; j++)
{
if (tempXY[k][min] > tempXY[k][j]) min=j;
}
temp = tempXY[k];
tempXY[k] = tempXY[k][min];
tempXY[k][min] = temp;
}
// 设定阈值
if((tempXY[k][SAMP_CNT_DIV2]-tempXY[k][SAMP_CNT_DIV2-1]) > 5)
return 0;
// 求中间值的均值
XY[k] = (tempXY[k][SAMP_CNT_DIV2]+tempXY[k][SAMP_CNT_DIV2-1]) / 2;
}
// 矫正坐标
Y = ((XY[0]-350)/11);
X = ((XY[1]-400)/14);
return 1;
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|