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.

[参考译文] MSP430FR2633:暂时关闭 appHandler

Guru**** 1643550 points
Other Parts Discussed in Thread: MSP430FR2633, CAPTIVATE-FR2633
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1220961/msp430fr2633-temporarily-turn-off-apphandler

器件型号:MSP430FR2633
主题中讨论的其他器件:MSPWARE、、、 CAPTIVATE-FR2633

您好!  

当从 Proximity sense 触发 Capt_appHandler ()时,我尝试执行一个简单的函数,否则是 appSleep。

该函数执行大约需要几秒钟、但在  移除接近触发器后、它会很好地重复执行。  我假设在函数执行完成前必须关闭接近传感器。  

使用此链接中的示例: https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/811708/msp430fr2633-don-t-call-capt_apphandler-for-500ms
我在 CAPT_appHandler ()=true 后立即停止并清除计时器,执行该函数,然后在 if-true 循环结束前重新启动计时器。

但是、该功能仍会多次出现。  

我应该如何正确地停止 appHandler、执行命令、然后在不执行多次的情况下恢复 appHandler?

谢谢!

汤姆

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

    您好、Tom、

    我不明白你对这个线程的观点,你想禁用  CAPT_appHandler ()函数?  

    只要使用 MAP_CAPT_STOPTimer()就可以了。

    谢谢!

    此致

    Johnson

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

    尊敬的 Johnson:  

    感谢您的答复。  很抱歉,如果我的问题不清楚,请允许我详细说明。

    下面是以"CAPT_AppStart ()"(  之前只是引脚定义)开始的代码:  

     CAPT_AppStart ();

      while (1)
      {

        if (CAPT_appHandler ()==true)//触发接近检测
         {
          MAP_CAPT_STOPTimer();//暂时停止计时器
          MAP_CAPT_clearTimer();
          

          //闪烁 LED 两次

           P1OUT |= BIT7;                        //将 P1.7 LED 设置为打开


           __ delay_cycles (30000000);             //延迟


          P1OUT &=~BIT7;                      //清除 P1.7 LED 关闭

          __ delay_cycles (30000000);             //延迟


           P1OUT |= BIT7;                        //将 P1.7 LED 设置为打开


           __ delay_cycles (30000000);             //延迟


          P1OUT &=~BIT7;                      //清除 P1.7 LED 关闭
           

          MAP_CAPT_startTimer();                //恢复扫描仪

          }


        方案

          {
          P1OUT &=~BIT7;                       //清除 P1.7 LED
          }


        ___ no_operation();


        CAPT_appSleep ();

      }  

    如您所见、此功能非常简单-只要发生接近检测、该功能就只需使 LED 闪烁2次。

    不过、当我引入一个物体以立即触发接近时、使 LED 闪烁2次的功能会重复多次。  

    顺序如下:  

    1)在附近引入物体

    2) LED 亮起

    3)移除附近的物体

    4) LED 关闭、但即使没有物体靠近、LED 也会继续闪烁多次。

    "MAP_CAPT_..." 添加了命令以尝试使 LED 仅闪烁 一次、不会重复闪烁一次。 但它仍会发生多次。

    解决这种现象的最佳方法是什么?  如果您需要更多信息、请告诉我。

    谢谢!

    汤姆

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

    您好、Tom、

    抱歉、我漏掉了这个案例、您能在此处共享代码吗? 当我回到办公室时,我可以做一些测试,并尝试在我身边找到根本原因(五月4)

    谢谢!

    此致

    Johnson

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

    尊敬的 Johnson:

    没问题。  

    我已在上面分享了我的代码、但我要再次与整个 main.c 分享

    #include            //通用 MSP430器件包括
    #include "driverlib.h"          // MSPWare 驱动程序库
    #include "captistate.h"          // CapTIvate 触控软件库
    #include "CAPT_App.h"           // CapTIvate 应用程序代码
    #include "CAPT_BSP.h"           // CapTIvate EVM 板级支持包


    空 main (void)

      WDTCTL = WDTPW | WDTHOLD;
      bsp_configureMCU ();
      __ bis_SR_register (GIE);

      //引脚初始化
      //-------------------------------------------------------------------------------------------------------------------------------------
      P1DIR |= BIT7;       //将 P1.7 - LED_EN 设置为输出方向
      P1OUT &=~BIT7;      // P1.7 LED 关闭

      //
      //启动 CapTIvate 应用程序
      //
      CAPT_AppStart ();

      while (1)
      {

        if (CAPT_appHandler ()=true)
         {

          MAP_CAPT_clearTimer();

          P1OUT |= BIT7; //将 P1.7 LED 设置为打开

          __ delay_cycles (30000000);             //延迟

          P1OUT &=~BIT7;//清除 P1.7 LED 关闭

          MAP_CAPT_STOPTimer();

          map_CAPT_startTimer();//恢复扫描仪

          }


        方案
          P1OUT &=~BIT7;//清除 P1.7 LED

        ___ no_operation();


        CAPT_appSleep ();

      }//结束背景循环
    }//结束 main()

    我认为这个问题与延迟线"_delay_cycles (30000000)"有关。   

    我将板连接到 CapTIvate 程序、并附上了视频。  

    我将阈值设置为100。 如您所见、没有延迟、灵敏度就可以正常工作。  

    我认为、在出现延迟时、电容无法完全复位、因此它会再次触发事件。

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

    e2e.ti.com/.../Delay.mp4e2e.ti.com/.../No_5F00_Delay.mp4

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

    "延迟"视频是我仅触发传感器一次。 "无延迟"视频是我触发传感器3次

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

    尊敬的 Shiwei:

    您能告诉我您使用了哪种硬件吗? 当我返回到 Officr(May.4)时,我可以在我身边尝试您的代码。

    谢谢!

    此致

    Johnson

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

    尊敬的 Johnson:  

    这可能不是很有用、但我将定制 PCBA 与 MSP430FR2633芯片配合使用。  
    请告诉我您还需要哪些信息。

    与此同时、我将了解能否在 CAPTIVATE-FR2633开发套件上重现同样的现象并共享该代码。  

    谢谢。

    汤姆

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

    尊敬的 Johnson:  

    我可以使用上述相同代码在 CAPTIVATE-FR2633开发套件上重新生成相同现象。  

    以下是我的 CAPT_UserConfig.c 文件的代码(所有其他内容在默认情况下保持不变)。   我将 CAP3.1用作传感器引脚。


    //*****
    // CAPT_UserConfig.c
    //
    //版本1.83.00.05
    // 2020年5月15日发布
    //
    //*****

    //*****
    //
    //注释:这是一个自动生成的源代码文件! 进行通信
    //设计中心自动生成用户配置文件
    //基于创建的传感器布局。
    //
    //如果您选择,对该文件所做的更改将被覆盖
    //在设计中心的"生成源代码"下面的"更新现有项目"。
    //
    //为了避免干扰代码生成过程,请保留所有的应用程序
    //该文件外部的代码。
    //
    //*****

    #include "CAPT_UserConfig.h"

    //*****
    //
    //! CapTIvate 元素定义
    //! 此应用中的所有元素定义如下。
    //! 每个元件有3个元件:
    //! 1)原始计数数组(每个频率一个索引、 已扫描)(uint16_t)
    //! 2)一个调谐数组(每个频率一个索引。 已扫描)(tCapTIvateElementTuning)
    //! 3)元素结构(tElement)
    //
    //*****
    //传感器:BTN00,元件:E00
    uint16_t BTN00_E00_RawCnts[CAPT_SEL_FREQ_CNT];
    tCapTIvateElementTuning BTN00_E00_Tuning [CAPT_SEL_FREQ_CNT];
    特征 BTN00_E00 =

    .ui8RxPin = 1、  
    .ui8RxBlock = 3、
    .ui8TouchThreshold = 10、  
    .pRawCount = BTN00_E00_RawCnts、
    .pTuning = BTN00_E00_Tuning、
    };


    //*****
    //
    //! CapTIvate 时间周期定义
    //! 此应用中的所有时间周期定义如下。 限制是多少
    //! 在一个时隙中并联测量的一组元件。
    //! 每个周期有2个组成部分:
    //! 1)指向成员元素的元素指针数组(tElement*)
    //! 2)循环结构(tcycle)
    //
    //*****
    //时间周期:BTN00_C00
    tElement* BTN00_C00_Elements[1]=

    &BTN00_E00、
    };
    tCycle BTN00_C00 =

    .ui8NrOfElements = 1、
    .pElements = BTN00_C00_ELEMENTS、
    };


    //*****
    //
    //! CapTIvate 传感器定义
    //! 此应用中的所有传感器定义如下。 程度
    //! 利用原始测量数据来创建的一组时间周期
    //! 抽象传感器类型、例如按钮、滑块、滚轮或近端传感器。
    //! 每个传感器有3个组件:
    //! 1)指向成员时间周期(tcycle*)的周期指针数组
    //! 2) 2)特定于传感器的参数结构(tGenericSensorParams)
    //! 3) 3)传感器结构(TSENSOR)
    //
    //*****
    //传感器:BTN00
    const tCycle * BTN00_cycles [1]=

    &BTN00_C00、
    };

    tButtonSensorParams BTN00_Params;
    TSENSOR BTN00 =

    //基本属性
    .TypeOfSensor = eButtonGroup、
    .SensingMethod = eSelf、
    .DirectionOfInterest = eDOIDown、
    .pvCallback = NULL、
    .ui8NrOfCycles = 1、
    .pCycle = BTN00_CYCLES、
    .pSensorParams =(tGenericSensorParams*)&BTN00_Params、
    //转换控制参数
    .ui16ConversionCount = 500、
    .ui16ConversionGain = 100、
    .ui8FreqDiv = 2、
    .ui8ChargeLength = 0、
    .ui8TransferLength = 0、
    .bModEnable = false、
    .ui8BiasControl = 3、
    .bCsDischarge = true、
    .bLpmControl = false、
    .ui8InputSyncControl = 0、
    .bTimerSyncControl = false、
    .bIdleState = true、
    //调整参数
    .ui16ProxThreshold = 10、  
    .ui16NegativeTouchThreshold = 30、  
    .ui16ErrorThreshold = 8191、
    .ui16TimeoutThreshold = 65535、
    .ProxDbThreshold.DbIn = 1、
    .ProxDbThreshold.DbOut = 0、
    .TouchDbThreshold.DbIn = 1、
    .TouchDbThreshold.DbOut = 0、
    .bCountFilterEnable = true、
    .ui8CntBeta = 1、
    .bSensorHalt = false、
    .bPTSensorHalt = true、
    .bPTElementHalt = true、
    .ui8LTABaBeta = 7、
    .bReCalibrateEnable = true、
    };


    #if (CAPT_AECUTED_NOISE_TESSION_ENABE==true)
    //*****
    //
    //! \var g_EMCConfig
    //! 此结构存储此应用的 EMC 配置。
    //
    //*****
    const tEMCConfig g_EMCConfig =

    //转换样式
    .selfModeConversionStyle = CAPT_self_mode_conversion_style、
    .projModeConversionStyle = CAPT_PROJ_MODE_CONVERSION_Style、

    //过采样样式
    .selfModeOversamplingStyle = CAPT_SELF_MODE_OVERSAMPLING_Style
    .projModeOversamplingStyle = CAPT_PROJ_MODE_OVERSAMPLING_Style

    //抖动滤波器启用
    .bJitterFilterEnable = true、

    //噪声阈值和校准噪声限制
    .ui8NoiseThreshold = CAPT_NOISE_THRESHOLD、
    .ui16CalibrationNoiseLimit = CAPT_CALIBRATION_NOISE_LIMIT、
    .ui8CalibrationTestSampleSize = 8、

    //动态阈值调整参数
    .bEnableDynamicThresholdAdjustment = CAPT_DYNAMIC 阈值调整、
    .ui8MaxRelThreshhAdj = 76、
    .ui8NoiseLevelFilterEntryThresh = 40、
    .ui8NoiseLevelFilterExitThresh = 0、
    .ui8NoiseLevelFilterDown = 6、
    .ui8NoiseLevelFilterUp = 1、
    coeffA =_IQ31 (0.0065)、
    coeffB =_IQ31 (0.050)
    };
    #endif

    //*****
    //
    //! \var g_pCapTIvateSensorArray
    //! 此数组允许对任意进行索引访问
    //! 传感器的配置。
    //
    //*****
    TSENSOR* g_pCapTIvateSensorArray[CAPT_SENSOR_COUNT]=

    &BTN00、
    };


    //*****
    //
    //! \var g_uiApp
    //! 此结构存储此应用的全局设置。
    //
    //*****
    tCapTIvateApplication g_uiApp =

    .state = eUIActive、
    .pSensorList =&g_pCaptivate SensorArray [0],
    .ui8NrOfSensors = CAPT_SENSOR_COUNT、
    .ui8AppLPM = CAPT_LOW_POWER_MODE、
    .bElementDataTxEnable = true、
    .bSensorDataTxEnable = true、
    .ui16ActiveModeScanPeriod = 33、
    .ui16WakeOnProxModeScanPeriod = 100、
    .ui16InactivityTimeout = 32、
    .ui8WakeupInterval = 5、
    };

    如果您有任何其他需要、请告诉我、再次感谢您的帮助。

    汤姆

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

    您好、Tom、

    好了、我会测试您的代码、很快回来。

    谢谢!

    此致

    Johnson

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

    尊敬的 Johnson:  

    非常感谢、我期待收到您的回复!

    我在开发套件 J10的 CAP3.1端口中使用了实心22AWG 导线、 我再次尝试避免 事件的重复发生(每个触发只发生1次)。 如果您有任何其他需要、请告诉我。

    谢谢。

    汤姆

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

    尊敬的 Shiwei:

    我找到了根本原因、这是电容滤波器功能导致的:

    请尝试更改以下参数并重新测试:
    1:禁用计数器滤波器功能。

    2:将 Threshold.DbIn 和 Threshold.DbOut 更改为0。

    我做了一些测试,在改变了这两个内容后,功能是正常的,附加我的测试代码:

    void main(void)
    {
    	//
    	// Initialize the MCU
    	// BSP_configureMCU() sets up the device IO and clocking
    	// The global interrupt enable is set to allow peripherals
    	// to wake the MCU.
    	//
    	WDTCTL = WDTPW | WDTHOLD;
    	BSP_configureMCU();
    	__bis_SR_register(GIE);
    
    	//
    	// Start the CapTIvate application
    	//
    	CAPT_appStart();
    
    	//
    	// Background Loop
    	//
    	while(1)
    	{
    		//
    		// Run the captivate application handler.
    		// Set LED1 while the app handler is running,
    		// and set LED2 if proximity is detected
    		// on any sensor.
    		//
    		LED1_ON;
    		if(CAPT_appHandler()==true)
            {
                MAP_CAPT_stopTimer();
                MAP_CAPT_clearTimer();
    
                LED2_ON;
                __delay_cycles(30000000);
                LED2_OFF;
                __delay_cycles(30000000);
                LED2_ON;
                __delay_cycles(30000000);
                LED2_OFF;
                __delay_cycles(30000000);
    
                MAP_CAPT_startTimer();
            }
    		else
    			LED2_OFF;
    		LED1_OFF;
    		
    		//
    		// This is a great place to add in any 
    		// background application code.
    		//
    		__no_operation();
    
    		//
    		// End of background loop iteration
    		// Go to sleep if there is nothing left to do
    		//
    		CAPT_appSleep();
    		
    	} // End background loop
    } // End main()

    谢谢!

    此致

    Johnson

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

    尊敬的 Johnson:  

    这确实解决了问题,非常感谢!

    汤姆