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:使电机运行、直到按下 HAL_KEY_SW_1

Guru**** 2540080 points
Other Parts Discussed in Thread: CC2530, Z-STACK

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

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/565861/cc2530-make-motor-run-until-hal_key_sw_1-is-pressed

器件型号:CC2530
Thread 中讨论的其他器件: Z-stack

您好!

如何对 CC2530进行编程、以使电机在 HAL_KEY_SW_1被抑制之前一直运行。 我有了它、这样我就按下 HAL_KEY_SW_6 (在 HandleKeys 中)来启动电机。 下面是迄今为止我在 SampleLight 中的代码、但 CC2530正在跳过 while 循环。 我的程序应该是说、如果未按下 HAL_KEY_SW_1、则运行电机、直到按下按钮。 为什么它不起作用?

静态空 zclSampleLight_DisplayLight (空)

//根据光设置 LED1 (打开或关闭)
if (zclSampleLight_OnOff =LIGHT_ON 且 NO =0)

while (!HAL_key_sw_1){
DATA_PIN = 0;
正向= 0;
向后= 1;

for (int i=i;<time; i++){ 0
ONBOARD_WAIT (10000);



正向= 0;
向后= 0;
DATA_PIN = 1;

否= 1;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您不能在 Z-Stack 中放置 while 循环、否则它会阻止所有内容。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    那么、代码将如何编写? 如何才能使电机运行直至按下 HAL_KEY_SW_1?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    因此我在 HandleKeys 中键入了代码、以便按钮在按下时停止电机(如下所示)、但如何使用它、以便在计时器耗尽时也可以停止电机? 例如:我按 HAL_KEY_SW_6启动电机、电机将在5秒后自动停止、除非我先按 HAL_KEY_SW_1。

    静态空 zclSampleLight_HandleKeys (字节移位、字节键)

    if ((键& HAL_KEY_SW_1)||(键& HAL_KEY_SW_2)){
    正向= 0;
    向后= 0;
    DATA_PIN = 1;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    此外、在按下 SW1时添加停止电机的代码。 当您在按下 SW6后启动电机时、可以启动一个5秒后的计时器事件以停止电机。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如何编写计时器事件的代码?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您可以使用以下伪代码来启动电机、并在触发 SW1后的5秒内安排计时器事件来停止电机。
    静态空 zclSampleLight_HandleKeys (字节移位、字节键)

    if ((键& HAL_KEY_SW_1)){
    //在此启动电机
    (笑声)
    //启动计时器事件
    OSAL_START_timerEx (....、5000);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    现在我的代码看起来像下面的代码,我想知道 osal_start_timerEx ()内部要放置哪些参数,该计时器的其余代码是什么? 计时器是我不知道如何执行的代码。

    IF (键和 HAL_KEY_SW_6)

     {   

      KeyPressCnt=0; //用于出厂复位

      OSAL_START_timerEx (zclSampleLight_TaskID、KEYHOLD_EVT、100);//用于恢复出厂设置

      zclSampleLight_OnOff = zclSampleLight_OnOff? Light_off:light_on; //告知电机应在 zcl_DisplayLight 中以哪种方式运行

      OSAL_START_timerEx (x、x、5000); //对于该计时器、我要使用哪些参数在5秒后自动停止电机? 此外、我还需要放置什么代码?

     }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    它就像您启动计时器 KEYHOLD_EVT 以及如何在事件循环中处理计时器一样。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    但我没有按下按钮。 我只按它。 那么、它是如何相同的呢?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    由于您不按住按钮,因此可以在“if ((键& HAL_key_sw_1)”中执行此操作。 无需启动 KEYHOLD_EVT。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    那么、我为 osal_start_timerEx (x、x、5000)放置什么呢?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    它就像 osal_start_timerEx (zclSampleLight_TaskID、turnoff 电机_EVT、5000);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    那么、TONLOFF_MOTOR_EVT 应该是什么值?

    e2e.ti.com/.../1663.zcl_5F00_samplelight.c

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

    uint16 zclSampleLight_event_loop (uint8 task_id、uint16事件)

    (笑声)
    if (事件和关闭电机_EVT)

    //在此关闭电机!
    (笑声)

    返回(事件^ turnoff_moto_EVT);

    (笑声)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我在事件循环和 osal_start_timerEx (zclSampleLight_taskID、turnoff motor_evt、5000)中放置了以下代码;在 HandlKeys 中、但一旦按下按钮、电机就会立即停止。 为什么电机没有时间移动然后停止呢? 我在下面的代码中设置一个断点、每次按下 HAL_KEY_SW_6、该断点始终会立即命中、这意味着当我按下按钮时电机停止。 如何解决此问题?

    if (事件和关闭电机_EVT)

    正向= 0;
    向后= 0;
    DATA_PIN = 1;

    返回(事件^ turnoff_moto_EVT);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果您将事件添加到监视窗口中、您会看到什么值的事件?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我主要得到值37376、但总的来说我得到了一些其他值、如54016和512。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尝试使用"#define Turnup_MOTOR_EVT 0x0400"而不是"#define Turnup_MOTOR_EVT 0x0200"来再次测试。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    不幸的是、这不起作用。 从未达到断点、代码也未停止电机。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能告诉我事件的价值吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我得到1024。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我得到1024
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我得到值1024
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能否随附最新代码?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    代码如下:

    e2e.ti.com/.../2287.zcl_5F00_samplelight.c

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    检查是否连续触发了"(KEY & HAL_KEY_SW_6)"。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我检查了、但没有。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    检查是否有任何将事件代码定义为0x0400的地方与 Turnoff 电机_EVT 重叠。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我找不到任何使用0x0400的其他内容。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能否再次详细说明您的问题? 按下按钮 SW6后、电机立即停止的问题是什么?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    目标是在既未按下 HAL_KEY_SW_1也未按下 HAL_KEY_SW_2的情况下使电机在5秒后停止。 您为使电机在5秒后停止而提供的代码不起作用。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在"if ((keys & HAL_key_sw_1)||(keys & HAL_key_sw_2)){...}"内设置断点 来查看在触发 SW6时是否命中。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我是这样做的、SW6不会触发其中的断点。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果您还在"if (events & turnoff_motor__evt){..}"内设置断点,则在触发 SW6时它是否立即命中?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果 turnoff_moto_EVT 0x0200、则为是、但如果 turnoff_moto_EVT 0x0400、则断点永远不会命中。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果您保持 Turnoff_motor_EVT 0x0400并检查"osal_start_timerEx (zclSampleLight_TaskID、turnoff_motor_EVT、5000);"的返回值、您会在返回值上看到什么?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如何检查返回值? 此外、只需检查以下代码是否正确?

    在事件循环中:
    #define TONLOFF_MOTOR_EVT 0x0400
    uint16 zclSampleLight_event_loop (uint8 task_id、uint16事件)

    if (事件和关断_MOTOR_EVT)

    正向= 0;
    向后= 0;
    DATA_PIN = 1;

    返回(事件^ Turnoff_moter_EVT);



    在 HandleKeys 中:
    静态空 zclSampleLight_HandleKeys (字节移位、字节键)

    if ((键& HAL_KEY_SW_1)||(键& HAL_KEY_SW_2)){
    正向= 0;
    向后= 0;
    DATA_PIN = 1;


    IF (键和 HAL_KEY_SW_6)

    OSAL_START_timerEx (zclSampleLight_TaskID、turnoff 电机_EVT、5000);
    KeyPressCnt=0;
    OSAL_START_timerEx (zclSampleLight_TaskID、KEYHOLD_EVT、100);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我在代码中看不到任何问题。 我还记得我已经向您展示了如何检查 osal_start_timerEx 的返回值。 无论如何、您必须声明如下所示的全局变量才能获得该变量:

    uint8 ret;
    (笑声)
    RET=osal_start_timerEx (zclSampleLight_TaskID、turnoff _motor_EVT、5000);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我得到一个值'\0'(0x00)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这意味着事件已正确安排。 它是否未达到"if (events & turnoff_motor_evt){...}" 5秒后?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我返回了几个步骤、修复了一些问题、现在可以正常工作。 谢谢。 但是、有时、当我按 HAL_KEY_SW_6启动按钮时、电机会立即停止。 为什么会这样、如何解决? (供参考、大部分时间都在工作)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尝试添加以下红线以在启动新的前一个计划的关闭电机 EVT。

    IF (键和 HAL_KEY_SW_6)

    OSAL_STOP_timerEx (zclSampleLight_TaskID、turnoff 电机_EVT);
    OSAL_START_timerEx (zclSampleLight_TaskID、turnoff 电机_EVT、5000);
    KeyPressCnt=0;
    OSAL_START_timerEx (zclSampleLight_TaskID、KEYHOLD_EVT、100);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我尝试过、但不幸的是、它没有解决问题。 我认为问题不在于停止先前的 TOOFF_MOTOR_EVT、因为之前的关闭电机已在5秒后停止电机。 这就是我第二次按下按钮时、电机立即停止、而不是等待5秒。 那么、您有什么建议呢?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在"if ((keys & HAL_key_sw_1)||(keys & HAL_key_sw_2))}{.."内设置断点 并查看它在立即停止时是否达到。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    确实如此。 为什么会这样呢? 如何解决此问题?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    显然、这是 HAL_KEY_SW_7 (我将其从2更改为7)。 下面是代码。 HAL_KEY_SW_7中可能存在什么问题?

    e2e.ti.com/.../2816.hal_5F00_key.c

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您应该检查 hal_key.c 以查看为什么它发送 HAL_key_sw_1或 HAL_key_sw_2而不触发它们。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我不断收到 有关配置为 P1.7的 HAL_KEY_SW_2_BIT 的错误消息。 它说"内部转换导致截断"。 该位的错误是什么、我已经做了一些测试、发现如果我将其更改为任何其他值、如0、HAL_KEY_SW_2不会 执行 halProcessKeyInterrupt ()、但 HAL_KEY_SW_6不会命中以下代码上的断点。 因此、HAL_KEY_SW_2和 HAL_KEY_SW_6的位值之间必须存在直接关系、这会导致问题、但我不知道原因。 您认为问题可能出在哪? 该位应该是什么值?

    if ((键& HAL_KEY_SW_2)||(键& HAL_KEY_SW_7))

    正向= 0;
    向后= 0;
    DATA_PIN = 1;

    e2e.ti.com/.../2313.hal_5F00_key.c

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

    在以下两条红线中设置一个断点、以检查它们是否已命中。

     如果(P1_7=0)

     {

      键|= HAL_KEY_SW_2;

     }

     如果(P1_6=0)

     {

      键|= HAL_KEY_SW_7;

     }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我是这样做的、有时会按键|= HAL_KEY_SW_2、但它不总是按键|= HAL_KEY_SW_6。 keys |= HAL_KEY_SW_7处的断点从未命中。