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.

Compiler/MSP430G2553: PROGRAMME for reciever UART

Part Number: MSP430G2553

Tool/software: TI C/C++ Compiler

Hello,

i am a beginner in embedded c, i have a issue that while im running a program to recieve the character it is seen that the signal comes repeatedly for ex: if i type 'b' only once,it comes repeatedly

so please help to get a programme that if i type 'c' once it should come on the screen only once.im using code composer and my programme is written below

#include "msp430g2553.h"
#define TXD BIT2
#define RXD BIT1

int main(void)
{
   WDTCTL = WDTPW + WDTHOLD; // Stop WDT
   BCSCTL1 = CALBC1_1MHZ; // Set DCO
   DCOCTL = CALDCO_1MHZ;
   P1SEL |= RXD + TXD ; // P1.1 = RXD, P1.2=TXD
   P1SEL2 |= RXD + TXD ; // P1.1 = RXD, P1.2=TXD
   UCA0CTL1 |= UCSSEL_2; // SMCLK
   UCA0BR0 = 104; // 1MHz 9600
   UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
   while (1)
   {
       UCA0TXBUF = UCA0RXBUF;
       __delay_cycles(1000000);
   }
}

  • Hi Anthonis,

    The reason it keeps sending 'b' or 'c' is that you have the "UCA0TXBUF = UCA0RXBUF" in the while(1) loop.

    I suggest you to use the code example for the G2553 UART communication. You can find it in the MSPWare at: http://www.ti.com/tool/MSPWARE. There it uses the interrupt to handle the uart operation thus the received character only sent out once.

    Also attached the code example here for quick reference.

    /* --COPYRIGHT--,BSD_EX
     * Copyright (c) 2012, Texas Instruments Incorporated
     * All rights reserved.
     *
     * Redistribution and use in source and binary forms, with or without
     * modification, are permitted provided that the following conditions
     * are met:
     *
     * *  Redistributions of source code must retain the above copyright
     *    notice, this list of conditions and the following disclaimer.
     *
     * *  Redistributions in binary form must reproduce the above copyright
     *    notice, this list of conditions and the following disclaimer in the
     *    documentation and/or other materials provided with the distribution.
     *
     * *  Neither the name of Texas Instruments Incorporated nor the names of
     *    its contributors may be used to endorse or promote products derived
     *    from this software without specific prior written permission.
     *
     * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
     * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
     * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
     * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
     * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
     * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
     * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     *
     *******************************************************************************
     * 
     *                       MSP430 CODE EXAMPLE DISCLAIMER
     *
     * MSP430 code examples are self-contained low-level programs that typically
     * demonstrate a single peripheral function or device feature in a highly
     * concise manner. For this the code may rely on the device's power-on default
     * register values and settings such as the clock configuration and care must
     * be taken when combining code from several examples to avoid potential side
     * effects. Also see www.ti.com/grace for a GUI- and www.ti.com/msp430ware
     * for an API functional library-approach to peripheral configuration.
     *
     * --/COPYRIGHT--*/
    //******************************************************************************
    //   MSP430G2xx3 Demo - USCI_A0, 9600 UART Echo ISR, DCO SMCLK
    //
    //   Description: Echo a received character, RX ISR used. Normal mode is LPM0.
    //   USCI_A0 RX interrupt triggers TX Echo.
    //   Baud rate divider with 1MHz = 1MHz/9600 = ~104.2
    //   ACLK = n/a, MCLK = SMCLK = CALxxx_1MHZ = 1MHz
    //
    //                MSP430G2xx3
    //             -----------------
    //         /|\|              XIN|-
    //          | |                 |
    //          --|RST          XOUT|-
    //            |                 |
    //            |     P1.2/UCA0TXD|------------>
    //            |                 | 9600 - 8N1
    //            |     P1.1/UCA0RXD|<------------
    //
    //   D. Dang
    //   Texas Instruments Inc.
    //   February 2011
    //   Built with CCS Version 4.2.0 and IAR Embedded Workbench Version: 5.10
    //******************************************************************************
    #include <msp430.h>
    
    int main(void)
    {
      WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
      if (CALBC1_1MHZ==0xFF)					// If calibration constant erased
      {											
        while(1);                               // do not load, trap CPU!!	
      }
      DCOCTL = 0;                               // Select lowest DCOx and MODx settings
      BCSCTL1 = CALBC1_1MHZ;                    // Set DCO
      DCOCTL = CALDCO_1MHZ;
      P1SEL = BIT1 + BIT2 ;                     // P1.1 = RXD, P1.2=TXD
      P1SEL2 = BIT1 + BIT2 ;                    // P1.1 = RXD, P1.2=TXD
      UCA0CTL1 |= UCSSEL_2;                     // SMCLK
      UCA0BR0 = 104;                            // 1MHz 9600
      UCA0BR1 = 0;                              // 1MHz 9600
      UCA0MCTL = UCBRS0;                        // Modulation UCBRSx = 1
      UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
      IE2 |= UCA0RXIE;                          // Enable USCI_A0 RX interrupt
    
      __bis_SR_register(LPM0_bits + GIE);       // Enter LPM0, interrupts enabled
    }
    
    //  Echo back RXed character, confirm TX buffer is ready first
    #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
    #pragma vector=USCIAB0RX_VECTOR
    __interrupt void USCI0RX_ISR(void)
    #elif defined(__GNUC__)
    void __attribute__ ((interrupt(USCIAB0RX_VECTOR))) USCI0RX_ISR (void)
    #else
    #error Compiler not supported!
    #endif
    {
      while (!(IFG2&UCA0TXIFG));                // USCI_A0 TX buffer ready?
      UCA0TXBUF = UCA0RXBUF;                    // TX -> RXed character
    }
    

  • Thank  you for your reply, but there is a problem that i'm looking for a programe that doesn't use interrupt. So, can you please suggest a programme without using interrupt.

  • Hi Anthonis,

    May I know if there is specific reason you would not like to use interrupt? In general, as uart communication is asynchronous event, interrupt is usually used, either uart interrupt itself, or some other interrupt such as timer to periodically check the uart status. Otherwise you need to check the uart status by CPU which will block your CPU from doing other tasks.

  • Of course I could give you an example of not using interrupt to achieve your requirement.

    In your post code, you need to add

    while ((IFG2&UCA0RXIFG)); 

    before you fill the TXBUF of RXBUF. This helps check if there is new arrival. When new rx data arrives the UCA0RXIFG is set to 1 thus the while state reaches and the program can proceed. After you read the RXBUF and send it out the RXIFG is cleared automatically and it won't be sent twice.

    However, this is not something I would recommend you -- it'll block the CPU and you almost can't do anything else.