Currently I am working on a project that sampling from ADC them transmit data to PC through UART....First step: Sampling from ADC10 channel 0
Transmit data from UART
Second step: Sampling from ADC10 channel 10
Transmit data from UART
Third Step: Loop Back to channel 0
I choose baudrate = 9600, after sending about a few hundred byte, it will miss one byte, some times it will continuous missing bytes.There is no patten of data missing. Could you please tell me what could be the problem? Thanks a lot!
my orignal code is
#include <msp430.h>
int Temp_Humidity_Switch;
int ADC_Result;
char Byte0,Byte1;
int a,b,c;
int main(void)
{
Temp_Humidity_Switch=0;
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
ADC10CTL1 = INCH_0;
ADC10CTL0 = SREF_0 + ADC10SHT_3 + ADC10IE + + ADC10ON ;
P1DIR = 0X00;
P1DIR |= BIT4 + BIT5 + BIT7;
P1SEL = BIT6 + BIT7 + BIT5 + BIT1+BIT2;
P1SEL2 = BIT6 + BIT7 + BIT5 + BIT1+BIT2;
__enable_interrupt(); // Enable interrupts.
TACCR0 = 30; // Delay to allow Ref to settle
TACCTL0 |= CCIE; // Compare-mode interrupt.
TACTL = TASSEL_2 | MC_1; // TACLK = SMCLK, Up mode.
LPM0; // Wait for delay.
TACCTL0 &= ~CCIE; // Disable timer Interrupt
__disable_interrupt();
ADC10CTL1 = INCH_0; // input A1
ADC10AE0 |= 0x01; // PA.1 ADC option select
//P1DIR |= 0x01; // Set P1.0 to output direction
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;
UCA0CTL1 |= UCSSEL_2; // SMCLK
UCA0BR0 = 104; // 1MHz 9600
UCA0BR1 = 0; // 1MHz 9600
UCA0MCTL = UCBRS0; // Modulation UCBRSx = 1
UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
for (;;)
{
switch(Temp_Humidity_Switch)
{
case 0:
ADC10CTL0 &= ~ENC; // ADC10 disable
ADC10CTL1 = INCH_0;
ADC10CTL0 = SREF_0 + ADC10SHT_3 + ADC10IE + + ADC10ON ;
ADC10CTL0 |= ENC + ADC10SC; // Sampling and conversion start
__bis_SR_register(CPUOFF + GIE); // LPM0, ADC10_ISR will force exi
ADC_Result = ADC10MEM;
Byte1 = (char) (ADC_Result >> 8);
Byte0 = (char) ADC_Result;
while (!(IFG2 & UCA0TXIFG));
UCA0TXBUF = Byte1 ;
while (!(IFG2 & UCA0TXIFG));
UCA0TXBUF = Byte0 ;
Temp_Humidity_Switch=1;
break;
case 1:
ADC10CTL0 &= ~ENC; // ADC10 disable
ADC10CTL0 = SREF_1 + ADC10SHT_3 + REF2_5V + ADC10IE + REFON + ADC10ON;
ADC10CTL1 = INCH_10 ; // TA trig., rpt, A10
ADC10CTL0 |= ENC + ADC10SC; // Sampling and conversion start
__bis_SR_register(CPUOFF + GIE); // LPM0, ADC10_ISR will force exi
ADC_Result = ADC10MEM;
Byte1 = (char) (ADC_Result >> 8);
Byte0 = (char) ADC_Result;
while (!(IFG2 & UCA0TXIFG));
UCA0TXBUF = Byte1 ;
while (!(IFG2 & UCA0TXIFG));
UCA0TXBUF = Byte0 ;
while (!(IFG2 & UCA0TXIFG));
UCA0TXBUF = 0xFF ;
Temp_Humidity_Switch=0;
break;
}
}
}
// ADC10 interrupt service routine
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR (void)
{
b++;
__bic_SR_register_on_exit(CPUOFF); // Clear CPUOFF bit from 0(SR)
}
#pragma vector=TIMER0_A0_VECTOR
__interrupt void ta0_isr(void)
{
TACTL = 0;
a++;
LPM0_EXIT; // Exit LPM0 on return
}