搜索
bottom↓
回复: 4

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

[复制链接]

出0入0汤圆

发表于 2011-4-19 10:05:37 | 显示全部楼层 |阅读模式
我是用的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, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2011-4-19 11:12:31 | 显示全部楼层
怎么没人回一下啊

出0入0汤圆

发表于 2011-4-22 13:20:08 | 显示全部楼层
我记得好像不能在中断里用printf这类函数的

出0入0汤圆

发表于 2011-12-3 12:39:36 | 显示全部楼层
中断里面不能调用printf函数,因为printf函数是调用了jtag uart中断服务,而你又没有定义中断嵌套!

出0入0汤圆

发表于 2011-12-3 12:40:23 | 显示全部楼层
看看那本《nios II软件架构解析》吧,写的很仔细的!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 11:14

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表