Discussion in "PIC Microcontroller Discussion" started by    amit_ele15    Sep 25, 2015.
Fri Sep 25 2015, 11:03 AM
#1
Hi everyone.. i have written UART code in MPLAB using "xc8" compiler for PIC16F877A Microcontroller..code build was successful but while i am simulation code using proteus i am not getting the output in virtual terminal as expected. Frequency used for 9600 baud rate is 4.9152 MHZ so that baud rate error is ZERO. i have set frequency in proteus as same 4.9152 MHZ and baud rate as 9600 in virtual terminal. can anyone suggest weather i am missing something in the code or code is correct and there might be problem in proteus simulation. please help..

#include<xc.h>
#include<stdio.h>
#include<stdlib.h>


// CONFIG
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT enabled)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)

#define _XTAL_FREQ 4915200
#define baud_rate 9600

void serial_init(void);
void serial_char(unsigned char);
void serial_string(unsigned char *);
char serial_read(void);

char data_string[16] ="ENTER ANY VALUE";
unsigned char data_buff = 0,data_read =0;

void main()
{
unsigned int i=0;
serial_init();
serial_char('A');
serial_string(data_string);
TRISB =0X00;
PORTB = 0X00;
while(1)
{
if(PIR1bits.RCIF)
{

data_buff = serial_read();

switch(data_buff)
{
case 0x31:
{
PORTB = 0X01;
break;
}
case 0x32:
{
PORTB = 0X02;
break;
}
case ' ':
{
PORTB = 0X03;
break;
}
default:
PORTB = 0XAA;
}
}
}
}


void serial_init()
{
unsigned int speed = (_XTAL_FREQ - (baud_rate*16))/(baud_rate*16);
TRISCbits.TRISC6 = 0;
TRISCbits.TRISC7 = 1;
SPBRG = speed;
TXSTAbits.BRGH = 1; //REQUIRED FOR HIGH BAUD RATE
TXSTAbits.SYNC = 0; //for Asynchronous communication
RCSTAbits.SPEN = 1; // enable UART
RCSTAbits.CREN = 1; // enable continuous receive enable
TXSTAbits.TXEN = 1; // enable transmission
}

void serial_char(unsigned char data)
{
while(!TXSTAbits.TRMT); //wait for previous transmission to over
TXREG = data;
}

void serial_string(unsigned char *str)
{
while(*str != 0)
{
serial_char(*str++);
}
}

char serial_read()
{
while(!PIR1bits.RCIF); //check weather reception is complete
data_read = RCREG; //read the RCREG register
if(RCSTAbits.OERR == 1) // check for any over run error
{
RCSTAbits.CREN = 0;
RCSTAbits.CREN = 1;
}
return data_read;

}
Tue Sep 29 2015, 09:33 PM
#2
are you testing this on Proteus? or MplabX simulator?

Get Social

Information

Powered by e107 Forum System

Conversation

No messages yet.

Downloads

Comments

Mirza123
Thu Jun 25 2020, 03:46 PM
eunicelove124
Mon Jun 22 2020, 03:03 PM
cerouno
Tue Jun 16 2020, 05:10 PM
Marce
Sat Jun 13 2020, 09:43 PM
Davidthils
Thu May 21 2020, 12:44 PM
Jakeror
Thu May 21 2020, 01:28 AM
motorCar
Wed May 20 2020, 07:05 PM
Vordrync
Wed May 20 2020, 11:52 AM

Online

Guests: 98, Members: 0 ...

most ever online: 182184
(Members: , Guests: 182184) on 06 Aug 2010: 05:37 AM

Members: 38215
Newest member: Mirza123