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.

[参考译文] CCS/MSP430G2533:在 MSP430G2553中通过 UART 发送 ADC10转换结果。

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/650102/ccs-msp430g2533-sending-adc10-conversion-results-through-uart-in-msp430g2553

器件型号:MSP430G2533
主题中讨论的其他器件:MSP430G2553

工具/软件:Code Composer Studio

大家好。

我正在使用 MSP430G2553 Launchpad 的 ADC10转换内部温度传感器并通过 UART 发送转换结果。

我使用 TeraTerm 读取 PC 上的 UART 数据、并将跳线切换至 HW 位置。

问题是 TeraTerm 上未显示数据。

这是我的代码、感谢您的宝贵支持。


//
//此程序使用带有 ADC10模块的 MSP430内部温度传感器
//
//使用 Code Composer Studio v6.2构建
//

#include
#include
#include



长 ADCDATA; //ADCDATA 变量、用于存储 ADC10MEM 中的 ADC 数据
长 tempInDeg;
字符串 Temp[]={};

//函数原型
void itoa (long unsigned int value、char* result、int base);
//void itoa();//函数原型
void UART_TX (char * TX_DATA);


void clock_init (){
     //时钟校准为1MHz -------------------------------------------------------
     DCOCTL = 0;//选择最低 DCOx 和 MODx 设置
     BCSCTL1 = CALBC1_1MHz;//设置 DCO
     DCOCTL = CALDCO_1MHz;


void GPIO_init(){
//尽管 P1.0和 P1.6已初始化,但不使用它们
   P1DIR |=0x41;
   P1OUT &=~ 0x41;

void ADC10_init(){

   // ADC 初始化

   ADC10CTL0 = SREF_1 + ADC10SHT_3 + REFON + ADC10ON + ADC10IE;//内部电压(VR+= VREF+和 VR-= VSS);SHT= 64*ADC10CLK;ref on;ADC10 on;启用中断
   ADC10CTL1 = INCH_10 + ADC10SSEL_2;//输入通道10-->内部温度传感器;MCLK
   _delay_cycles (50);


void UART_init(){
/*  
       //即使我尝试使用以下两行代码,它也不起作用
   P1DIR |= 0x02 + 0x04; //将 P1.1 + P1.2 UART 引脚设置为输出方向
   P1OUT &=~ 0x02 + 0x04; //清除 P1.1 + P1.2 UART 引脚
*
   //---- 设置 P1.1和 P1.2的 UART 功能--- //

     P1SEL |= BIT1 + BIT2; // P1.1 UCA0RXD 输入
     P1SEL2 |= BIT1 + BIT2; // P1.2 UCA0TXD 输出

   //------ 配置 UART (USCI_A0)--- //

   UCA0CTL1 = UCSSEL_2 + UCSWRST;// SMCLK;在进行任何更改之前软件复位(USCI_A0被禁用)

   //选择9600波特率
   UCA0BR0 = 104;    //从数据表表中删除了104 -
   UCA0BR1 = 0;       //-选择波特率=9600、clk = SMCLK
   UCA0MCTL = UCBRS_1;            数据表中的//调制值= 1

   UCA0CTL1 &=~Ω UCSWRST;            //清除 UCSWRST 以启用 USCI_A0

   ///-------- 使能中断--- //
   IE2 |= UCA0TXIE;                 //启用发送中断
  // IE2 |= UCA0RXIE;                 //启用接收 中断 //我们不需要此操作,因为我们只发送
   _BIS_SR (GIE);                    //启用全局中断


//主要功能---
void main (void)


   WDTCTL = WDTPW + WDTHOLD;                 //停止看门狗计时器

   //函数调用----------------
   clock_init();
   GPIO_init();
   ADC10_INIT();
   UART_INIT();

   _bis_SR_register (GIE);//全局中断使能

   while (1)
   {
      ADC10CTL0 |= ENC + ADC10SC;            //启用转换;采样和转换开始
      _bis_SR_register (CPUOFF);   //在 ADC 转换时转至 LPM_0
      ADCDATA = ADC10MEM;                //读取 ADC 值

      //使用公式 ADCDATA =(1024*(Vtemp/Vref)以度数转换为单位的温度
      tempInDeg =((ADCDcData - 673)* 423)/ 1024;
      //tempInDeg =((ADCDATA * 1500)/1024 - 986.6)/3.55;

      itoa (tempInDeg、stringTemp、10);//将 tempInDeg 转换为字符串

      // TeraTerm 上未显示以下数据
      UART_TX ("MSP430正在启动\n");
      UART_TX ("配置时钟正常\n");
      UART_TX ("温度为\n"\});
      UART_TX (stringTemp);
      _DELAY_CYCLES (10000);//延迟
      ADC10CTL0 &=~ENC; //停止转换

   }


//中断服务例程-------------------------------------------------------

#pragma vector= ADC10_vector
 _interrupt void ADC10_ISR (){
   _BIC_SR_REGISTER_ON_EXIT (CPUOFF); //退出 LPM_0

 }
#pragma vector = USCIAB0TX_vector
 _interrupt void 传输中断(void)
 {
 }

 //函数通过 UART 发送数据
 void UART_TX (char * TX_DATA)//定义接受指向数组的字符指针的函数
 {
     unsigned int i=0;
     while (TX_DATA[i])//通过数组递增、在字符串末尾查找空指针(0)
     {
         while (((UCA0STAT 和 UCBUSY));//如果线路 TX/RX 模块忙于处理数据则等待
         UCA0TXBUF = TX_DATA[i];//发送 UART 总线上 TX_DATA 数组的元素 I
         i++;//递增数组地址的变量
     }
 }

 // C 语言函数将整数转换为字符串
 void itoa (long unsigned int 值、char*结果、int base)
     {
       //检查底座是否有效
       if (base < 2 || base > 36){* result ='\0';}
       char* ptr =结果、*ptr1 =结果、tmp_char;
       int tmp_value;

       执行{
         tmp_value =值;
         值/=基值;
         * PTR++="zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz"[35 +(tmp_value - value * base)];
       } while (value);

       //应用负号
       如果(tmp_value < 0)*ptR++='-';
       *PTR-='\0';
       while (ptr1 < ptr){
         tmp_char =* ptr;
         *ptr--=*ptr1;
         *ptr1++= tmp_char;
       }

     }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    >IE2 |= UCA0TXIE; //启用发送中断

    将其删除、(对我来说)其他一切都将正常。 您的 Tx ISR 不会清除 TXIFG、因此您的程序会不断中断。

    您的非中断 Tx 过程看起来正常。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    嗯、我尝试过、但不幸的是、它仍然不起作用。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    啊、我错过了这个:

    >ADCDATA = ADC10MEM; //读取 ADC 值

    请将其移至 ISR。 这会清除 ADC IFG。 将 ADCDATA 声明为"易失性"、只是为了确保这一点。
    ----------------------------------------
    >字符串 Temp[]={};

    这是一个令人不安的问题、尽管我会想到另一个症状。 为其提供实际大小、例如

    字符串 Temp[12+1]={};
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我也尝试过这些、但它仍然不起作用。

    请注意:
    您提到了以下2行代码:
    ->ADCDATA = ADC10MEM;//读取 ADC 值
    ->char stringTemp[]={};

    我已经在一个类似的方案中与他们合作,该方案成功地成功地运作了,没有任何问题。

    对于我来说、我怀疑'UART_TX'和'itoa'函数无法正常工作。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    只需使用 sprintf()。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    可以解释更多吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    > ADC10CTL1 = INCH_10 + ADC10SSEL_2;//输入通道10-->内部温度传感器;MCLK

    在 LPM0中、MCLK 被关闭(另请参见 SLAU144J 图2-9)。 尝试 ssel=3 (SMCLK):

    > ADC10CTL1 = INCH_10 + ADC10SSEL_3;//输入通道10-->内部温度传感器;SMCLK

    我对 ADC10MEM 错了(参考 SLAU144J 22.2.110秒)。 例如、ADC12的工作方式不同。

    将多个字节放入一个1字节字符数组有时可能会起作用(偶然情况下)、但最终会导致问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    使用断点并每次跟踪一行问题。 然后,您将能够确认问题是否与 UART 或"itoa()"有关。