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.

MSP430FR2433: Problem with using UART collect ADC conversion results

Part Number: MSP430FR2433

Hi

my code is as below

#include <msp430.h>

void UARTPutString(const char* strptr); // begin output of string
void UARTSetup (void);
void Init_GPIO();

const char* TxPtr ;
char OutStr[50]; // buffer to hold output string
int ADC_Result;


int main(void)
{
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
// Init_GPIO();
// Configure GPIO Setup
// RED LED
P1DIR |= BIT0; // Set P1.0 as output
P1OUT |= BIT0; // P1.0 high


// Configure ADC A1 pin
SYSCFG2 |= ADCPCTL1;


// Disable the GPIO power-on default high-impedance mode to activate
// previously configured port settings
PM5CTL0 &= ~LOCKLPM5;


// Clock System Setup ACLK = 32786, MCLK = SMCLK = 1MHz
__bis_SR_register(SCG0); // disable FLL
CSCTL3 |= SELREF__REFOCLK; // Set REFOCLK as FLL reference source
CSCTL0 = 0; // clear DCO and MOD registers
CSCTL1 &= ~(DCORSEL_7); // Clear DCO frequency select bits first
CSCTL1 |= DCORSEL_3; // Set DCOCLK = 8MHz
CSCTL2 = FLLD_1 + 121; // FLLD = 1, DCODIV = 4MHz
__delay_cycles(3);
__bic_SR_register(SCG0); // enable FLL
while(CSCTL7 & (FLLUNLOCK0 | FLLUNLOCK1)); // Poll until FLL is locked
CSCTL4 = SELMS__DCOCLKDIV | SELA__XT1CLK; // set ACLK = XT1 = 32768Hz, DCOCLK as source
CSCTL5 |= DIVM1; // SMCLK = MCLK = DCODIV/2 = 1MHz, by default


UARTSetup(); // set BAUD rate


// add ADC setup
// Configure ADC10
ADCCTL0 |= ADCSHT_2 | ADCON; // ADCON, S&H=16 ADC clks
ADCCTL1 |= ADCSHP | ADCSSEL0; // ADCCLK = MODOSC; sampling timer
ADCCTL2 |= ADCRES; // 10-bit conversion results
ADCMCTL0 |= ADCINCH_1; // A1 ADC input select; Vref=AVCC
ADCIE |= ADCIE0; // Enable ADC conv complete interrupt

// Timer0_A3 Setup ISR 10/second:
TA0CCTL0 |= CCIE; // TACCR0 interrupt enabled
TA0EX0 |= TAIDEX_3; // SMCLK/8/4 = 31250 Hz
TA0CCR0 = 3125; // 10 per second
TA0CTL = TASSEL_2 | MC_1 | ID_3; // SMCLK/8 = 125K , UP mode

// go to Standby
__bis_SR_register(LPM0_bits | GIE);

}

// Timer A0 interrupt service routine
#pragma vector = TIMER0_A0_VECTOR
__interrupt void Timer_A (void)
{
P1OUT ^= BIT0;
// begin conversion
ADCCTL0 |= ADCENC | ADCSC; // Sampling and conversion start

}

#pragma vector=USCI_A0_VECTOR
__interrupt void USCI_A0_ISR(void)
{
switch(UCA0IV)
{
case USCI_NONE: break;
case USCI_UART_UCRXIFG:
while(!(UCA0IFG&UCTXIFG));
UCA0TXBUF = UCA0RXBUF;
__no_operation();
break;
case USCI_UART_UCTXIFG:
// load char value
// unsigned char testVal=*TxPtr++;
if(!(*TxPtr)) // if zero, then stop
{
UCA0IE &= ~UCTXIE; // turn off interrupt
}
else
{
UCA0TXBUF = *TxPtr++ ;
}
break;
case USCI_UART_UCSTTIFG: break;
case USCI_UART_UCTXCPTIFG: break;
default: break;
}
}

// ADC interrupt service routine
#pragma vector=ADC_VECTOR
__interrupt void ADC_ISR(void)
{
switch(ADCIV)
{
case ADCIV_NONE:
break;
case ADCIV_ADCOVIFG:
break;
case ADCIV_ADCTOVIFG:
break;
case ADCIV_ADCHIIFG:
break;
case ADCIV_ADCLOIFG:
break;
case ADCIV_ADCINIFG:
break;
case ADCIV_ADCIFG:
ADC_Result = ADCMEM0;
// last string has to be complete or trouble here - no blocking allowed
// worst case, will overwrite part of string being output
sprintf(OutStr,"%d\n",ADC_Result);
UARTPutString(OutStr); // begin output of string


//__bic_SR_register_on_exit(LPM0_bits); // Clear CPUOFF bit from LPM0
break;
default:
break;
}
}


void UARTSetup (void)
{
// Configure UART pins
P1SEL0 |= BIT4 | BIT5; // set 2-UART pin as second function
// Configure UART
UCA0CTLW0 |= UCSWRST; // reset UART
UCA0CTLW0 |= UCSSEL__SMCLK; // use SMCLK input
UCA0BR0 = 104; // 1MHz SMCLK/9600 BAUD
UCA0MCTLW = 0x1100; // // remainder of Baud Rate
UCA0CTLW0 &= ~UCSWRST;

//UCA0IE |= UCRXIE; // Enable USCI_A0 RX interrupt
}

void UARTPutString(const char* strptr) // begin output of string
{
// load TxBuf with first char then enable interrupt
TxPtr = strptr;
UCA0TXBUF = *TxPtr++; //load first, assume at least one char in buffer
UCA0IE |= UCTXIE; // interrupt when transmitted - ISR turns off when done
}

void Init_GPIO()
{
P1DIR = 0xFF; P2DIR = 0xFF; P3DIR = 0xFF;
P1REN = 0xFF; P2REN = 0xFF; P3REN = 0xFF;
P1OUT = 0x00; P2OUT = 0x00; P3OUT = 0x00;
}

I see this example online and trying to use it for my board( this is the code exactly for MSP430FR2xx) and I was trying to get a serial print of my ADC conversion in the serial monitor. However, I put a sine wave in and I can see the ADC_Result is varying in the watching window but the print in the serial monitor just gave me random and repeat chars. I don't know what is wrong, this code was tested by the creator and it was worked. The creator also put the correct print result.

**Attention** This is a public forum