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:使 CC2530在按下按钮时读取(未释放)

Guru**** 2540080 points
Other Parts Discussed in Thread: CC2530

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

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/564724/cc2530-make-cc2530-read-when-button-is-pressed-not-released

器件型号:CC2530

您好!

如何使 CC2530能够在按下按钮但不释放按钮时读取? 现在、如果我按住按钮、CC2530直到我松开按钮才会响应。 因此、我需要它、以便 CC2530读取实际的按压部件。 这是一个问题、因为出厂复位不起作用。 出厂复位代码需要知道按钮是否被按下、但遗憾的是、CC2530只读取按钮的释放信息。 如何解决此问题? 电路是否存在编程问题? (我的按钮电路看起来像下面的、但连接到 CC2530)

e2e.ti.com/.../7635.hal_5F00_key.c

e2e.ti.com/.../6177.zcl_5F00_samplelight.c

Image result for button circuit with arduino

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果 CC2530在我松开按钮之前没有响应、则意味着您使用了错误的边沿触发器。 您应该在 hal_key.c 中使用上升沿而不是下降沿
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    它现在可以工作了。 但是、在出厂复位代码中、当我按住按钮时、不会始终点击下图中的断点、这意味着程序不知道按钮正在被按下。 为什么会这样、以及如何修复它、以便每次按下按钮时都会遇到断点? 根据程序、每次按下按钮时应按断点。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我认为您应该将"if (P2_0=1)"替换为"if (P2_0=0)"
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我已经尝试过这种方法、但这意味着"如果按钮被释放"、因此在我不按下按钮的情况下、出厂复位会持续发生。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您的 KEYHOLD_EVT 中存在错误。 请尝试使用以下代码替换您的代码。

    if (事件和 KEYHOLD_EVT)

    如果(P2_0==1)

    if (KeyPressCnt>25){
    extern void ZDRApp_ResetTimerStart( uint16 delay );
    zgWriteStartupOptions (ZG_STARTUP_SET、(ZCD_STARTOPT_DEFAULT_NETWORK_STATE | ZCD_STARTOPT_DEFAULT_CONFIG_STATE));
    ZDUApp_ResetTimerStart (2000);

    }否则{
    KeyPressCnt++;
    OSAL_START_timerEx (zclSampleLight_TaskID、KEYHOLD_EVT、100);

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

    我尝试了代码、现在我只按一次按钮、断点就会持续点击3-5次。 这很奇怪、而且问题是当我按住按钮5秒钟以上时、从未按过恢复出厂设置上的断点。 为什么会这样、以及如何修复它、以便 CC2530工厂在我按住按钮5秒钟后复位?

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

    我在代码中犯了一个错误。 请在以下内容中修改红色鳕鱼:

    if (事件和 KEYHOLD_EVT)

    如果(P2_0=0)

    if (KeyPressCnt>25){
    extern void ZDRApp_ResetTimerStart( uint16 delay );
    zgWriteStartupOptions (ZG_STARTUP_SET、(ZCD_STARTOPT_DEFAULT_NETWORK_STATE | ZCD_STARTOPT_DEFAULT_CONFIG_STATE));
    ZDUApp_ResetTimerStart (2000);

    }否则{
    KeyPressCnt++;
    OSAL_START_timerEx (zclSampleLight_TaskID、KEYHOLD_EVT、100);

    返回(事件^ KEYHOLD_EVT);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    遗憾的是、这没有解决问题。 你还建议什么?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您现在看到了什么问题?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    嗯、当我按下按钮时、上面图像中的断点仍然没有被按下。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    释放按钮时、断点应按。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    但没有。 当我按住按钮5秒钟以上然后松开时、CC2530不会进行出厂复位。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果在"if (KeyPressCnt>25)"上设置断点,您看到的 KeyPressCnt 的值是什么?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大多数情况下、断点未命中、但当它达到时、我通常得到一个值0、但偶尔、如果我幸运、我得到一个大于25的值。 因此、基本的问题是、代码并不总是知道按钮被按下5秒钟、即使 ISR 一直被按下。 为什么出厂重置代码并不总是知道按钮被按下5秒钟、这可能是什么问题?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    删除了" if (keys & HAL_key_sw_6){...}"中的"KeyPressCnt=0;" 并将其放入“if (KeyPressCnt>25){...}”
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    断点被命中次数更多、这改进了代码、但与 ISR 处的断点不同、工厂复位代码仍然不总是知道何时按下按钮。 是否还有其他需要改进的代码、以便出厂复位始终知道何时按下按钮? 有时、它不知道按钮被按住5秒钟。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当您看到"有时它不知道按钮被按住5秒"时、您看到的 KeyPressCnt 的值是多少?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    当它不读取按钮时、不会遇到断点。 当它确实命中时、它会正确读取 KeyPressCnt 的值。 因此、需要解决的问题是出厂重置需要始终知道按钮被按下和保持。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    那么、如果在 if (keys & HAL_key_sw_6)中设置了另一个断点、并且当您看到"有时它不知道按钮被保持5秒"时、它是否会命中?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    该断点始终命中。 不是在恢复出厂设置时。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    它是否进入 KEYHOLD_EVT?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这话什么意思? 断点会命中并停止、因为它检测到上升沿按钮按压操作。 只要我按下按钮、断点就会立即按下、并且不会等待我按住按钮。 只有恢复出厂设置代码等待我按住按钮。 可能是 P2_0和 HAL_KEY_SW_6之间的差异导致了此问题?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当触发 P2_0时、如果 zclSampleLight_HandleKeys 中的(keys & HAL_key_sw_6)并调用"osal_start_timerEx (zclSampleLight_TaskID、KEYHOLD_EVT、100)"、则应将 KEYHOLD_EVT 调度为100ms 后的值。 我的问题是当 P2_0被触发时,它是否总是在 IF (Events & KEYHOLD_EVT)中点击“if (P2_0=1)”。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    并非总是如此、但大部分时间都是这样。 如果我在 if (KeyPressCnt>25)上设置断点,则断点命中率甚至更低。 为什么会这样、如何解决?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是否可以附加最新的 zcl_samplelight.c?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    文件如下:

    e2e.ti.com/.../1057.zcl_5F00_samplelight.c

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果您在"KeyPressCnt++;"处设置了断点、您是否会看到每次对等并按住按钮时它都会持续点击?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    当我在第一次遇到断点后按住该按钮时、它会持续点击、直到我释放该按钮、这很好。 但是、它并不总是知道我何时按下按钮并按住它。 例如、我按住按钮、断点不会按。 然后我释放按钮。 然后、我按住按钮、知道断点已命中并持续点击、直到我释放按钮。 因此问题仍然是 ,如果(P2_0==0)并不总是注册按钮被按下。 一旦确定按钮被按下、它就知道按钮被保持5秒钟。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我建议您检查 osal_start_timerEx (zclSampleLight_TaskID、KEYHOLD_EVT、100)的返回值;以查看事件是否每次都正确启动。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我将文章更改为:
    当我在第一次遇到断点后按住该按钮时、它会持续点击、直到我释放该按钮、这很好。 但是、它并不总是知道我何时按下按钮并按住它。 例如、我按住按钮、断点不会按。 然后我释放按钮。 然后、我按住按钮、知道断点已命中并持续点击、直到我释放按钮。 因此问题仍然是,如果(P2_0==0)并不总是注册按钮被按下。 一旦确定按钮被按下、它就知道按钮被保持5秒钟。

    此外、如何检查返回值? 我是否需要向观察窗口添加一个变量?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    uint8 ret;//声明 ret 作为全局变量

    RET=osal_start_timerEx (zclSampleLight_TaskID、KEYHOLD_EVT、100);

    在观察窗口中检查转台。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这是每次遇到断点时为 ret 获取的值:'\0'(0x00)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果 ret 为0x00、则表示已成功创建事件。 然后,程序应该进入“if ( events & KEYHOLD_EVT ){.}”,不是吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、但是当我按下按钮时、if (P2_0==0)处的断点并不总是被按下、这与 if (keys & HAL_key_sw_6)处一直被按下的断点不同。 我是否应该在出厂复位代码中执行 if (HAL_KEY_SW_6)来解决该问题?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能否附加一个屏幕快照来显示您设置的 if (P2_0=0)处的断点?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我在行 if (P2_0==0)以及 keypress++上设置断点。 它们仅在按下按钮时按、但与 ISR 中的断点不同、断点并不总是按。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您的屏幕截图在哪里? 如果您按住按钮、断点是否会持续触发?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢你的帮助。 我发现我必须重新排列 if 语句、并将其重新定义为下面的语句、因此现在它可以可靠地工作。

    if (事件和 KEYHOLD_EVT)

    如果(P2_0==1)

    if (KeyPressCnt>10){
    KeyPressCnt=0;
    extern void ZDRApp_ResetTimerStart( uint16 delay );
    zgWriteStartupOptions (ZG_STARTUP_SET、(ZCD_STARTOPT_DEFAULT_NETWORK_STATE | ZCD_STARTOPT_DEFAULT_CONFIG_STATE));
    ZDUApp_ResetTimerStart (2000);

    否则{
    KeyPressCnt++;
    OSAL_START_timerEx (zclSampleLight_TaskID、KEYHOLD_EVT、100);
    RET=osal_start_timerEx (zclSampleLight_TaskID、KEYHOLD_EVT、100);


    返回(事件^ KEYHOLD_EVT);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    欢迎您的到来、很高兴知道它现在可以正常工作。