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.
Hi,
We are using LM3S9B92 in our projects, and we are using Code Composer Studio Version: 4.2.1.00004 for programming purpose.
We have face simple problem, but we can't understand why this happen in this.
We are using optimization level 2.
1.) If we write c code as below for UART0 Transmit in while(1) of int main(void). So data not transmit and like communication fail.
while(1)
{
if((flag_check==1)&&(flag_transmit==0))
{
flag_check=0;
if((RX_BUFFER[0]==0x02) && (RX_BUFFER[1]==0x10))
{
calculate_crc(RX_BUFFER,19);
if((CRC_L==RX_BUFFER[19]) && (CRC_H==RX_BUFFER[20]))
{
flag_comm=0;
ROM_UARTIntDisable(UART0_BASE,UART_INT_RX);
UARTFIFOEnable(UART0_BASE);
UARTTxIntModeSet(UART0_BASE,UART_TXINT_MODE_EOT);
Timer_count=0;
flag_Commok=1;
No_Containers=RX_BUFFER[3];
Inform=RX_BUFFER[4];
for(Trans_Count=0;Trans_Count<13;Trans_Count++)
{
Set_Data[Trans_Count]=RX_BUFFER[Trans_Count+5];
}
UART_TX_ENABLE;
for(loop_rev=0;loop_rev<7000;loop_rev++);//1500
DATA_F[0]=Slave_Address;
DATA_F[1]=Function_Code;
DATA_F[2]=Data_Array[0];
DATA_F[3]=Data_Array[1];
DATA_F[4]=Data_Array[2];
DATA_F[5]=Data_Array[3];
DATA_F[6]=Data_Array[4];
DATA_F[7]=Data_Array[5];
DATA_F[8]=Data_Array[6];
DATA_F[9]=Data_Array[7];
DATA_F[10]=Data_Array[8];
DATA_F[11]=Data_Array[9];
DATA_F[12]=((GPIO_PORTF_DATA_R & 0x20)>>5);
DATA_F[13]=((GPIO_PORTF_DATA_R & 0x10)>>4);
DATA_F[14]=((GPIO_PORTH_DATA_R & 0x40)>>6);
calculate_crc(DATA_F,15);
DATA_F[15]=CRC_L;
DATA_F[16]=CRC_H;
DATA_F[17]=0;
Transmit_No=18;
Temp_Transmit_No=Transmit_No;
if(Transmit_No>16)
{
VAR_TRAN=16;
Transmit_No=Temp_Transmit_No-16;
}
else
{
VAR_TRAN=Transmit_No;
}
for(Trans_Count=0; Trans_Count<VAR_TRAN;Trans_Count++)
{
UARTCharPutNonBlocking(UART0_BASE,DATA_F[Trans_Count]);
}
UARTTxIntModeSet(UART0_BASE,UART_TXINT_MODE_EOT);
ROM_UARTIntEnable(UART0_BASE,UART_INT_TX);
flag_transmit=1;
}
}
else if((RX_BUFFER[0]==0x02) && (RX_BUFFER[1]==0x04) )
{
calculate_crc(RX_BUFFER,6);
if((CRC_L==RX_BUFFER[6]) && (CRC_H==RX_BUFFER[7]))
{
flag_comm=0;
ROM_UARTIntDisable(UART0_BASE,UART_INT_RX);
UARTFIFOEnable(UART0_BASE);
ROM_UARTIntEnable(UART0_BASE,UART_INT_TX);
UARTTxIntModeSet(UART0_BASE,UART_TXINT_MODE_EOT);
Timer_count=0;
UART_TX_ENABLE;
DATA_F[0]=Slave_Address;
DATA_F[1]=0x04;
DATA_F[2]=(RX_BUFFER[5]*2);
DATA_F[3]=Data_Array[0];
DATA_F[4]=Data_Array[1];
DATA_F[5]=Data_Array[2];
DATA_F[6]=Data_Array[3];
DATA_F[7]=Data_Array[4];
DATA_F[8]=Data_Array[5];
DATA_F[9]=Data_Array[6];
DATA_F[10]=Data_Array[7];
DATA_F[11]=Data_Array[8];
DATA_F[12]=Data_Array[9];
calculate_crc(DATA_F,(RX_BUFFER[5]*2)+3);
DATA_F[(RX_BUFFER[5]*2)+3]=CRC_L;
DATA_F[(RX_BUFFER[5]*2)+4]=CRC_H;
DATA_F[33]=0x56;
Transmit_No=(RX_BUFFER[5]*2)+5;
Temp_Transmit_No=Transmit_No;
if(Transmit_No>16)
{
VAR_TRAN=16;
Transmit_No=((RX_BUFFER[5]*2)+5)-16;
}
else
VAR_TRAN=Transmit_No;
for(Trans_Count=0; Trans_Count<VAR_TRAN;Trans_Count++)
{
UARTCharPutNonBlocking(UART0_BASE,DATA_F[Trans_Count]);
}
UARTTxIntModeSet(UART0_BASE,UART_TXINT_MODE_EOT);
ROM_UARTIntEnable(UART0_BASE,UART_INT_TX);
flag_transmit=1;
}
}
}
}
and if we write this code in function void Transmit_Data() and this function called in while(1) of int main(void),
then Data are transmit and communcation working ok.
like below,
int main(void)
{
while(1)
{
Transmit_Data()
}
}
void Transmit_Data()
{
if((flag_check==1)&&(flag_transmit==0))
{
flag_check=0;
if((RX_BUFFER[0]==0x02) && (RX_BUFFER[1]==0x10))
{
calculate_crc(RX_BUFFER,19);
if((CRC_L==RX_BUFFER[19]) && (CRC_H==RX_BUFFER[20]))
{
flag_comm=0;
ROM_UARTIntDisable(UART0_BASE,UART_INT_RX);
UARTFIFOEnable(UART0_BASE);
UARTTxIntModeSet(UART0_BASE,UART_TXINT_MODE_EOT);
Timer_count=0;
flag_Commok=1;
No_Containers=RX_BUFFER[3];
Inform=RX_BUFFER[4];
for(Trans_Count=0;Trans_Count<13;Trans_Count++)
{
Set_Data[Trans_Count]=RX_BUFFER[Trans_Count+5];
}
UART_TX_ENABLE;
for(loop_rev=0;loop_rev<7000;loop_rev++);//1500
DATA_F[0]=Slave_Address;
DATA_F[1]=Function_Code;
DATA_F[2]=Data_Array[0];
DATA_F[3]=Data_Array[1];
DATA_F[4]=Data_Array[2];
DATA_F[5]=Data_Array[3];
DATA_F[6]=Data_Array[4];
DATA_F[7]=Data_Array[5];
DATA_F[8]=Data_Array[6];
DATA_F[9]=Data_Array[7];
DATA_F[10]=Data_Array[8];
DATA_F[11]=Data_Array[9];
DATA_F[12]=((GPIO_PORTF_DATA_R & 0x20)>>5);
DATA_F[13]=((GPIO_PORTF_DATA_R & 0x10)>>4);
DATA_F[14]=((GPIO_PORTH_DATA_R & 0x40)>>6);
calculate_crc(DATA_F,15);
DATA_F[15]=CRC_L;
DATA_F[16]=CRC_H;
DATA_F[17]=0;
Transmit_No=18;
Temp_Transmit_No=Transmit_No;
if(Transmit_No>16)
{
VAR_TRAN=16;
Transmit_No=Temp_Transmit_No-16;
}
else
{
VAR_TRAN=Transmit_No;
}
for(Trans_Count=0; Trans_Count<VAR_TRAN;Trans_Count++)
{
UARTCharPutNonBlocking(UART0_BASE,DATA_F[Trans_Count]);
}
UARTTxIntModeSet(UART0_BASE,UART_TXINT_MODE_EOT);
ROM_UARTIntEnable(UART0_BASE,UART_INT_TX);
flag_transmit=1;
}
}
else if((RX_BUFFER[0]==0x02) && (RX_BUFFER[1]==0x04) )
{
calculate_crc(RX_BUFFER,6);
if((CRC_L==RX_BUFFER[6]) && (CRC_H==RX_BUFFER[7]))
{
flag_comm=0;
ROM_UARTIntDisable(UART0_BASE,UART_INT_RX);
UARTFIFOEnable(UART0_BASE);
ROM_UARTIntEnable(UART0_BASE,UART_INT_TX);
UARTTxIntModeSet(UART0_BASE,UART_TXINT_MODE_EOT);
Timer_count=0;
UART_TX_ENABLE;
DATA_F[0]=Slave_Address;
DATA_F[1]=0x04;
DATA_F[2]=(RX_BUFFER[5]*2);
DATA_F[3]=Data_Array[0];
DATA_F[4]=Data_Array[1];
DATA_F[5]=Data_Array[2];
DATA_F[6]=Data_Array[3];
DATA_F[7]=Data_Array[4];
DATA_F[8]=Data_Array[5];
DATA_F[9]=Data_Array[6];
DATA_F[10]=Data_Array[7];
DATA_F[11]=Data_Array[8];
DATA_F[12]=Data_Array[9];
calculate_crc(DATA_F,(RX_BUFFER[5]*2)+3);
DATA_F[(RX_BUFFER[5]*2)+3]=CRC_L;
DATA_F[(RX_BUFFER[5]*2)+4]=CRC_H;
DATA_F[33]=0x56;
Transmit_No=(RX_BUFFER[5]*2)+5;
Temp_Transmit_No=Transmit_No;
if(Transmit_No>16)
{
VAR_TRAN=16;
Transmit_No=((RX_BUFFER[5]*2)+5)-16;
}
else
VAR_TRAN=Transmit_No;
for(Trans_Count=0; Trans_Count<VAR_TRAN;Trans_Count++)
{
UARTCharPutNonBlocking(UART0_BASE,DATA_F[Trans_Count]);
}
UARTTxIntModeSet(UART0_BASE,UART_TXINT_MODE_EOT);
ROM_UARTIntEnable(UART0_BASE,UART_INT_TX);
flag_transmit=1;
}
}
}
}
So, pls let me know any limitation of while(1) of int main(void) or any other thing.
pls do the needful.
Regards,
Dharmendra Panchal
As the 1st code within while(1) block actually is the same than 2nd code within the block of Transmit_Date() that difference in behaviour might look surprising.
But do you have checked all the variables states?
At least within your sample I see no variable declaration, and no preset as well for lots of these varaiables. At least my compiler wouldn't compile that. May it be that some of the variables in some cases will be declared implicitely by your compiler?
Your code samples look somewhat strange to me, so it would be helpful you enhance them concerning your variable declarations... maybe while that you will find the reason yourself. But feel free to ask again.
Regards,
Joern.
Make sure any memory location which can be modified outside the direct control of the C code (i.e. by the UART) is defined with "volatile". This link http://c-faq.com/~scs/cclass/int/sx4ga.html has a nice discussion of type qualifiers, including volatile.
Thanks and regards,
-George