搜索
bottom↓
回复: 3

请马老师关注一下,PSOC的GPIO操作出现逻辑错误

[复制链接]

出0入0汤圆

发表于 2009-7-28 13:48:34 | 显示全部楼层 |阅读模式
我用的是CY7C63813这个片子,实现的功能是接收红外码。红外接收头接到P0.1口上,在PORT0中断中接收红外码,具体代码如下:
void PORT0_ISR( void )//下降沿有效,无触发时,红外接收头输出高电平
{
unsigned int i;
unsigned int j;
key_code_32 = 0;
P01CR &= 0XBF;//禁止该中断源触发
for(j = 0;j<3120;j++)//delay 9ms,跳过9ms的低电平
{
////
   if(!(P0DATA & 0X02))//假如P0.1口在9ms期间出现高电平,判断为干扰脉冲(实测干扰脉冲的低电平宽度只有250us),中断返回
   {
        //key_pressed = 1;
        P01CR |= 0X40;
        asm("add SP,-4");
        asm("pop X");
        asm("pop A");
        asm("mov [__r0],A");
        asm("pop A");
        asm("reti");
   }
  }
  ////
  //连_发码检测
  for(j = 0;j<1043;j++)//delay 3ms
  {
   if(!(P0DATA & 0X02))//if p0.1 turn to low level,break
   {
        P01CR |= 0X40;
        Lianfa = 1;
        asm("add SP,-4");
        asm("pop X");
        asm("pop A");
        asm("mov [__r0],A");
        asm("pop A");
        asm("reti");
   }
  }
  //key_pressed = 1;
  for(j = 0;j<1043;j++)//delay 3ms
  {
   if(!(P0DATA & 0X02))//if p0.1 turn to low level,break
   {
    break;
   }
  }
  for(i=0;i<32;i++)
  {
   while(!(P0DATA & 0X02));//wait for high level
   for(j = 0;j<490;j++);//delay 0.9ms
   if(P0DATA & 0X02)
    {
     key_code_32 |= 1;
    }
    key_code_32 <<= 1;
  }
  
key_pressed = 1;
P01CR |= 0X40;
}
    问题出在////之间的代码上。正常操作时,下降沿之后,应该是9ms的低电平,我用示波器抓P0.1口的波形,也是如此,其间没有出现过高电平,但是在PORT0_ISR里面竟然触发了。
    开始,我怀疑是不是逻辑不匹配,为了搞清楚P0.1口到底接收到了什么,我禁止PORT0中断,在main函数while(1)下,采用如下语句:
        if(P0DATA & 0X02)//P0.1口接收到“1”
        P0DATA |= 0X20;//置P0.5口为“1”
        else
        P0DATA &= 0XDF;
    然后用示波器测P0.5口,得到的波形跟P0.1口接收到的波形一样。
    这就说明9ms期间,P0.1口没有出现高电平,但是(P0DATA & 0X02)竟然为“真”!!
    所以,请教马老师,是不是P0DATA暂存了最初的高电平,而下降沿中断触发检测到的是实际的IO电平变化,所以,造成中断触发之后,P0DATA无法及时保存P0.1口的实际电平?????

出0入0汤圆

 楼主| 发表于 2009-7-29 09:29:02 | 显示全部楼层
兄弟们,有谁碰到过类似的问题或者有什么好的建议,都说说啊!!!!!

出0入0汤圆

发表于 2009-8-13 17:10:47 | 显示全部楼层
我的邮件地址:fushun@bit.edu.cn请给我邮件

出0入0汤圆

发表于 2009-8-24 21:26:34 | 显示全部楼层
小小提醒:
1. PSOC的GPIO中断没有所谓的上升沿和下降沿触发的概念.只有电平中断的概念.
2. 如果要下降沿中断,只能在IO口为高电平的时候设置为低电平中断.IO口变为低电平的时候就会立即产生中断.模拟下降沿中断.
3. 如果将GPIO设置了低电平中断,但是没有中断允许.这时候如果GPIO曾经出现过低电平,中断就会被触发,但是不能被处理(应为你没允许中断),在这之后你允许了中断,就会立即进中断(记住是曾经出现过低电平,即使现在是高电平)
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-29 05:30

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

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