Discussion in "PIC Microcontroller Discussion" started by    amit_ele15    Sep 25, 2015.
Fri Sep 25 2015, 04:33 pm
#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;

}
Wed Sep 30 2015, 03:03 am
#2
are you testing this on Proteus? or MplabX simulator?

Get Social

Information

Powered by e107 Forum System

Downloads

Comments

Bobbyerilar
Thu Mar 28 2024, 08:08 am
pb58
Thu Mar 28 2024, 05:54 am
Clarazkafup
Thu Mar 28 2024, 02:24 am
Walterkic
Thu Mar 28 2024, 01:19 am
Davidusawn
Wed Mar 27 2024, 08:30 pm
Richardsop
Tue Mar 26 2024, 10:33 pm
Stevencog
Tue Mar 26 2024, 04:26 pm
Bernardwarge
Tue Mar 26 2024, 11:15 am