vsz*_*vsz 3 c embedded concurrency polling
我需要做以下事情:我在微控制器上有2个输入引脚,并且有可能在一个或另一个上接收到一个信号,但也可能两者在外部物理连接,并且信号同时到达.
问题:如果我使用类似的东西
if (PINB.1 && PINB.2)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
存在百万分之一的机会,信号在两个值被加载到寄存器之间到达以进行逻辑AND操作.当我离开时if,两个引脚都很高,但我仍然检测到只有第二个引脚很高.
我尝试了不同的解决方案,到目前为止,最好的选择是在任何一个输入高电平时启动一个非常短的倒计时,当计时器(最多几毫秒)运行时,我再次检查.
有谁知道更简单或更好的解决方案?我认为这个问题非常普遍,但到目前为止我找不到任何"经过验证的"方法.
编辑:我从硬件上知道,在一个边缘之后,引脚将保持其值至少几十毫秒.噪音已被照顾.
PINB.1和PINB.2就是例子.它们可能位于不同的端口上,因此对整个端口进行位掩码可能存在不够灵活的风险.
您已经回答了自己的问题:只需使用计时器并再次检查引脚,它是您可以使用的最简单的数字滤波器形式.但是,当检测到引脚电平变化时,必须启动定时器.如果你有一个非常陡峭的上升沿,即引脚连接到某个数字IC,那么根据CPU时钟与上升沿相比的速度,读取引脚的次数甚至可能就足够了.
如果MCU具有此功能,则另一种解决方案是使用边沿敏感中断.然后保证在更改后立即读取引脚.每个引脚有一个中断,程序可以存储引脚的最新值以进行==比较.您必须确保使用中断和"main"之间的信号量来保护值,或者您回到开始的位置.
| 归档时间: |
|
| 查看次数: |
854 次 |
| 最近记录: |