211sunjian 发表于 2011-4-19 10:05:37

用DE2开发板,NIOSII调试AD7843触摸屏,为什么无法进中断,查询时可以的

我是用的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, XY;

for(i=0; i<SAMP_CNT; i++)   // 采样
{
    if(ads_ReadXY())
    {
      tempXY = X;
      tempXY = 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 > tempXY) min=j;
      }
      temp = tempXY;
      tempXY = tempXY;
      tempXY = temp;
    }
    // 设定阈值
    if((tempXY-tempXY) > 5)
      return 0;
    // 求中间值的均值
    XY = (tempXY+tempXY) / 2;
}
// 矫正坐标
Y = ((XY-350)/11);
X = ((XY-400)/14);
return 1;
}

211sunjian 发表于 2011-4-19 11:12:31

怎么没人回一下啊

cndongj 发表于 2011-4-22 13:20:08

我记得好像不能在中断里用printf这类函数的

zdz09071147 发表于 2011-12-3 12:39:36

中断里面不能调用printf函数,因为printf函数是调用了jtag uart中断服务,而你又没有定义中断嵌套!

zdz09071147 发表于 2011-12-3 12:40:23

看看那本《nios II软件架构解析》吧,写的很仔细的!
页: [1]
查看完整版本: 用DE2开发板,NIOSII调试AD7843触摸屏,为什么无法进中断,查询时可以的