BALKRISHNA TULSYAN
Junior Member level 3
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 .
Code C - [expand] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 #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; }
Last edited by a moderator: