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.

UART problem for PIC microcontroller

Status
Not open for further replies.

saurabh17g

Member level 2
Joined
Mar 30, 2010
Messages
49
Helped
0
Reputation
0
Reaction score
0
Trophy points
1,286
Location
Bombay
Activity points
1,707
I am using pic24fj64ga002 controller UART. I am able to communicate with PC when I transmit/receive one character to PC. But my intention is to get a string from PC and process it in microcontroller. However, I am getting a weird problem. When I am sending more than 5 characters, eg. abcdefg, I am able to store 'ab' but I get some special character out of cdefg might be like $ or (.
similarly if i enter "i am a microcontroller", i am able to store "i am a microcontr" followed by some special character.
If the number of characters is less than 5, eg abcd, i am getting a special character or null value.



#include <p24FJ64GA002.h>
#define FCY 16000000UL // instruction cycle rate (ignore)
#include <libpic30.h> // __delay32
// __delay_ms and __delay_us
// note: use only small values
#include <stdio.h>
#define USE_AND_OR // enable AND_OR mask setting
#include <string.h>

#define BAUD_19200 51 // brg for low-speed, 32 MHz clock
#define TotalCharacters 50 //total number of characters to be entered
//-----------------------------------------------------------------------------
// Subroutines
//-----------------------------------------------------------------------------

// Initialize Hardware
void init_hw()
{
LATBbits.LATB3 = 0; // write 0 into output latches
LATBbits.LATB5 = 0;
TRISBbits.TRISB3 = 0; // make green led pin an output
TRISBbits.TRISB5 = 0; // make red led pin an output
AD1PCFGbits.PCFG9 = 1; // make push button a digital input
CNPU1bits.CN11PUE = 1; // enable pull-up for push button
RPINR18bits.U1RXR = 11; // assign U1RX to RP11
RPOR5bits.RP10R = 3; // assign U1TX to RP10
}

void serial_init(int baud_rate)
{
// set baud rate
U1BRG = baud_rate;
// enable uarts, 8N1, low speed brg
U1MODE = 0x8000;
// enable tx and rx
U1STA = 0x0400;
}

void serial_puts(char str[])
{
int i;
for (i = 0; i < strlen(str); i++)
{
// make sure buffer is empty
while(U1STAbits.UTXBF);
// write character
U1TXREG = str;
}
}

char serial_getc()
{
// clear out any overflow error condition
if (U1STAbits.OERR == 1)
U1STAbits.OERR = 0;
// wait until character is ready
while(!U1STAbits.URXDA);
return U1RXREG;
}

// Wait for PB Press
void wait_pb()
{
while (PORTBbits.RB15 == 1); // wait until pb pressed
}

//-----------------------------------------------------------------------------
// Main
//-----------------------------------------------------------------------------

int c;
char gReceivedData,gReceivedString4mPC[TotalCharacters];


int gParameterTypes[10][5];
int main(void)
{

init_hw(); // initialize hardware
serial_init(BAUD_19200); // configure uart
//step 1
LATBbits.LATB3 = 1; // blink green LED for 500ms
__delay32(8000000);
LATBbits.LATB3 = 0;
/*
wait_pb(); // wait for pb press
*/
serial_puts("Enter command "); // print greeting


//step 2
checkReceivedDataForCRnBS();
//step 2.5
// testStorageOf1DArray();


//flush global variables
flushGlobalVariables();


return 0;
}
/*
This function gets characters entered by user using PC and reads it in microcontroller. Then, it checks for carrage return,backspace, and a valid character. It forms
a string and stores it in global variable gReceivedString4mPC.

*/
void checkReceivedDataForCRnBS(){

//step 2 start
int lCounterNumberOfCharactersReceived = 0;
//receiving character from UART
while(1){
gReceivedData = serial_getc();
if(gReceivedData == 13){ break; }
//checking for backspace
if(gReceivedData == 8 ){
if(lCounterNumberOfCharactersReceived>0){
lCounterNumberOfCharactersReceived--;
}
}else{
//if character is greater than or equal to ''(ascii 32) then, its alphabet or number or
// special character such as space , comma, colon. Store it in array.
if(gReceivedData >=32){
gReceivedString4mPC[lCounterNumberOfCharactersReceived] = gReceivedData;
//serial_puts(gReceivedString4mPC[lCounterNumberOfCharactersReceived]);
lCounterNumberOfCharactersReceived++;
}

}

}
// if it is carrage return, add a null terminator
gReceivedString4mPC[lCounterNumberOfCharactersReceived] = 0;


}
 

hello
i think that you have to buffer the data incoming in your appli on pc (i dont know the soft you are using) if you are also developping the soft in vb or c, you need to use interrupt.
Also, in your pic program you can use delay_ms(10) or more, you can adjust this delay until the problem disapear.
bye bye
Jo
 

Status
Not open for further replies.

Similar threads

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top