This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC2530:敏感按钮

Guru**** 2589300 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/830526/cc2530-sensitive-push-button

器件型号:CC2530

大家好、

我´m 实施一个敏感按钮。 我´m 首先使用 SmartRF05EB 1.7.1和 EM 来实现它。  

我想根据以下规则实施代码:

-正常按“开”或“关”

-按住超过3秒钟,第一次将提高液位,

-按住3秒钟以上将降低液位,

我对n´t 保持时间有一些疑问、我已经开始使用 HandleKeys 功能来检测保持时间、但我不知道如何使用 osal_start_timer 等来实现它。  

´ll、我的 LED_ON 和 LED_OFF 代码开始了解实施代码的更好方法、但将来我会使用调光器电平上下移动。

if ((键& HAL_KEY_SW_6)=0)
{
//giLightScreenMode = Light_MAINMODE;
HalLedSet (HAL_LED_1、HAL_LED_MODE_ON);
buttonPressed =1;
longBtnPress = 0;
if (buttonPressed = 1)
{
//测试长按或短按
if (longbtnPress = 1)
{
zclTTa0003_OnOff =zclTTa0003_OnOff? light_off:light_on;
longBtnPress = 0;
}否则
{
HalLedSet (HAL_LED_1、HAL_LED_MODE_OFF);//切换短 LED
}
buttonPressed = 0;
timerCounter = 0;
}

#ifdef ZCL_LEVEL_CTRL
// zclTTa0003_OnOff =zclTTa0003_OnOff? light_off:light_on;
#endif
} 

有人知道如何执行机制来检测保持时间?

BR、

Alex

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    当您在 HandleKeys 功能中检测到按钮被按下时、您可以每100ms 启动一次计时器事件、以检查按钮是否被保持。 如果检测到按钮在计时器事件中处于保持状态、则重新启动事件以再次检查保持状态。 如果没有、您可以计算触发的计时器事件数、以了解按钮的按住时间。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    供参考的上一次对话: https://e2e.ti.com/support/wireless-connectivity/zigbee-and-thread/f/158/t/828042

    此致、
    Ryan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Yikai 先生、  

    您可以在我的代码下方看到、我在检测长压力时遇到问题、在我的配置中、我无法递增计数器、因此、我的 longBtnPress 标志未命中!

    if (((keys & HAL_key_sw_6)=0)
    {
    //giLightScreenMode = light_MAINMODE;
    osal_start_timerEx (zclTTa0003_TaskID、TTa0003_level_CTRL_EVT、100);
    timerCounter = timerCounter + 1;
    longBtnPress = 0;
    
    //HalLedSet (HAL_LED_1、HAL_LED_MODE_ON);
    buttonPressed =1;
    if (buttonPressed =1)
    {
    //测试长按或短按
    if (longbtnPress = 1)
    {
    zclTTa0003_OnOff =zclTTa0003_OnOff? light_off:light_on;
    longBtnPress = 0;
    }否则
    {
    // HalLedSet (HAL_LED_1、HAL_LED_MODE_OFF);//切换短 LED
    }
    buttonPressed = 0;
    //timerCounter = 0;
    }
    
    if (timerCounter > 2)
    {
    longbtnPress = 1;
    否则{
    timerCounter = 0;
    }
    
    #ifdef ZCL_LEVEL_CTRL
    // zclTTa0003_OnOff =zclTTa0003_OnOff? light_off:light_on;
    #endif
    }
    //更新显示,包括 light
    zclTTa0003_LcdDisplayUpdate();
    } 

    请、您能给我一个解决问题的想法吗?

    BR、

    Alex

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这些代码是否位于您的应用程序的 handlekey 回调中? 如果是,为什么它是“if (((keys & HAL_key_sw_6)=0”?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Yikai 先生、

    我完全同意您的观点、我使用了错误的方法来保证按位条件操作、当我使用"keys  & HAL_key_sw_6)=0"时、要使用 句柄键回调中应用代码中的正确格式 keys & HAL_key_sw_6、 我已将 hal_key.h 格式0x20中的 HAL_KEY_SW_6值更改为0x14、在该值之后、预测将是 MAT。 (KEY = 0x04且 HAL_KEY_SW_6 = 0x14)。 但对于代码的其余部分、我认为我写了一些错误、 longBtnPress = 1未命中!  

    您可以看到我的句柄键函数的一部分:

    if (keys & HAL_key_sw_6)
    {
    //giLightScreenMode = light_MAINMODE;
    osal_start_timerEx (zclTTa0003_TaskID、TTa0003_level_CTRL_EVT、100);
    buttonPressed =1;
    //HalLedSet (HAL_LED_1、HAL_LED_MODE_ON);
    
    IF (buttonPressed = 1)
    {
    //测试长按或短按
    if (longbtnPress = 1)
    {
    zclTTa0003_OnOff =zclTTa0003_OnOff? light_off:light_on;
    longBtnPress = 0;
    timerCounter = 0;
    keys &=~key;
    }否则
    {
    // HalLedSet (HAL_LED_1、HAL_LED_MODE_OFF);//切换短
    按键 Pressed = 0;
    按键&=~键;
    }
    
    
    }
    
    如果(timerCounter > 2)
    {
    longBtnPress = 1;
    }否则{
    timerCounter = timerCounter + 1;
    longBtnPress = 0;
    }
    
    #ifdef ZCL_LEVEL_CTRL
    // zclTTa0003_OnOff =zclTTa0003_OnOff? light_off:light_on;
    #endif
    }
    //更新显示,包括 light
    zclTTa0003_LcdDisplayUpdate(); 

    请、您能给我一个想法吗?

    BR、

    Alex

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您是否每100ms 启动一次计时器事件、以检查在您的手控钥匙检测到 SW6触发后按钮是否保持?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Yikai 先生、

    很抱歉我犯了个错误,我以前走错了!

    正如您在下面看到的、如果在 handle 键检测到 SW6后按住按钮、我每隔100ms 检查一次、但我认为 OSALTIMER 有问题、始终为"zclTTa0003_OnOff = zclTTa0003_OnOff? LIGHT_OFF:LIGHT_ON"已按下,即使长时间按住按钮也是如此。 我已经将 OSAL 计时器从100000的100更改为检查、没有任何变化!

    注意:在 OSAL 计时器函数中、OSAL 超时值以毫秒为单位。 如下所述:

    我的代码:

    if (keys & HAL_key_sw_6)
    {
    //giLightScreenMode = light_MAINMODE;
    osal_start_timerEx (zclTTa0003_TaskID、TTa0003_level_CTRL_EVT、100);
    if (keys & HAL_key_sw_6){
    
    zclTTa0003_OnTO0003 =zclO0003? light_off:light_on;
    //timerCounter = timerCounter + 1;
    
    }否则{
    //zclTTa0003_OnOff =zclTTa0003_OnOff? light_off:light_on;
    
    }
    
    //
    更新显示,包括 light
    zclTTa0003_LcdDisplayUpdate();
    } 

    请、您能给出一个想法吗?

    BR、

    Alex

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Yikai 先生、  

    我进行了更多的测试、并观察到 SW_5具有并发值、当我按下按钮1 SW_5 (BasicResetCB)并且同时按下 SW_6时。  我已更改 hal_key.h 中的 SW_5值  

    //#define HAL_KEY_SW_5 0x04 // Joystick center original value。
    #define HAL_KEY_SW_5 0x03 // Joystick center
    //#define HAL_KEY_SW_6 0x20 //按钮 S1 (如果可用) 

    现在、只有 SW_6被命中。 但在调试模式期间、我还观察到 、即使 存在短暂的压力、也会始终按第二个键检查、即在 OSAL 超时后调用 μ´s。

    我的应用程序代码:

    if (keys & HAL_key_sw_6)//第1次按键检查
    {
    //giLightScreenMode = light_MAINMODE;
    
    osal_start_timerEx (zclTTa0003_TaskID、TTa0003_level_CTRL_EVT、100);
    if (keys & HAL_key_sw_6){//第2次按键检查 
    zclTTa0003_OnOff =zclTTa0003_OnOff? light_off:light_on; //keys &=~keys; //timerCounter = timerCounter + 1; }否则{ //zclTTa0003_OnOff =zclTTa0003_OnOff? light_off:light_on; } // 更新显示,包括 light //zclTTa0003_LcdDisplayUpdate(); }

    可能我需要在 OSAL 超时后重置密钥、我尝试包括密钥&=~密钥;但这会导致循环退出。

    请帮帮我。

    BR、

    Alex

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Yikai 先生、

    请勿´m 我的最后两个线程、我正在努力定义 OSAL 事件以检测 BTN 保持和 BTN 短按。  

    您对我的建议是什么、我可以删除或保留最后两个线程?

    BR、

    Alex

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您可以保留它们、但向我展示您的最新进展。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的、Yikai 先生! 谢谢!

    我´ll 向你们展示我的最后一个进展,我已经取得了很大的进步!

    正如您所说、我创建了一个特定事件、我调用了 BtnHOLD_EVT、尝试进行正确的 BTN 治疗。 如下所示:

    在 zcl_TTa0003.h、我已插入应用事件:

    #define TTa0003_BtnHOLD_EVT0x0060 

    在 zcl_TTa0003.c、我插入了:

    if (Events & TTa0003_BtnHOLD_EVT)
    {
    如果(HAL_PUSH_Button1 ()// BTN 长按
    {
    btnHoldCnt++;
    
    if (BtnHoldCnt >=1)
    {
    HalLedSet (HAL_LED_3、HAL_LED_MODE_OFF);
    
    }
    其他
    OSAL_START_timerEx (zclTTa0003_TaskID、TTa0003_BtnHOLD_EVT、100);
    }
    else // BTN 短按 
    {
    HalLedSet (HAL_LED_3、HAL_LED_MODE_ON);
    }
    返回(事件^ TTa0003_BtnHOLD_EVT);
    } 

    Handle key 回调中

    if (keys & HAL_key_sw_6)
    {
    btnHoldCnt =0;
    //HalLedSet (HAL_LED_3、HAL_LED_MODE_BLINK);
    OSAL_START_timerEx (zclTTa0003_TaskID、TTa0003_BtnHOLD_EVT、100);
    
    } 

    但我观察到、在事件处理结束后、始终保持(BTN 长按) 或短按(BTN 短按)条件过程、程序返回以处理键回调、 这会导致程序循环!

    我认为 、我需要在事件结束时加入 TTa0003_BtnHOLD_EVT 函数 来阻止它。 可能会清除中断标志!

    请给出一个想法吗?

    BR、

    Alex

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    事件定义是一个位标志屏蔽、如0x0001、0x0002、0x0004、0x0008、0x0010、 0x0020 因此、TTa0003_BtnHOLD_EVT 不能定义为0x0006。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Yk 先生

    我已经设置了 TTa0003_BtnHOLD_EVT、正如您告诉我要使其成为位可屏蔽的那样、您可以看到如下:

    #define TTa0003_BtnHOLD_EVT0x0080 

    但是、我的程序具有奇怪的行为、在启动 Handle 密钥后、OSAL 计时器和 BtnHOLD_EVT 事件已完成、事件处理密钥仍被调用、然后再次启动该过程。 在我的示例中、LED_3将在短时间内打开、在按住按键时关闭、但此 LED 从未关闭、通过循环 (LOOP)处理键-> BtnHOLD_EVT (HOLD 或 SHORT)->处理键调节。  

    请、您能给我一个想法吗?

    BR、

    Alex

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,Yk 先生!

    我´ll 向您更好地解释我的代码发生了什么:

    我注意到:

    1 -中断仅在我必须按住并释放 S1按钮时发生。 发生这种情况时、将调用我的回调(SW6)函数  

    2 -之后、我的代码会解释两种状态:

    a)如果再次按下并保持 S1 ( 已达到条件 HAL_PUSH_Button1)、LED3将关闭。  

    B)如果再次按下 S1并释放未达到选项 A 中的预测、LED 3将亮起。

    在上述两种情况下(a 或 b) 、在 事件处理结束时、我的函数回调将再次被调用、如果 LED3关闭、根据 状态 A (按下并保持)、LED3将再次打开。 在实践中、LED3开始关闭、在第一次按下并释放时、打开并在它仍然打开后、甚至多次按下 S1。 如我在上面所述。

    请、您能不能介绍如何在我的代码中修复它?

    BR、

    Alex

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好、Yk 先生。

    ´m 很高兴、我在更改代码后成功了一点、现在我的代码可以很好地检查短压力和长压力、如下所示:

    if (Events & TTa0003_BtnHOLD_EVT)
    {
    如果(HAL_push_Button1 ())//BTN 长按
    {
    // BtnHoldCnt++;
    
    if (BtnHoldCnt >=10)
    {
    BtnHoldCnt=0;
    HalLedSet (HAL_LED_3、HAL_LED_MODE_ON);
    
    } 否则{
    BtnHoldCnt++;
    HalLedSet (HAL_LED_3、HAL_LED_MODE_OFF);
    osal_start_timerEx (zclTTa0003_TaskID、TTa0003_BtnHOLD_EVT、 100);}
    
    } else // BTN 短按
    {ret=osal_start_timerEx (zclTTa0003_TaskID、TTa0003_BtnHOLD_EVT、100);}//返回到 handle 键 
    
    返回(事件^ TTa0003_BtnHOLD_EVT);
    } 

    下一步、我需要研究如何:

    > 检查方向以检测要增大和减小的长压力、

    > 关联调平调光器变量以提高和降低调光器电平(我使用 LED3在时间上打开和关闭,只是为了验证代码),

    > 将调光器电平反馈从设备发送到网关。

    我´ll 让我的进展顺利!

    Yk 先生,我要说非常感谢!

    BR、

    Alex