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.

[参考译文] MSP430FR6922:MSP430 FET 与控制器板断开连接时、计时器不会以1000Hz 的频率运行

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1163947/msp430fr6922-timer-is-not-operated-on-1000-hz-when-msp430-fet-is-disconnected-from-controller-board

器件型号:MSP430FR6922
主题中讨论的其他器件:MSP-FET

您好!

  我想在连续模式下运行计时器@1000Hz 频率、并在计时器中断中进行一些比较、并获取 AD7190 ADC 数据值。 我将 在单独的 while 环路中传输该 ADC 的值。 连接 MSP-FET 时、计时器中断工作正常、并将正确的数据传输到 RPI。 但是、在刷写 MCU 中的 CDE 并断开仿真器与 MCU 计时 器 ADC 的值后、不会改变。 而环路数据传输到 RPI、即 ADC 值。 但这些值是不变的、不会改变。

问题出在哪。 我随附了您的参考代码

#include "common.h"

int main(void)
{
   WDTCTL = WDTPW | WDTHOLD;                 // Stop WDT

   variable_Set_zero();
   pin_init();
   dev_init_16M();                           // Microcontroller set on 16MHz
   RPI_UART();
   Timer();
   SPI_INT();                                // SPI initialization
   AD7190_register_read();

   __enable_interrupt();                     // Re-enable all interrupts
   __bis_SR_register(GIE);                   // Enter LPM3, interrupts enabled


  while (1)
  {
    
     if(DelayStart==1)                       // For sample 1 send LC data after every 1 sec to tare the LC readings
      {
         // (DCO=MCLK=16MHZ )so,
         // Count/MCLK freq=Time
         // 16000000/16MHz=1sec
         __delay_cycles(16000000);                        // delay calculate on 16 MHz
         AD7190_CH1_setup();
        //while(!((P1IN&BIT7)==0)){}     // Wait until data ready
         CurrentLCValue=ReadData();                       // Read load cell data
         CurrentLCValue1=CurrentLCValue&0x7FFF;

         LongtoInt.LongData=CurrentLCValue;               // Split 3 byte data into single byte
         giTransmitBuffer[0]=LongtoInt.ByteSplit[1];
         giTransmitBuffer[1]=LongtoInt.ByteSplit[0];
         giTransmitBuffer[2]=0x00;

         for(i=0;i<3;i++)      // Upto array from start to CRC lenth
         {
             while(!(UCA0IFG&UCTXIFG));
             UCA0TXBUF =  giTransmitBuffer[i];
         }
      }

     if (DataStart==1)
     {
         __delay_cycles(16000);

         LongtoInt.LongData=CurrentLCValue;//LoadCellData is in 16 bit first 2 byte;
         giTransmitBuffer[0]=LongtoInt.ByteSplit[1];
         giTransmitBuffer[1]=LongtoInt.ByteSplit[0];
         giTransmitBuffer[2]=0x00;

         for(i=0;i<3;i++)      // upto array from start to CRC lenth
         {
             while(!(UCA0IFG&UCTXIFG));
             UCA0TXBUF =giTransmitBuffer[i];
         }
     }

     /*******************************Test Stop if overload+***************************/
    if (teststop==1)
     {
        //timer stop
        TA0CCTL0 &= ~CCIE;

        RTCCTL0_L &= ~RTCTEVIE;    //rtc disabled

        // relay off
        P7OUT &=~BIT0;

        teststop=0;
     }
  }
}

void send_start_command(void)
{
    giTransmitBuffer[0]=0xAA;
    giTransmitBuffer[1]=0xBB;
    giTransmitBuffer[2]=0xCC;
    giTransmitBuffer[3]=0xDD;
    giTransmitBuffer[4]=0xEE;
    giTransmitBuffer[5]=0xFF;

    for(i=0;i<6;i++)      // Upto array from start to CRC lenth
    {
        while(!(UCA0IFG&UCTXIFG));
        UCA0TXBUF =  giTransmitBuffer[i];
    }
}
/*
 * Timer.c
 *
 *  Created on: 09-Sep-2022
 *      Author: Admin
 */
#include "common.h"

void Timer(void)
{
    //Timer Period in Seconds = DIV x (TACCR0 + 1)/Input Clock in Hz
    //freq=1/timer period
    //TA0CCR0=(Input Clock in Hz/DIV*Freq)-1;
    //TA0CCTL0 = CCIE;                          // TACCR0 interrupt enabled
    TA0CCR0 = 4000;                             //(4MHz/4000=1000 Hz)
    TA0CTL = TASSEL__SMCLK | MC__CONTINUOUS;     // SMCLK, continuous mode

}

// Timer0_A0 interrupt service routine
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector = TIMER0_A0_VECTOR
__interrupt void TIMER0_A0_ISR (void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(TIMER0_A0_VECTOR))) TIMER0_A0_ISR (void)
#else
#error Compiler not supported!
#endif
{
      if(Data==1)
       {
           send_start_command();
           AD7190_CH1_setup();
           //while(!((P1IN&BIT7)==0)){}           // Wait until data ready
           CurrentLCValue=ReadData();             // Read load cell data
           DataStart=1;
       }

       Data=0;

       AD7190_CH1_setup();
       //while(!((P1IN&BIT7)==0)){}           // Wait until data ready
       CurrentLCValue=ReadData();             // Read load cell data
       CurrentLCValue3=CurrentLCValue&0x7FFF;

       if(CurrentLCValue3>=0x1F59)     // if 9F5961=10443105=9.567mV=675 psi (90 percent of 10.63 mV means 750 psi) is reached test stop
           //9F59&7FFF=0x1F59
         {
             Error[0]=0x10;
             Error[1]=0x10;
             Error[2]=0xAA;
             teststop=1;
         }

       TA0CCR0 += 4000;                         // Add Offset to TA0CCR0
}

  

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

    您好!

    MSP430的调试器具有很强的侵入性、会使计时偏斜、有时会隐藏代码中的竞态条件。 它还不允许您真正降低到最低的 LPM。 以这种方式进行调试时、我建议在"自由运行"模式下运行、断开调试器接口、使器件像未连接调试器一样运行。  我还看到您正在将 LPM 设置为 LPM3、同时让计时器通过 SMCLK 计时。 (至少这是您的评论所说的内容、尽管我看不到您实际去 LPM 的位置。)  在 LPM3中 SMCLK 被关闭、所以 在这种情况下会发生/将会发生几件事情。 计时器不会运行、因为其源时钟已关闭。 一旦您尝试从 LPM3唤醒、您不仅会获得 LPM3唤醒代价、还会获得 SMCLK 启动代价。