微控制器中的按钮按下和保持检测



我正在尝试实现一个逻辑来检测RF遥控器的按键和保持。目前,我能够检测到我的控制器RF接收器中的按钮按下。我每次按下都会收到中断回拨。现在,我如何在代码中检测到按住5秒?

我在示波器中检查了一下,当我在遥控器中按住一个键时,我每34ms就会收到接收器中的RF数据。

我所能想到的就是在5秒内计算具有相同数据的连续中断次数并进行验证,但我不确定这是正确的方法。

如何实施它的任何建议。我会尝试的。

感谢

对于任何按钮,无论是直接按钮,还是远程按钮,一个好主意都是检测按下和释放。然后在此基础上应用按住计时。通过这种方式,可以以相同的方式处理物理按钮和远程按钮。

在这种情况下,您可以通过设置50ms计时器来检测释放,该计时器在每35ms按钮中断时重新启动。然后,如果50ms计时器到期,则按钮已释放(或超出范围(。

然后,对于5秒的保持,你可以有5秒的计时器,可以在按下按钮时启动,在松开按钮时取消。类似地,如果该计时器过期,则触发保持事件。

定时器可以在软件或硬件中实现,尽管将两个硬件定时器专用于一个按钮可能会浪费资源。

另请参阅按下按钮3秒钟以及如何使用Atmega8 1MHz测量其时间?。给定如上所述的新闻/发布检测,您可以应用该问题的公认答案中更高级别的保持时间。

首先,根据您使用的射频技术,您可能无法实时获得响应。一些射频技术具有相对较长的延迟/传播延迟,许多技术根本无法保证实时性。您可能需要考虑到这一点,用示波器测量发射器中物理按键到接收器中检测到按键之间的时间。

此外,我们还必须假设按钮在发射器一侧正确脱弹,否则你会收到大量垃圾。

可能的方法1:

  • 使用循环定时器中断,每隔50ms左右读取一次按钮的状态。您可以使用计数器变量,如果按下按钮,该变量将增加1,如果释放按钮,则设置为零

可能的方法2:

  • 获得第一个键盘中断后,假设它在上升沿触发,将该中断更改为现在在下降沿触发。然后启动计时器,确保在计时器运行期间没有中断触发。

    一些MCU定时器外围设备支持两个边缘的输入捕获,因此您可以在此基础上实现上述方法的各种替代方法。

可能的方法3:

  • 如果使用一些简单的OOK东西,并且发射机在按下按钮之前一直处于休眠状态,那么您可以使用RFIC提供的任何RSSI功能来简单地记录RSSI。但通过这种方式,您需要一些方法来检测是否是您的发射机导致RSSI上升

非常感谢大家的建议。我实现了基于用户给出的建议的逻辑";爱管闲事的克利福德和伦丁;现在它正在发挥作用。请看一看。

void ISR_callback(uint32_t value) //Button press ISR
{
button_data = (uint8_t)((value>>8) & 0xF);

if(button_data == 0xB) //required button pressed
{
button_pressed = 1;
button_timer_50ms = 0; //reset the independent 50ms counter, if button pressed
}
}
void main(void)
{
while(1)
{
if (one_ms_time_expired()) //1ms timer loop
{
if(button_pressed) //is set in ISR, if button is pressed
{
timer_5sec++; //Counter to check if key is pressed for 5 sec
button_timer_50ms++; //Independent counter to reset status if button is released
if(button_timer_50ms==50) //if no key pressed for 50ms, reset all status
{
button_timer_50ms = 0;
button_pressed = 0;
timer_5sec = 0;
button_data = 0;
}
if(timer_5sec == 5000) //5sec done
{
timer_5sec = 0;
button_data = 0;
button_pressed = 0;
button_timer_50ms = 0;
//Buzzer_ON
}
}
}
}
}

最新更新