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.

[参考译文] MSP430FR58671:ADC12通道序列问题

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1405528/msp430fr58671-adc12-sequence-of-channels-issue

器件型号:MSP430FR58671

工具与软件:

ADC 读取通道序列出现问题。

我有一个我正在读取的8x8像素阵列。 所有像素均已打开、可进行故障排除。 使各个像素接地、以验证 ROIC 指向的正确存储器位置。 我有4个16:1多路复用器馈送到4个不同的 ADC 通道。 因此、多路复用器将馈送到 ADC0、多路复用器馈送到 ADC1、多路复用器馈送到 ADC2、多路复用器馈送到 ADC3。 for 环路计数从0到15、并输出到端口 P3上的4个引脚、以设置多路复用器的开关。 在中断期间、我首先读取 Mem0、最后读取 Mem3。  当我将 Mux4上的最后一个通道(通道16)接地时会出现问题。 问题是它锁定了。 如果我将 for 环路计数器更改为在14 (而不是15)结束、当 I 接地 Mux4的通道15和接地通道16不起作用时、就会发生锁定。

uint16_t *ROIC[65];
uint16_t array[8][8];
uint16_t Color_Array[64];
unsigned int count,i,Row,Column;
void     matrix(void);
unsigned long counter;
unsigned long Color = 0xFFL;

int main(void)
{
	WDTCTL = WDTPW | WDTHOLD;	// stop watchdog timer

      // Setup port pins
      P4DIR |= 0x40;                  // Set P4.6 to output direction -  LED
      P3DIR |= BIT4;                    // Set P3.4 to output direction - A0
      P3DIR |= BIT5;                    // Set P3.5 to output direction - A1
      P3DIR |= BIT6;                    // Set P3.6 to output direction - A2
      P3DIR |= BIT7;                    // Set P3.7 to output direction - A3
      P1SEL1 |= BIT0 | BIT1 | BIT2 | BIT3 | BIT4 | BIT5;
      P1SEL0 |= BIT0 | BIT1 | BIT2 | BIT3 | BIT4 | BIT5;

	  PM5CTL0 &= ~LOCKLPM5;

	  // Clock System Setup
	  CSCTL0_H = CSKEY >> 8;                    // Unlock CS registers
	  CSCTL1 = DCOFSEL_6;                       // Set DCO to 8MHz
	  CSCTL1 &= ~DCORSEL;
	  CSCTL2 = SELA__VLOCLK | SELS__DCOCLK | SELM__DCOCLK;
	  CSCTL3 = DIVA__1 | DIVS__1 | DIVM__1;     // Set all dividers
	  CSCTL4 &= ~LFXTOFF;                       // Enable LFXT1
	  CSCTL0_H = 0;                             // Lock CS registers

	  // ADC Setup
	  ADC12CTL0 = ADC12SHT0_2 | ADC12ON | ADC12MSC;
	  ADC12CTL1 |= ADC12SHP | ADC12CONSEQ_1;// | ADC12SSEL1;
	  ADC12CTL2 |= ADC12RES_2;
	  ADC12MCTL0 |= ADC12INCH_0;
      ADC12MCTL1 |= ADC12INCH_1;
      ADC12MCTL2 |= ADC12INCH_2;
      ADC12MCTL3 |= ADC12INCH_3 | ADC12EOS;
      ADC12IER0 |= ADC12IE3;                     // Interrupt MEM3
      ADC12CTL0 |= ADC12ENC;// | ADC12SC;                    // Enable conversions

	  ST7735_if_init();
	  ST7735_display_init();
	  matrix();
	  draw(0, 0, 128, 128, 0xFFFFFFL); //0L


	  drawimage(0,0,128,128,0xFFFFFFL);      // Display Srico image

	 // initialize Color_Array to one color
	  for (i = 65; i > 0; i--)
	      Color_Array[i-1] = 0xF00F;

  	while(1)
	    {
        P4OUT ^= BIT6;                // Toggle LED

	    drawMatrix(0,0,128,128,Color_Array);

	    for(i = 0; i < 16; i++)
	        {
	                count = i;
	                count = count << 4;        // Rotate left 4 bits
	                P3OUT = count;
	                counter = i * 4;
	                ADC12CTL0 |= ADC12ENC | ADC12SC;                    // Enable conversions
	                __bis_SR_register(GIE);
                   __no_operation(); // For debug only
   	        }

	          //adjust array color based on voltage level
	          Row = 7;
	          Column = 7;
	          for (i = 64; i > 0; i--)
	          {
	           //Temp1 = array[i];

                  if (array[Row][Column] >= 0xA00)
                      Color_Array[i-1] = 0xFF00;
                  if (array[Row][Column] < 0x0A00)
                      Color_Array[i-1] = 0xFFFF;
                  if (Column == 0)
                  {
                      Column = 8;
                      Row = Row - 1;
                  }
                  Column = Column - 1;

 	          }
	          __no_operation(); // For debug only
    }
	

}

#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector = ADC12_VECTOR
__interrupt void ADC12_ISR(void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(ADC12_VECTOR))) ADC12_ISR (void)
#else
#error Compiler not supported!
#endif
{
 switch (__even_in_range(ADC12IV, ADC12IV_ADC12RDYIFG))
 {
 case ADC12IV_ADC12IFG3: 

             *ROIC[counter+1] = ADC12MEM0;
             *ROIC[counter+2] = ADC12MEM1;
             *ROIC[counter+3] = ADC12MEM2;
             *ROIC[counter+4] = ADC12MEM3;

             ADC12CTL0 &=~ADC12SC;                // For sequence-of-Channels mode, ADC12SC must be cleared by software after each sequence to trigger another sequence

             __bic_SR_register_on_exit(GIE); // Exit CPU, clear interrupts


 break;
 default: break;
 }
}

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

    > __ bis_SR_register(GIE );

    我怀疑您是指:

    > __ bis_SR_register (LPM0_bits | GIE); //睡眠直到完成

    类似地:

    > ___ bic_SR_register_on_exit (GIE);//退出 CPU、清除中断

    怎样的

    > ___ bic_SR_register_on_exit (LPM0_BITS);//唤醒 CPU (main)、清除中断

    ---

    根据编码、ADC 被重复/快速触发(ADC12SC)、这可能会超过勘误表 ADC42 [请参阅勘误表(SLAZ603Z)、第5页]、更不用说没有收集正确的测量数据了。

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

    我也尝试过,它没有解决它。 代码如下

    while(1)
    	    {
            P4OUT ^= BIT6;                // Toggle LED
    
    	    drawMatrix(0,0,128,128,Color_Array);
    
    	    for(i = 0; i < 16; i++)
    	        {
    	                count = i;
    	                count = count << 4;        // Rotate left 4 bits
    	                P3OUT = count;
    	                counter = i * 4;
                        while(ADC12CTL1 & ADC12BUSY);
    
    	                ADC12CTL0 |= ADC12ENC | ADC12SC;                    // Enable conversions
             	         __bis_SR_register(LPM0_bits | GIE);
    	                 __no_operation(); // For debug only
       	        }
    
    	          //adjust array color based on voltage level
    	          Row = 7;
    	          Column = 7;
    	          for (i = 64; i > 0; i--)
    	          {
    	           //Temp1 = array[i];
    
                      if (array[Row][Column] >= 0xA00)
                          Color_Array[i-1] = 0xFF00;
                      if (array[Row][Column] < 0x0A00)
                          Color_Array[i-1] = 0xFFFF;
                      if (Column == 0)
                      {
                          Column = 8;
                          Row = Row - 1;
                      }
                      Column = Column - 1;
    
     	          }
    	          __no_operation(); // For debug only
        }
    	
    
    }
    
    #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
    #pragma vector = ADC12_VECTOR
    __interrupt void ADC12_ISR(void)
    #elif defined(__GNUC__)
    void __attribute__ ((interrupt(ADC12_VECTOR))) ADC12_ISR (void)
    #else
    #error Compiler not supported!
    #endif
    {
     switch (__even_in_range(ADC12IV, ADC12IV_ADC12RDYIFG))
     {
     case ADC12IV_ADC12IFG3:
    
                 *ROIC[counter+1] = ADC12MEM0;
                 *ROIC[counter+2] = ADC12MEM1;
                 *ROIC[counter+3] = ADC12MEM2;
                 *ROIC[counter+4] = ADC12MEM3;
    
                 ADC12CTL0 &=~ADC12SC;
    
                 __bic_SR_register_on_exit(LPM0_bits); // Exit CPU, clear interrupts
    
    
     break;
     default: break;
     }
    }

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

    您知道它锁定在何处的确切程度如何? 也许您的描述可以重新措辞"在最终采样期间或之后的某个时间"、这可能意味着以下任何地方。

    我看不到 ROIC[](指针数组)被初始化的位置;它们仍然是 NULL 吗? 对于这种情况、样本如何到达数组[]?

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

    Bruce、  

    这是一个有效点、我不知道它锁定的确切点。 我将看看我能否把它弄明白。  

    至于 ROIC 初始化、我有一个对其进行设置的函数。 在对 ADC 进行测试之前、我已验证它是否正常工作并指向阵列中的正确位置。 我没有列入、因为我认为它与目前的问题无关。

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

    Bruce、

    它现在无需切换 LED (P4位6)。 如果 LED 亮起、它将锁定、如果熄灭、它将工作正常。 我还需要执行一些故障排除。

    感谢您的帮助。