C0 00 C0 C0 C0 00 C0 00 00 C0 00 C0 C0 C0 C0 C0
00 C0 00 00 C0 C0 00 00 C0 00 C0 00 00 C0 C0 00
C0 C0 00 00 00 C0 C0 C0 C0 00 C0 00 00 C0 C0 C0
C0 C0 C0 C0 C0 00 C0
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 .
NOTE: PIC16F877A DOES NOT HAVE ANY INTERNAL OSCILLATOR AS VERIFIED FROM DATASHEET
- Code: Select all
#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()
{
char 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;
}