Other Parts Discussed in Thread: LMT86
Tool/software: Code Composer Studio
I try to create little programmable thermostat with msp430fr4133 and LMT86. I have a java application with 2 buttons one for get ( refresh displayed temp ) and set ( set temperature to msp ).
I send from java a command and dont receive in microcontroller.
Java Send function:
void writeData(String temperature){
try{
byte a;
for (char ch : temperature.toCharArray()) {
a = (byte)ch;
output.write(a);
output.flush();
}
} catch (Exception e){
logText = "Failed to write data: " + e.toString();
System.out.println(logText);
}
}
In msp have UART INTERRUPT ROUTINE and dont work. At every step this routine are skyped.
void initClockTo16MHz()
{
FRCTL0 = FRCTLPW | NWAITS_1;
__bis_SR_register(SCG0);
CSCTL3 |= SELREF__REFOCLK;
CSCTL0 = 0;
CSCTL1 &= ~(DCORSEL_7);
CSCTL1 |= DCORSEL_5;
CSCTL2 = FLLD_0 + 487;
__delay_cycles(3);
__bic_SR_register(SCG0);
while(CSCTL7 & (FLLUNLOCK0 | FLLUNLOCK1));
CSCTL4 = SELMS__DCOCLKDIV | SELA__REFOCLK;
}
void Init_PIN(){
// UART pins
GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_UCA0TXD, GPIO_PIN_UCA0TXD, GPIO_FUNCTION_UCA0TXD);
GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_UCA0RXD, GPIO_PIN_UCA0RXD, GPIO_FUNCTION_UCA0RXD);
// ADC pins
GPIO_setAsInputPin(GPIO_PORT_P8, GPIO_PIN0);
GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P8,GPIO_PIN0,GPIO_PRIMARY_MODULE_FUNCTION);
PM5CTL0 &= ~LOCKLPM5;
}
void Init_UART(){
UCA0CTLW0 |= UCSWRST;
UCA0CTLW0 |= UCSSEL__SMCLK;
UCA0BRW = 104;
UCA0MCTLW |= UCOS16 | UCBRF_2 | 0xD600;
UCA0CTLW0 &= ~UCSWRST;
UCA0IE |= UCRXIE;
}
void configurateADC(){
ADC_init(ADC_BASE,ADC_SAMPLEHOLDSOURCE_SC,ADC_CLOCKSOURCE_ADCOSC,ADC_CLOCKDIVIDER_1);
ADC_enable(ADC_BASE);
ADC_setupSamplingTimer(ADC_BASE,ADC_CYCLEHOLD_256_CYCLES ,ADC_MULTIPLESAMPLESDISABLE);
ADC_setResolution(ADC_BASE,ADC_RESOLUTION_10BIT);
ADC_configureMemory(ADC_BASE, ADC_INPUT_A8,ADC_VREFPOS_AVCC,ADC_VREFNEG_AVSS);
__delay_cycles(5000);
}
int main(void)
{
WDT_A_hold(WDT_A_BASE);
Init_PIN();
initClockTo16MHz();
Init_UART();
configurateADC();
while(1) {
ADC_startConversion(ADC_BASE, ADC_SINGLECHANNEL);
adcInt = ADC_getResults(ADC_BASE);
if(readCommand[0] == 's' && readCommand[1] == 'e' && readCommand[2] == 't'){
//pars command and get temperature
// command structure: set:12
// when 12 is celsius degree
memset(readCommand, 0, sizeof(readCommand));
free(temperature);
} else if(readCommand[0] == 'g' && readCommand[1] == 'e' && readCommand[2] == 't') {
//send temperature to serial
sendTemp();
memset(readCommand, 0, sizeof(readCommand));
}
free(temperature);
}
}
//*********************************************************************************************************************
// \/ UART INTERRUPT ROUTINE \/
//*********************************************************************************************************************
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=USCI_A0_VECTOR
__interrupt void USCI_A0_ISR(void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(USCI_A0_VECTOR))) USCI_A0_ISR (void)
#else
#error Compiler not supported!
#endif
{
switch(__even_in_range(UCA0IV,USCI_UART_UCTXCPTIFG))
{
case USCI_NONE: break;
case USCI_UART_UCRXIFG:
while(!(UCA0IFG&UCTXIFG));
strcat(readCommand, (char *)UCA0RXBUF);
__no_operation();
break;
case USCI_UART_UCTXIFG: break;
case USCI_UART_UCSTTIFG: break;
case USCI_UART_UCTXCPTIFG: break;
default: break;
}
}
This are all fuctions used. CS 16Mhz, BoundRate 9600 bits/s