
// Serial communications example with MAX232R. 
// using serial receive interrupt.

/* Задачата е да се изпрати от SerialPort Terminal през USART,някакъв предварително избран символ,
   като например 'a'. Този символ да се присвои на PORTB и това да се индикира от LED1, който е 
   прикрепен към RB1.Задачката е проста за разбиращите,но аз съм начинаещ и нещо не ми се получава!
   Използувам MPLAB IDE и C18 compiler.Кодът се компилира,минава през MPLAP SIM,но диодът не светва.
   Опитвам да симулирам и чрез Proteus,но и там е същото.Вероятно имам проблем в кода,не не мога
   да се справя сам!*/
 //*****************************************************************************************************
   
#include <p18f2550.h>
#include <delays.h>
#include <usart.h>

/** CONFIGURATION ********************************************************************************************************/

#if defined(PIC18F2550_USB)                 // Configuration bits 
        #pragma config PLLDIV   = 5         // (20 MHz crystal)
        #pragma config CPUDIV   = OSC1_PLL2   
        #pragma config USBDIV   = 2         // Clock source from 96MHz PLL/2
        #pragma config FOSC     = HSPLL_HS
        #pragma config FCMEN    = OFF
        #pragma config IESO     = OFF
        #pragma config PWRT     = OFF
        #pragma config BOR      = ON
        #pragma config BORV     = 3
        #pragma config VREGEN   = ON        // USB Voltage Regulator
        #pragma config WDT      = OFF
        #pragma config WDTPS = 32768
        #pragma config MCLRE    = ON
        #pragma config LPT1OSC  = OFF
        #pragma config PBADEN   = OFF
//      #pragma config CCP2MX   = ON
        #pragma config STVREN   = ON
        #pragma config LVP      = OFF
//      #pragma config ICPRT    = OFF       // Dedicated In-Circuit Debug/Programming
        #pragma config XINST    = OFF       // Extended Instruction Set
        #pragma config CP0      = OFF
        #pragma config CP1      = OFF
//      #pragma config CP2      = OFF
//      #pragma config CP3      = OFF
        #pragma config CPB      = OFF
//      #pragma config CPD      = OFF
        #pragma config WRT0     = OFF
        #pragma config WRT1     = OFF
//      #pragma config WRT2     = OFF
//      #pragma config WRT3     = OFF
        #pragma config WRTB     = OFF       // Boot Block Write Protection
        #pragma config WRTC     = OFF
//      #pragma config WRTD     = OFF
        #pragma config EBTR0    = OFF
        #pragma config EBTR1    = OFF
//      #pragma config EBTR2    = OFF
//      #pragma config EBTR3    = OFF
        #pragma config EBTRB    = OFF
#endif





//******************************DECLARATION OF GLOBAL VARIABLES**************************************************************

char data;		
unsigned char cUART_data_flg;
unsigned char cUART_char;

//******************************Declaration of Function Prototype************************************************************


char ReadUSART( void );
void init_uart(void);
void UART_putc(unsigned char c);
void InterruptHandlerLow (); 
void WriteUSART( char data );

//***************************************************************************************************************************  
// LED Setings:
#define setpin() TRISB = 0;                // Set all pins to output 
#define LED1 LATBbits.LATB1                // RB1
#define LED1_on()LED1 = 1;                 // Set pin to High
#define LED1_off()LED1 = 0;                // Set pin to Low           

                
void main(void)
{
setpin();                                  // Init LED
init_uart();                               // Init UART module
while(1)                                   // Create Loop
{
while(!DataRdyUSART());                    // Wait for data           	
data = ReadUSART();                        // Read data                    
PORTB == data;                              // The receive data is send to PORTB
{                  
if(ReadUSART()=='1')                        // If the received data is equal to the 'A'     
LED1_on();                                 // LED  blinking 
Delay10KTCYx(25);                          // Dealay 250K cycles 
LED1_off();                                                   
break;                                     // Stop             
}               
                                   
}

}

//***************************************************************************************************************************


#pragma code InterruptVectorLow = 0x18
void InterruptVectorLow (void)
{
  _asm
    goto InterruptHandlerLow               // jump to interrupt routine
  _endasm
}

//**************************************************************************************************************************
// Low priority interrupt routine

#pragma code
#pragma interrupt InterruptHandlerLow

void InterruptHandlerLow ()
{
  if (PIR1bits.RCIF==1)                   // Is interrupt occured by EUSART receive?, 
						                  // Then RCREG is full we have new data (cleared when RCREG is read)
  {  
	if(RCSTA&0x06)                        // More efficient way than following commented method to check for reception error 
	//if(RCSTAbits.FERR==1 || RCSTAbits.OERR==1 )
    {
      RCSTAbits.CREN=0;           	      // Overrun error (can be cleared by clearing bit CREN)
      cUART_char=RCREG;	                  // Clear Framing error 
      RCSTAbits.CREN=1;
    }
    else
    {
	   cUART_char = RCREG;                // Read new data into variable
	   cUART_data_flg = 1;                // New data received. so enable flg
    }
  }
}

//***************************************************************************************************************************


void init_uart(void)                 // Init UART module for 9600bps boud, start bit 1, stopbit 1, parity NONE
{
	cUART_data_flg=0;                // Init data receive flag to zero (no data)
	TRISCbits.TRISC7=1;              // Make UART RX pin input
	TRISCbits.TRISC6=0;              // Make UART TX pin output
    SPBRGH  = 0x02;                  // 9600bps 20MHz Osc
    SPBRG   = 0x08;		

    RCSTAbits.CREN=1;                // 1 = Enables receiver
    RCSTAbits.SPEN=1;                // 1 = Serial port enabled (configures RX/DT and TX/CK pins as serial port pins)
    BAUDCONbits.BRG16=1;             // 1 = 16-bit Baud Rate Generator – SPBRGH and SPBRG

  	TXSTAbits.SYNC=0;                // 0 = Asynchronous mode
  	TXSTAbits.BRGH=1;                // 1 = High speed 
  	TXSTAbits.TXEN=1;                // 1 = Transmit enabled

	RCONbits.IPEN = 1;               // Enable Interrupt priority levels
  	IPR1bits.RCIP=0; 	             // EUSART Receive Interrupt Priority 0 = Low priority
  	PIE1bits.RCIE=1; 	             // 1 = Enables the EUSART receive interrupt
	INTCONbits.GIEL = 1;             // Enable interrupts
	INTCONbits.GIEH = 1;      
}

//****************************************************************************************************************************


void UART_putc(unsigned char c)
{
  TXSTAbits.TXEN=0;                 // Disable transmission
  TXREG=data;			            // Load txreg with data
  TXSTAbits.TXEN=1;	                // Enable transmission
  while(TXSTAbits.TRMT==0)          // Wait here till transmit complete
  {
	Nop();
  }
}

