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/MSP430L092:如何读取传感器值?

Guru**** 2538950 points
Other Parts Discussed in Thread: MSP430L092, MSP430G2553, MSP430G2402

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/582704/ccs-msp430l092-how-can-i-read-my-sensor-value

部件号:MSP430L092
主题中讨论的其他部件: MSP430G2553MSP430G2402

工具/软件:Code Composer Studio

我有一个关于msp430g2553的代码用于ADC模拟读取,但我想使用msp430l092来制作一个项目,因此当我尝试使用与g2553相关的代码时,我遇到了一个问题。 此代码与l092冲突。 如何创建用于读取模拟传感器值(光电二极管)的代码? 有人能给我一个代码吗? 此外,我意识到l092没有UART,因此无法在控制台终端上看到我的传感器值。

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

    您好,

    您是否查看 了MSP430Ware中的示例? 以下示例显示了如何在MSP430L092上正确使用ADC。 关于“查看”ADC结果,您可以在CCS中使用调试器和断点来查看相关点的代码并查看变量的值。 请看一下这些示例,如果您需要更多帮助,请告诉我。

    此致,  

    Caleb Overbay

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我研究了所有示例项目,但找不到msp430l092的MCU系列。
    MSP430驱动程序库(MSP430F5xx_6xx系列)
    MSP430驱动程序库(MSP430FR57xx系列)
    MSP430驱动程序库(MSP430FR5xx_6xx系列)
    MSP430驱动程序库(MSP430i2xx系列)
    只有应用说明。 我没有任何有用的代码或示例项目
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您可以 在此处下载代码示例。 还包括ADC的示例:

    • msp430x09x_apool_adc_01.c      APOOL_ADC,无错误补偿的转换,A0样例
    • msp430x09x_apool_ADC_02.c      APOOL_ADC,具有超速补偿的转换,样品A0
    • msp430x09x_apool_ADC_03.c      APOOL_ADC,带偏移补偿的转换,A0样片
    • msp430x09x_apool_adc_04.c      APOOL_ADC,Vcc监控
    • msp430x09x_apool_ADC_05.c      APOOL_ADC,Timer_A0触发
    • msp430x09x_apool_ADC_06.c      APOOL_ADC,采样温度并转换为oC
    • msp430x09x_apool_adc_07.c      APOOL_ADC,对多个ADC通道进行采样

    我意识到l092没有UART[/QUOT]

    如果您需要在终端程序中输出数据,可以尝试编写基于计时器的软件UART,这些 代码示例中提供了示例

    • msp430g2xxS _TA_uart240.c       Timer_A,超低功耗UART 2400回波,32kHz ACLK
    • msp430g2xx2_ta_uart960.c       Timer_A,超低功耗全双工UART 9600,32kHz ACLK

    Dennis

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

    非常感谢。 该示例代码非常适合ADC。 我想在 终端控制台上看到我的传感器值。 我使用了这些代码

    msp430g2xxS _TA_uart240.c    Timer_A,超低功耗UART 2400回波,32kHz ACLK

    msp430g2xx2_ta_uart960.c    Timer_A,超低功耗全双工UART 9600,32kHz ACLK

    但它们不能与msp430l092配合使用。 我遇到了一些错误。

    您能否建议我查看传感器的模拟值?

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

    嗯,是的,您可能无法使用示例1:1 -您必须更改某些注册名称。 查看用户指南和处理器的头文件,以查看正确的寄存器名称。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢Dennis Eichmann的回复。 我将尝试根据我的MCU寄存器更改寄存器,但您确定它与UART一起使用吗? 我了解到MSP430L092没有UART。 我有点困惑。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我从未使用过您目前正在使用的部件,但一般来说,您可以根据计时器模块建立UART连接。 我链接的示例来自没有UART的处理器(MSP430G2402)。 我不知道MSP430L092的可用时钟源-我必须查看它。 您使用什么时钟? 对于UART,时钟精度相对重要。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    ACLK MCLK和SMCLK是msp430l092的时钟。 在我从 msp430g2xxS中获取代码之后,我更换了适用于msp430l092的寄存器 ,但我没有准备时钟代码。 我已在 终端控制台上检查了我的代码。 没有任何消息。


    *--/copyright--*/
    //************************************************************************************************
    // MSP430G2xx2演示- Timer_A,超低功耗UART 9600回波,32kHz ACLK
    //
    //说明:使用Timer_A CCR0硬件输出模式和SCCI数据锁存器
    //实现UART功能@ 9600波特。 软件不能直接读取和
    //写入RX和TX引脚,而不是正确使用输出模式和SCCI数据
    //演示了闩锁。 使用这些硬件功能可消除ISR
    //延迟效应,因为硬件可确保输出和输入位锁定和
    //计时与Timer_A完全同步,与其他计时器无关
    //软件活动。 在Mainloop中,UART功能使UART准备就绪
    //接收一个字符并在LPM3中等待所有活动中断驱动。
    //收到字符后,UART接收功能强制退出
    //来自Mainloop中的LPM3,用于配置基于端口引脚(P1和P2)的端口
    //在收到的字节的值上(即,如果设置了BIT0,则打开WFP 1.0)。

    // ACLK = TALK = LFXT1 = 3.2768万Hz,MCLK = SMCLK =默认DCO
    /////*对于ACLK,XIN XOUT需要外部水晶表片*//
    //
    // MSP430G2xx2
    //-----------
    ///|\\| Xin|-
    //||| 32kHz
    //--|RST XOUT|-
    //||
    //| CCI0B/TXD/WFP 1.1 >
    //|| 9600 8N1
    //| CCI0A/RXD/WFP 1.2 |<!----
    //
    // D. Dang
    //德州仪器(TI)
    // 2010年12月
    //使用CCS版本4.2 0和IAR嵌入式工作台版本:5.10 构建
    //************************************************************************************************

    #include <MSP4S.h>

    //------------------
    //硬件相关定义
    //------------------
    #define UART_TXD 0x02 //在WFP 1.1 上使用TXD (Timer0_A.OUT0)
    #define UART_RXD 0x04 //在WFP 1.2 上为RXD (Timer0_A.CCI1A)

    //------------------
    // 9600波特SW UART的条件,SMCLK = 1MHz
    //------------------
    #define UART_TBIT_DIV_2 (100万 /(9600 * 2))
    #define UART_TBIT (100万 / 9600)

    //------------------
    //用于全双工UART通信的全局变量
    //------------------
    unsigned int txData;//用于TX的UART内部变量
    unsigned char rxBuffer;//接收到UART字符

    //------------------
    //函数原型
    //------------------
    void TimerA_UART_INIT(void);
    void TimerA_UART_TX (无符号字符字节);
    void TimerA_UART_PRINT (CHAR *STRING);

    //------------------
    //主()
    //------------------
    内部主(无效)

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

    /*
    IF (CALBC1_1MHz=0xFF)// If calibration constants.

    while (1);//不加载,捕获CPU!!
    }

    */


    /*
    DCOCTL = 0;//选择最低DCOx和MODx设置
    BCSCTL1 = CALC1_1MHz;
    DCOCTL = CALDCO_1MHz;
    */


    /**************** /
    /*设置CCS */
    /* ACLK = CLKIN/1 */
    /* MCLK = CLKIN/1 */
    /* SMCLK = CLKIN/1 */
    /**************** /
    CCSCTL0 = CCSKEY;//解锁CCS

    While (SFRIFG1和OFIFG)//振荡器标志?

    CCSCTL7 = 0;//清除HF和LF OSC故障标志
    SFRIFG1 = 0;//清除OFIFG
    }
    CCSCTL5 = DIVA_0 + DIVM_0 + DIVS_0;//将ACLK,MCLK和SMCLK的分禾器设置为1
    CCSCTL4 |=拉美经济体系2 + SELM_2 + SELS_2;//选择CLKIN/XOSC作为ACLK,MCLK和SMCLK的源代码
    CCSCTL0_H |= 0xFF;//锁定CCS
    /*通过写入高位字节锁定*/

    同时(1);


    P1OUT = 0x00;//初始化所有GPIO
    P1SEL0 = UART_TXD + UART_RXD;// TXD/RXD引脚的计时器功能
    P1DIR = 0xFF &~UART_RXD;//设置除RXD以外的所有引脚以输出
    P2OUT = 0x00;
    P2SEL0 = 0x00;
    P2DIR = 0xFF;

    __enable_interrupit();

    TimerA_UART_INIT();//开始计时器_A UART
    TimerA_UART_PRINT ("G2xxS TimerA UART\r\n");
    TimerA_UART_PRINT ("就绪。\r\n");

    (;;)

    //等待输入字符
    __bis_sr_register (LPM0_bits);

    //根据收到的字节更新板输出
    IF (rxBuffer & 0x01) P1OUT |= 0x01;否则P1OUT &=~0x01;// WFP 1.0
    IF (rxBuffer & 0x02) P1OUT |= 0x08;否则P1OUT &=~0x08;// WFP 1.3
    IF (rxBuffer & 0x04) P1OUT |= 0x10;否则P1OUT &=~0x10;// WFP 1.4
    IF (rxBuffer & 0x08) P1OUT |= 0x20;否则P1OUT &=~0x20;// WFP 1.5
    IF (rxBuffer & 0x10) P1OUT |= 0x40;否则P1OUT &=~0x40;// WFP 1.6
    IF (rxBuffer & 0x20) P1OUT |= 0x80;否则P1OUT &=~0x80;// WFP 1.7
    IF (rxBuffer和0x40) P2OUT |= 0x40;否则P2OUT &=~0x40;// WFP 2.6
    IF (rxBuffer和0x80) P2OUT |= 0x80;否则P2OUT &=~0x80;// WFP 2.7

    //回显接收到的字符
    TimerA_UART_TX (rxBuffer);
    }
    }
    //------------------
    //功能配置Timer_A以进行全双工UART操作
    //------------------
    void TimerA_UART_INIT (void)

    TA0CCTL0 =输出;//将TXD空闲设置为标记='1'
    TA0CCTL1 = SCS + CM1 + CAP + CCIE;//同步,负极边缘,捕获,内部
    TA0CTL = tassel_2 + MC_2;// SMCLK,在连续模式下启动
    }
    //------------------
    //使用Timer_A UART输出一个字节
    //------------------
    void TimerA_UART_TX (无符号字符字节)

    while (TA0CCTL0和CCIE);//确保最后一个字符获得TX
    TA0CCR0 = TA0R;// TA计数器的当前状态
    TA0CCR0 += UART_TBIT;//第一位之前的一位时间
    TA0CCTL0 = OUTMOD0 + CCIE;//在EQU0,Int上设置TXD
    txData = byte;//加载全局变量
    txData |= 0x100;//向TXData添加标记停止位
    txData <<= 1;//添加空格起始位
    }

    //------------------
    //使用Timer_A UART打印字符串
    //------------------
    void TimerA_UART_PRINT (CHAR *STRING)

    同时(*string){
    TimerA_UART_TX(*STRING+);
    }
    }
    //------------------
    // Timer_A UART -发射中断处理程序
    //------------------
    #if defined(__TI_Compiler_version__)|| defined(__IAR_SYSTEMS _ICC__)
    #pragma vector = TIMER0_A0_vector
    __interrupt void Timer_A0_ISR(void)
    #Elif已定义(__GMNU__)
    void __attribute__((interrupt (TIMER0_A0_vector)) Timer_A0_ISR (void)
    #否则
    错误编译器不受支持!
    #endif

    静态无符号字符txBitCnt =10;

    TA0CCR0 += UART_TBIT;//向CCRx添加偏移
    如果(txBitCnt == 0){//所有位TXed?
    TA0CCTL0 &=~CCIE;//所有位TXED,禁用中断
    txBitCnt =10;//重新加载位计数器
    }
    否则{
    如果(txData和0x01){
    TA0CCTL0 &=~OUTMOD2;// TX标记'1'
    }
    否则{
    TA0CCTL0 |= OUTMOD2;// TX空间'0'
    }
    txData >=1;
    txBitcn--;
    }
    }
    //------------------
    // Timer_A UART -接收中断处理程序
    //------------------
    #if defined(__TI_Compiler_version__)|| defined(__IAR_SYSTEMS _ICC__)
    #pragma vector = TIMER0_A1_vector
    __interrupt void Timer_A1_ISR(void)
    #Elif已定义(__GMNU__)
    void __attribute__((interrupt (TIMER0_A1_vector)) Timer_A1_ISR (void)
    #否则
    错误编译器不受支持!
    #endif

    静态无符号字符rxBitCnt =8;
    静态无符号字符rxData =0;

    开关(__偶 数_IN_RANGE (TA0IV,TA0IV_TAIFG)){//使用计算的分支
    CASE TA0IV_TACCR1:// TACCR1 CCIFG - UART RX
    TA0CCR1 += UART_TBIT;//向CCRx添加偏移
    如果(TA0CCTL1 & CAP){//捕获模式=起始位边缘
    TA0CCTL1 &=~cap;//切换捕获以比较模式
    TA0CCR1 += UART_TBIT_DIV_2;//点CCRx到D0的中间
    }
    否则{
    rxData >>=1;
    如果(TA0CCTL1 & SCCI){//在接收锁中获取等待位
    rxData |= 0x80;
    }
    rxBitCnt--;
    如果(rxBitCnt == 0){//所有位RXed?
    rxBuffer = rxData;//存储在全局变量中
    rxBitCnt =8;//重新加载位计数器
    TA0CCTL1 || CAP;//切换与捕获模式进行比较
    __BIC_SR_REGISTER_ON_EXIT (LPM0_bits);//从0 (SR)清除LPM0位
    }
    }
    中断;
    }
    }