/* * File: RX_RF.c * Author: George Panagopoulos * * Created on 16 Oct 2016, 8:17 */ #ifndef _XTAL_FREQ #define _XTAL_FREQ 4000000 //4Mhz FRC internal osc #define __delay_us(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000000.0))) #define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000.0))) #endif #include #include #include #include #include #include "lcd.h" // BEGIN CONFIG #pragma config FOSC = INTRC_CLKOUT // Oscillator Selection bits (INTOSCIO oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register) #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config MCLRE = ON // RE3/MCLR pin function select bit (RE3/MCLR pin function is digital input, MCLR internally tied to VDD) #pragma config CP = OFF // Code Protection bit (Program memory code protection is disabled) #pragma config CPD = OFF // Data Code Protection bit (Data memory code protection is disabled) #pragma config BOREN = OFF // Brown Out Reset Selection bits (BOR disabled) #pragma config IESO = OFF // Internal External Switchover bit (Internal/External Switchover mode is disabled) #pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is enabled) #pragma config LVP = OFF // Low Voltage Programming Enable bit (RB3/PGM pin has PGM function, low voltage programming enabled) #define PAYLOAD_SIZE 16 uint8_t rxdata; uint8_t parity; uint8_t rxbuffer[PAYLOAD_SIZE]; // Buffer for storing received data uint8_t rxidx; // buffer index uint8_t rxdatacoming; uint8_t rxdataready; void usart_send(uint8_t txbyte) { while(!TXSTAbits.TRMT); // make sure buffer full bit is high before transmitting TXREG = txbyte; // transmit data } //used for debugging. send data to PC void usart_write_string(const char *str,int length) { int cnt=0; for(cnt=0;cntPAYLOAD_SIZE+1) //+ stop byte { rxidx=0; //init RX buffer pointer rxdatacoming=0; } } } RCIF = 0; // clear interrupt flag } } void usart_init(uint16_t baud_rate,int en_RX) { //SPBRG switch(baud_rate) { case 1200: SPBRG=207; break; case 2400: SPBRG=103; break; case 9600: SPBRG=25; break; } //TXSTA TXSTAbits.TX9=0; //8 bit transmission TXSTAbits.TXEN=1; //Transmit enable TXSTAbits.SYNC=0; //Async mode TXSTAbits.BRGH=1; //High speed baud rate //RCSTA RCSTAbits.SPEN=1; //Serial port enabled RCSTAbits.RX9=0; //8 bit mode if(en_RX) { RCSTAbits.CREN=1; //Enable receive RCSTAbits.ADDEN=0; //Disable address detection RCIF=0; //make sure receive interrupt flag is clear RCIE=1; //enable UART receive interrupt PEIE=1; //enable peripheral interrupt ei(); } } void init_io(void) { ANSEL = 0x00; // NO ADC ANSELH = 0x00; // CM1CON0 = 0x00; //No comparators CM2CON0 = 0x00; TRISA= 0; // all output PORTB = 0x00; TRISB= 0; // all output TRISCbits.TRISC0 = 0; // output TRISCbits.TRISC1 = 0; // output TRISCbits.TRISC2 = 0; // output TRISCbits.TRISC3 = 0; // output TRISCbits.TRISC4 = 0; // output TRISCbits.TRISC5 = 0; // output TRISCbits.TRISC6 = 0; // UART TX TRISCbits.TRISC7 = 1; // UART RX PORTD=0x00; TRISD = 0; // all output TRISEbits.TRISE0 = 1; // input TRISEbits.TRISE1 = 1; // input TRISEbits.TRISE2 = 1; // input TRISEbits.TRISE3 = 1; // /MCLR } int main() { OSCCONbits.IRCF = 0x06; //set OSCCON IRCF bits to select internal OSC frequency 4MHz init_io(); lcd_init(); usart_init(1200,1); //initialise UART __delay_ms(100); //Wait for UART module to stabilise while(1) { //could sleep and wake up //on UART interrupt for low power applications __delay_ms(100); } return 0; }