Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

More than four characters Tx and Rx through UART

Status
Not open for further replies.

MKVRAJU

Junior Member level 2
Joined
Jun 14, 2013
Messages
20
Helped
1
Reputation
2
Reaction score
1
Trophy points
3
Activity points
160
I am trying to transmit a string and raised receive interrupt as
taking buf[20]

Code:
void _attribute__((__interrupt__,no_auto_psv)) _U1RXInterrupt(void){  // This is UART1 receive ISR 
          IFS0bits.U1RXIF = 0; 
          for(i=0;i<20;i++) 
            buf = ReadUART1(); 
          putsUART1((unsigned int*)buf); 
}

I used

Code:
U1MODEbits.LPBACK	= 0;    // Disable Loop Back

Code:
U1STAbits.URXISEL = 2;    // Interrupt flag bit is set when Receive Buffer is 3/4 full (i.e., has 3 data characters)

when i am using value 2 here , the loop discontinues when 3 data characters are filled and remaining array is replaced by 3 char.
when i am using value 3 here, the loop discontinues when 4 data char are filled
when i am using value 0 or 1 , it prints the same what typed ,with out filling the char array.


where does my logic go wrong ? I want to print a string of length for example " this is test".
I want to get
[TX] : this is test
[RX] : this is test


In the case if I want to add a big paragraph, i cannot mention a particular size like buf[20], then how to initialize ?
 

Attachments

  • Capture.JPG
    Capture.JPG
    59.1 KB · Views: 103
Last edited by a moderator:

Post your full code. Post function definition of putsUART1().


Code C - [expand]
1
2
3
4
5
6
7
8
9
10
for(i=0;i<20;i++) 
    //i is global variable
    buf[i++] = ReadUART1();
    buf[i] = '\0';
        
} 
 
 
 
putsUART1((unsigned int*)buf);  //assumed putsUART1() prints string

 

HI jayanth,

I have initilized a buffer array , char buf[24];

wrote an ISR as you mentioned

configured bits as
Code:
U1STAbits.UTXISEL	= 1;    // Interrupt when a character is transferred to the Transmit Shift register
    U1STAbits.UTXBRK 	= 0;    // Operate U1Tx Normally on Transmit Break Bit
    U1STAbits.UTXEN  	= 1;    // Enable U1 Tranmission   
   
    U1STAbits.URXISEL 	= 0;    // Interrupt flag bit is set when Receive Buffer is 3/4 full (i.e., has 1 data characters)
                                         //  b00 or b01 for 1 letter buffer size, b10 for 3 letter buffer , 11 for 4 letter buffer size

I could absolutely send and receive 1,3,4 chars respectively. And I can now understand that bufarray is being over written in last digits as I shown in the picture.

Now my problem is I want to transmit more than 4 letters at once and then receive.So for an example I have randomly chosen 24 chars .
If I write value for U1STAbits.URXISEL , the interrupt automatically breaks up when the buffer is full with 1 or 3 or 4 chars, as mentioned in the data sheet of the processor.

how do I write for a 24 char similarly ? Do I need to write a seperate ISR for this ? then how ? but I cannot use _U1TXInterrupt vector then.
Suggest me a way to do it ?


code for UART.c
Code:
#include<P30F5011.h>
#include"UART1.h"
char buf[24];
int j;

void  init_UART1()                    // Initialization function.
{                                                      
	
	TRISFbits.TRISF3 	= 0;    	  // Configure RF3 as Output for UART1 Tx .
	TRISFbits.TRISF2	= 1;		  // Configure RF2 as Input for UART1 Rx.
	
   /********************* CONFIGURE UART1 Baud Rate Generator Register *********************
        *                      					*
        * FCY : 8 MHz, 							*
      	* Desired Baud Rate : 9600    / 19200   * 
      	* Desired U1BRG = 25 or 0x19h / 0x33 	*
      	*                      					*
   ****************************************************************************************/
    U1BRG    = 51;  //XT /w PLL 4x
							
    /************************* CONFIGURE UART1MODE Register********************************/
    U1MODEbits.USIDL	= 0;    // Continue operation in Idle mode
    U1MODEbits.ALTIO	= 0;    // UART communicates usingalternate UxTX and UxRX I/O pins
    U1MODEbits.WAKE 	= 1;    // Enable Wake up
    U1MODEbits.LPBACK	= 0;    // Disable Loop Back
    U1MODEbits.ABAUD	= 0;    // Disable Auto Baud
    U1MODEbits.PDSEL	= 0;    // 8 Bit Data, No Parity
    U1MODEbits.STSEL	= 0;    // 1 Stop Bit
    
    IPC2bits.U1TXIP 	= 7;    // Tx priority level.
    IPC2bits.U1RXIP 	= 7;	// Rx priority level.
    
    U1MODEbits.UARTEN	= 1;    // Enable UART
    
    IEC0bits.U1TXIE		= 1;    // Enabling TX interrupt.
    IEC0bits.U1RXIE		= 1;    // Enabling Rx interrupt.

    
         
    /********************* CONFIGURE UART1 STATUS & CONTROL Register ***********************/
    U1STAbits.UTXISEL	= 1;    // Interrupt when a character is transferred to the Transmit Shift register
    U1STAbits.UTXBRK 	= 0;    // Operate U1Tx Normally on Transmit Break Bit
    U1STAbits.UTXEN  	= 1;    // Enable U1 Tranmission   
   
    U1STAbits.URXISEL 	= 0;    // Interrupt flag bit is set when Receive Buffer is 3/4 full (i.e., has 1 data characters)
  // 	putsUART1((unsigned int *)"UART Ready");
	
 } 



void putsUART1(unsigned int *buffer)
{
	char * temp_ptr = (char *) buffer;         	// transmit till NULL character is encountered      
	if(U1MODEbits.PDSEL == 3)                  // check if TX is 8bits or 9bits
	{			       	
		while(*buffer != '\0')
		{
        	while(U1STAbits.UTXBF); 			// wait if the buffer is full
                 U1TXREG = *buffer++;    		// transfer data word to TX reg
        }
    }
    else 
	{
             while(*temp_ptr != '\0') 
	         {
                 while(U1STAbits.UTXBF);   // wait if the buffer is full 
                 U1TXREG = *temp_ptr++;    // transfer data byte to TX reg 
             }
    }
}


void __attribute__((__interrupt__,no_auto_psv)) _U1TXInterrupt(void) // This is UART1 transmit ISR
{
    IFS0bits.U1TXIF = 0;
    
    
}

void __attribute__((__interrupt__,no_auto_psv)) _U1RXInterrupt(void) // This is UART1 receive ISR
{
	      IFS0bits.U1RXIF = 0;
	      for(j=0;j<=24;j++)
	          buf[j]=ReadUART1();
    	      
              putsUART1((unsigned int*)buf);
        
}
 
Last edited:

Use break if buffer is filled with 1 char. What I mean by buffer is the receive register of UART. You should send a terminating null character at the end of data so that once the end of data is received then the data is transmitted back.

Post the .c file.
 

Status
Not open for further replies.

Similar threads

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top