打印

检测上升沿的一段程序,总有概率不能捕捉到

[复制链接]
4648|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
loveme1949|  楼主 | 2012-7-15 07:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
不能用中断了,因为中断不够。所以只能用软件来捕捉上升沿,但是在实际的开发板实验中依然有大概5分之一的概率不能捕捉到上升沿,大概是恰好在判断while,请教各位大侠怎样解决这个矛盾?

while(1)

{

while(!b)//检测低电平

{

if(b)//检测上升沿

{

a=0;

}

}


}

相关帖子

沙发
sneec| | 2012-7-15 09:41 | 只看该作者
试试下面这样。
while(1)
{
     if(b)//检测上升沿
    {
        a=0;
    }
}

使用特权

评论回复
板凳
DownCloud| | 2012-7-15 14:29 | 只看该作者
信号特点,最高频率?具体信号没说!
查询法检测上升沿就是先检测低电平再检测高电平,检测周期小于信号最小周期一半?是不是一半自己算,反正不能漏掉!
另外没中断了就去换单片机啊。

使用特权

评论回复
地板
airwill| | 2012-7-15 18:57 | 只看该作者
我感觉更大的因素是中断的问题, 不是捕捉软件的问题.
被捕捉信号的最高频率是多少, 你的中断的最长时间是多少. 考虑中断导致的漏捕捉的情况.
合理安排一下中断的分配, 最好还是让中断来捕捉信号边沿吧

使用特权

评论回复
5
谈的元| | 2012-7-15 21:08 | 只看该作者
中断用完了,软件在这里等,思路都要不得

使用特权

评论回复
6
ayb_ice| | 2012-7-16 08:29 | 只看该作者
你这用WHILE(1),其它程序怎么办呢

可以在定时中断里去判断,或者扩展中断源

使用特权

评论回复
7
joyme| | 2012-7-16 10:54 | 只看该作者
先看看频率,还有就是一定要及时在上升沿判断吗?
其实可以再主循环里调用,通过电平判断,e.g.

#define   LOW_LEVEL              0               
#define   GET_PIN(PORTn, index)      (PINn & (1<<index))? (!LOW_LEVEL):LOW_LEVEL
BYTE      is_rising_edge(void)
{
       static  BYTE  last_status =  DEFAULT_LEVEL;
       BYTE   curStatus =  GET_PIN(PORTn, index);
       result  =  FALSE;
       if(last_status !=  curStatus )
       {
              if(last_status == LOW_LEVEL)
                   result = TRUE;
              last_status = curStatus;
       }
       return result;
}

使用特权

评论回复
8
joyme| | 2012-7-16 10:58 | 只看该作者
static  BYTE  last_status =  DEFAULT_LEVEL;
改成 LOW_LEVEL

使用特权

评论回复
9
老鱼探戈| | 2012-7-16 11:35 | 只看该作者
考虑两点:
1、被捕捉信号的最高频率是多少。
2、大循环用时多少,即多长时间会捕捉一次。

使用特权

评论回复
10
cubasa| | 2012-7-16 16:39 | 只看该作者
奈奎斯特采样定律

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

49

帖子

0

粉丝