Microcontroller › PIC › More than four character Rx and Tx through UART › dsPIC30F5011 /
August 7, 2013 at 6:12 am
#10292
varma
Participant
dsPIC30F5011 / MPLAB8.8
HI,
I have initilized a buffer array , char buf[24];
wrote an ISR.
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
</code>
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 != ‘