【发布时间】:2011-08-26 06:40:58
【问题描述】:
我需要执行以下操作:我在微控制器上有 2 个输入引脚,并且有可能在一个或另一个上接收到信号,但也有可能这两个将在外部物理连接, 信号同时到达。
问题:如果我使用类似的东西
if (PINB.1 && PINB.2)
{
// ...
}
有百万分之一的机会,信号在两个值被加载到寄存器以执行逻辑与运算之间到达。当我离开if时,两个引脚都是高电平,但我仍然检测到只有第二个引脚是高电平。
我尝试了不同的解决方案,到目前为止,最好的方法似乎是在任何一个输入为高时开始一个非常短的倒计时,并且当计时器(最多几毫秒)耗尽时,我再次检查。
有人知道更简单或更好的解决方案吗?我认为这个问题很常见,但到目前为止我找不到任何“经过验证的”方法。
编辑:我从硬件上知道,在一个边缘之后,引脚将保持其值至少几十毫秒。噪音已经处理好了。
PINB.1 和 PINB.2 只是示例。它们可能位于不同的端口上,因此对整个端口进行位掩码可能会带来不够灵活的风险。
【问题讨论】:
-
您到底在关注什么情况?您是否只想响应任一引脚上的每个上升沿?
-
我必须注意很多不同的条件(边沿、特定时隙中的信号数量、信号长度等),但我从硬件中知道,在上升沿之后pin 将在合理的时间内保持高电平:至少几十毫秒。
-
您问题中的
if在寻找什么条件? -
可以更换硬件吗?输入端口是否在同一个寄存器中?最好的解决方案是将所有输入放在 PIN 中,以便共享相同的 I/O 寄存器,也就是说,当您读取寄存器时,您将同时读取所有输入。要测试输入,简单的 OR/AND 掩码将解决您的所有问题。再想一想,我真的怀疑您的微控制器速度如此之慢会干扰结果。你说输入信号已经被毫秒阻尼了,哪种处理器会花这么多时间来做一对比较指令???
标签: c concurrency embedded polling