c - 如果我只能使用 2 个 ISR,即 INT0 和 INT1,我如何在 arduino Shield 中使用 4 个按钮进行去抖动

标签 c embedded

有4个按钮需要接受输入,为了防止去抖动我需要使用ISR(中断服务例程)。 INT0和INT1中断 vector 可以处理开关1和2,但是我们需要处理其余2个开关以防止去抖,我应该怎么做?

最佳答案

使用引脚中断去抖动的另一种方法是使用周期性定时器中断(或系统滴答,如果有的话)。通过这种方法,您几乎拥有无限的去抖能力。

将您的硬件配置为每 5-20 毫秒生成一次滴答中断,您每次都可以对引脚进行采样。您的去抖周期将由刻度周期和您收集的样本数量决定。对于每个按钮,您可以将每个样本存储为字节、半字或字中的一位,具体取决于使用的样本数量。

例如,简单的去抖可以使用 10 毫秒的刻度和仅两个样本。在每次中断时,您都会看到类似以下内容的内容:

const byte mask = 0x3;                    // this mask has N lsb's set,
                                          // where N is the number of samples.
static bit debounced = 0;                 // this stores the debounced output of a button
static byte samples = 0;                  // this stores the raw samples
samples = samples << 1;                   // shift the samples to make room
samples |= ReadBit(theThingToDebounce);   // for the new sample (and or it in)
if ((samples & mask) == 0x0)              // test that all samples are 0
{
    debounced = 0;                        // debounced output is 0
}
else if ((samples & mask) == mask)        // test that all samples are 1
{
    debounced = 1;                        // debounced output is 1
}

这可以根据您的要求稍微简化,或者变得更复杂。如果您需要在去抖按钮状态更改时向应用程序发出信号,则需要执行其他检查以查看之前的状态是否与新状态相反,然后发出信号。如果您不需要这样做,那么您实际上可以在每次调用时评估样本(以确定是否有去抖 1 或 0)以检查按钮的状态。

上面的片段可以很容易地转换成真正的代码。可以使用 mask 类型轻松更改样本数量。和samples ,以及 mask 的值。更改周期将是您的滴答周期的配置,这将更加特定于设备。

一般来说,mask可以基于 N 定义示例而不是手动更新。如果您想要N数字集的最低有效位,您可以实现这一点,但计算 2^N-1 ,或者用代码更简单:(1<<N) - 1 。这给了我们一个新的定义:

const byte nSamples = 4;
const byte mask = (1 << nSamples) - 1; // 1 << 4 = 0x10, 0x10 - 1 = 0xF.
                                       // This gives us a number with the four LSB's set.

要在多个引脚上运行此功能,您只需制作 samplesdebounced根据要监视的引脚数量确定大小的数组,然后为每个引脚循环执行算法。

关于c - 如果我只能使用 2 个 ISR,即 INT0 和 INT1,我如何在 arduino Shield 中使用 4 个按钮进行去抖动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39503179/

相关文章:

c - 按字母降序对文件进行排序

gdb - 像 gdb 这样的调试器如何通过 JTAG 设置断点?

c++ - 最佳实践 - 合并多个翻译单元中的重复文本文字

c++ - 在 C 中定义整数解析为无符号字符,或在数学运算的情况下产生意外行为

c++ - 如何在cpp和c中不使用cout/printf输出文本?

c - C 中的指针,使用数组获得意外结果

c - 这个 switch case 构造有更好的实现吗?

c - 无需RAM即可虚拟工作的解压算法(如果可能的话LZ喜欢)

C、虽然不起作用,

C 文件读取不正确