0

while testing this code only with tx(RX pin is open) it is working fine at the other hand tested it with only rx(TX is open) everthing is working as i expected, but when it comes to combine both rx and tx at the same time my mcu gets stuck and it keeps hanging untill i remove one of the communication pin and restart the mcu. for your reference i am attaching my initialises for the uart and timer below.kindly go throgh it and help me to solve this issue. thank you .

int8_t USART_0_init()
{

USART2.BAUD = (uint16_t)USART2_BAUD_RATE(115200); /* set baud rate register */

USART2.CTRLA = 0 << USART_ABEIE_bp /* Auto-baud Error Interrupt Enable: disabled */
             | 0 << USART_DREIE_bp /* Data Register Empty Interrupt Enable:       
             | 0 << USART_LBME_bp /* Loop-back Mode Enable: disabled */
             | USART_RS485_DISABLE_gc /* RS485 Mode disabled */
             | 1 << USART_RXCIE_bp /* Receive Complete Interrupt Enable: 
             | 0 << USART_RXSIE_bp /* Receiver Start Frame Interrupt Enable: 
             | 0 << USART_TXCIE_bp; /* Transmit Complete Interrupt Enable: 

USART2.CTRLB = 0 << USART_MPCM_bp       /* Multi-processor Communication Mode: disabled */
               | 0 << USART_ODME_bp     /* Open Drain Mode Enable: disabled */
               | 1 << USART_RXEN_bp     /* Receiver Enable: enabled */
               | USART_RXMODE_NORMAL_gc /* Normal mode */
               | 0 << USART_SFDEN_bp    /* Start Frame Detection Enable: disabled */
               | 1 << USART_TXEN_bp;    /* Transmitter Enable: enabled */

USART2.CTRLC = USART_CMODE_ASYNCHRONOUS_gc /* Asynchronous Mode */
               | USART_CHSIZE_8BIT_gc      /* Character size: 8 bit */
               | USART_PMODE_DISABLED_gc   /* No Parity */
               | USART_SBMODE_1BIT_gc;     /* 2 stop bits */

// USART2.DBGCTRL = 0 << USART_DBGRUN_bp; /* Debug Run: disabled */

// USART2.EVCTRL = 0 << USART_IREI_bp; /* IrDA Event Input Enable: disabled */

// USART2.RXPLCTRL = 0x0 << USART_RXPL_gp; /* Receiver Pulse Length: 0x0 */

// USART2.TXPLCTRL = 0x0 << USART_TXPL_gp; /* Transmit pulse length: 0x0 */

#if defined(__GNUC__)
stdout = &USART_0_stream;
#endif

return 0;
}`

int8_t TIMER_0_init()
{

TCB0.CCMP = 15999; /* Compare or Capture: 0x0 */

// TCB0.CNT = 0x0; /* Count: 0x0 */

TCB0.CTRLB = 1 << TCB_ASYNC_bp      /* Asynchronous Enable: enabled */
| 0 << TCB_CCMPEN_bp   /* Pin Output Enable: disabled */
| 0 << TCB_CCMPINIT_bp /* Pin Initial State: disabled */
| TCB_CNTMODE_INT_gc;  /* Periodic Interrupt */

// TCB0.DBGCTRL = 0 << TCB_DBGRUN_bp; /* Debug Run: disabled */

TCB0.EVCTRL = 0 << TCB_CAPTEI_bp /* Event Input Enable: disabled */
| 0 << TCB_EDGE_bp /* Event Edge: disabled */
| 1 << TCB_FILTER_bp; /* Input Capture Noise Cancellation Filter: disabled */

TCB0.INTCTRL = 1 << TCB_CAPT_bp   /* Capture or Timeout: enabled */
| 0 << TCB_OVF_bp; /* OverFlow Interrupt: disabled */

TCB0.CTRLA = TCB_CLKSEL_DIV1_gc     /* CLK_PER */
| 1 << TCB_ENABLE_bp   /* Enable: enabled */
| 0 << TCB_RUNSTDBY_bp /* Run Standby: disabled */
| 0 << TCB_SYNCUPD_bp  /* Synchronize Update: disabled */
| 0 << TCB_CASCADE_bp; /* Cascade Two Timer/Counters: disabled */

return 0;
}


int main(void)
{
/* Initializes MCU, drivers and middleware */
atmel_start_init();
sei();
PORTA.DIR|=PIN5_bm;
PORTA.OUT &=~ PIN5_bm;
greenLed_set_level(true);
redLed_set_level(true);
while (1) {
    
    
    
    if (dat == 2)
    {
        greenLed_set_level(false);
    }
    else if (dat == 4)
    {
        greenLed_set_level(true);
    }
            if (b>=1000)
    {
        b=0;
        if (buffer[0]==0x5A)
        {
            if (buffer[4]==0X90)
            {
                printf("%x",buffer[8]);
            }
            else if (buffer[4]==0X10)
            {
                dat = buffer[8];
                printf("%x",buffer[8]);
            }
            else if (buffer[4]==0X20)
            {
                printf("%x",buffer[8]);
            }
            else if (buffer[4]==0X30)
            {
                printf("%x",buffer[8]);
            }
            else if (buffer[4]==0X40)
            {
                printf("%x",buffer[8]);
            }
            else if (buffer[4]==0X50)
            {
                d=buffer[8];
                printf("%d",d);
            }
            memset(buffer,0,sizeof buffer);
        }
        else{
            
            for (int n=0; n<=8; n++)
            {
                USART2.CTRLB &=~ USART_RXEN_bm;
                USART2.CTRLA &=~ USART_RXCIF_bm;
                USART_0_write(Temperature[n]);
                USART2.CTRLB |= USART_RXEN_bm;
                USART2.CTRLA |= USART_RXCIF_bm;
                PORTC.OUTTGL|=PIN2_bm;
                
            }
        }
              }
}
}

ISR(USART2_RXC_vect){
for (int i=0; i<=8; i++)
{
    buffer[i] = USART_0_read();
}


}

ISR(TCB0_INT_vect){

//greenLed_set_level(false);
a++;
b++;

if (a>=1000)
{
    a=0;
    l++;
    if (l>255)
    {
        l=0;
    }
    Temperature[7]=l;
}

TCB0.INTFLAGS = TCB_CAPT_bm;
}

MCU gets stuck every time i connect it with my DWIN HMI.

0 Answers0