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.

[参考译文] MSP430G2553:看门狗定时器停止 ADC 转换

Guru**** 2553260 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/833889/msp430g2553-watchdog-timer-stops-the-adc-conversion

器件型号:MSP430G2553

您好!

在看门狗计时器到期后、ADC 停止工作、这是一个难题。 代码的所有其他部分工作正常、但 ADC 读出0。 但在复位电源后、ADC 开始工作。 此外、如果看门狗计时器再次过期、则 ADC 开始工作。

这可能是什么原因?

谢谢

Nitish

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

    你(们)好,尼蒂什

    WDT 只能生成一个 PUC (上电清零)信号。 它与 POR (上电复位)不同。

    当您重置设备时,ADC 可能会转换新数据并正常工作。

    但 PUC 可能会清除 ADCMEM 寄存器、因此您可能会发现 ADC 读数为0。

    希望这对您有所帮助。

    此致

    Junkai

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

    你(们)好

    我知道它会擦除 ADCMEM、但一旦要求它执行 ADC 转换、它应该再次用数据填充它。 但是、即使在10-15分钟后、我也看不到 ADC 读数不是0。 但是、由于相同的错误、如果我使看门狗计时器再次过期、那么 ADC 会再次开始读取实际值。

    这可能是什么原因?

    谢谢

    Nitish

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

    你(们)好,尼蒂什

    您是指首次 WDT PUC ADC 读为0 (您是指 ADC 未转换)、WDT PCU 再次出现 ADC 工作正常?

    能否附上您的代码? 我可以检查是否 有任何问题。

    谢谢

    此致

    Junkai

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

    您好!

    我的意思是 ADC 只是停止、只读取缓冲寄存器中的0x00、通过 DMA 存储 ADC 结果。 在初始化 ADC 之前、我通过设置 ADC10SA = 0x00来解决这个问题。 因此、现在只要看门狗定时器到期、ADC10SA = 0就是在再次初始化 ADC 之前要执行的第一条语句(因为代码在看门狗到期后从开始重新启动)、并且它在魔术上开始工作。

    此外、正确的做法是将 ADC10SA = 0作为默认值设置为0x0200、并且在初始化部分中、我将其指向其他存储器位置。 或者、我应该避免写入0x00、而只写入闪存结束的存储器地址?

    谢谢

    Nitish

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

    您好、Nitish、

     发布您的计划是否方便? 还是发送私人邮件? 因此我们可以 分析您描述的问题、这个问题似乎是通过魔术解决的、但是如果 我们没有找到根本原因、您可能会遇到其他问题。

    此致

    Johnson

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这是我的代码的一部分。 如果 P1.0引脚被拖至3.3V 的高电平、那么它进入无限循环、并且看门狗定时器到期。 您将发现 ADC 停止工作。 但是、如果您从 ADC10SA = 0中删除注释、那么即使在看门狗过期后、ADC 也会继续工作。 

    #include /** * main.c */ static int ADCbuf[4]; /* ADC 读数数数数数组*/ 静态 int 值[4]; 静态 int i = 0; void MON_Init (void); void GET_ADC_Val (void); void main (void) { WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器 /*初始化 MCU */ MON_Init (); _BIS_SR (GIE); /*启用中断(需要 ADC 操作)*/ WDTCTL =(WDTPW + WDTCNTCL + 1); for (;;) { get_adc_Val (); if (values[3]>=900) { while (1); } WDTCTL =(WDTPW + WDTCNTCL + 1); } }void MON_Init (void) { DCOCTL = CALDCO_12MHz; BCSCTL1 = CALBC1_12MHz; BCSCTL2 = 0x00; //ADC10SA = 0; ADC10CTL0 &=~ENC; ADC10AE0 |= 0x0F; ADC10CTL0 = SREF_0|ADC10SHT1|ADC10SR|MSC|ADC10ON; ADC10CTL1 = INCH_3|ADC10DIV_0|ADC10SSEL_3|CONSEQ_1; ADC10DTC0 = ADC10CT; ADC10DTC1 = 0x04; ADC10SA =(无符号) ADCbuf; ADC10CTL0 |= ENC + ADC10SC; while (ADC10CTL1和 ADC10BUSY) {;} } void GET_ADC_Val (void) { ADC10CTL0 |=(ENC + ADC10SC); while (ADC10CTL1和 ADC10BUSY) {;} for (i=0;i<4;i++) { values[i]= ADCbuf[i]; } }

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

    您好、Nitish、

    我对您的代码做了一些修改、您可以对其进行实验。

    #include 
    
    /**
    * main.c
    */
    static int ADCbuf[4]; /* ADC 读数数数数数组*/
    静态 int 值[4];
    静态 int i = 0;
    void MON_Init (void);
    void GET_ADC_Val (void);
    
    void main (void)
    {
    WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
    /*初始化 MCU */
    MON_Init();
    _BIS_SR (GIE); /*启用中断(需要 ADC 操作)*/
    WDTCTL =(WDTPW + WDTCNTCL + 1);
    
    for (;;)
    {
    GET_ADC_Val ();
    // if (values[3]>=900)
    // {
    // while (1);
    //}
    WDTCTL =(WDTPW + WDTCNTCL + 1);
    }
    
    }
    
    void MON_Init(void){
    
    DCOCTL = CALDCO_12MHz;
    BCSCTL1 = CALBC1_12MHz;
    BCSCTL2 = 0x00;
    
    //ADC10SA = 0;
    ADC10AE0 |= 0x0F;
    ADC10CTL0 = SREF_0|ADC10SHT1|ADC10SR|MSC|ADC10ON;
    ADC10CTL1 = INCH_3|ADC10DIV_0|ADC10SSEL_3|CONSEQ_1;
    
    ADC10DTC0 = ADC10CT;
    ADC10DTC1 = 0x04;
    
    while (ADC10CTL1和 ADC10BUSY)
    {;}
    
    }
    
    void GET_ADC_Val (void)
    {
    ADC10CTL0 &=~ENC;
    while (ADC10CTL1 & ADC10BUSY);
    ADC10SA =(无符号) ADCbuf;
    ADC10CTL0 |= ENC + ADC10SC;
    
    for (i=0;i<4;i++)
    {
    values[i]= ADCbuf[i];
    }
    }
    

    此致

    Johnson

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

    您好、Nitish、

    我已经有六天没有听到您的声音,因此我假设您能够解决您的问题。 如果情况并非如此,请单击“这无法解决我的问题”按钮,并使用更多信息回复此主题。 如果此主题锁定、请单击"提出相关问题"按钮、然后在新主题中描述您的问题的当前状态以及您可能需要帮助我们帮助解决您的问题的任何其他详细信息。

    此致、

    Johnson