
//	Demoserial per PIC18f242/PIC18f252/PIC18f442/PIC18f452 
//	CLK a 19660800 hz 
//	Apre la porta a 19200 8N1 fa' semplicemente echo di quello che riceve

#include <p18cxxx.h>  /* for IO PORTS */

/* Set configuration bits for use with ICD2 / PICDEM2 PLUS Demo Board:
 *  - set HS oscillator
 *  - disable watchdog timer
 *  - disable low voltage programming
 *  - enable background debugging
 */

#pragma romdata CONFIG
_CONFIG_DECL(_CONFIG1H_DEFAULT & _OSC_HS_1H,\
             _CONFIG2L_DEFAULT,\
             _CONFIG2H_DEFAULT & _WDT_OFF_2H,\
             _CONFIG3H_DEFAULT,\
             _CONFIG4L_DEFAULT & _LVP_OFF_4L & _DEBUG_ON_4L,\
             _CONFIG5L_DEFAULT,\
             _CONFIG5H_DEFAULT,\
             _CONFIG6L_DEFAULT,\
             _CONFIG6H_DEFAULT,\
             _CONFIG7L_DEFAULT,\
             _CONFIG7H_DEFAULT);
#pragma romdata

void	InterruptHandlerHigh(void);
void	InterruptHandlerLow(void);


/*
 * For high interrupts, control is transferred to address 0x8.
 */

//----------------------------------------------------------------------------
// High priority interrupt vector

#pragma code InterruptVectorHigh = 0x08
void InterruptVectorHigh(void)
{
	_asm
    	goto InterruptHandlerHigh //jump to interrupt routine
  	_endasm
}

// High priority interrupt routine

#define	RCSTA_ERROR_FLAGS	0x06

#pragma code
#pragma interrupt InterruptHandlerHigh
void InterruptHandlerHigh(void)
{
	char	c_rxData;

	if(PIR1bits.RCIF)	//	interrupt di ricezione seriale
		SerialInterruptHandler();
	{
		if( RCSTA & RCSTA_ERROR_FLAGS)
    	{
			RCSTAbits.CREN	=	0;
			RCSTAbits.CREN	=	1;
			PORTB			=	0xff;
		}
		else
		{
			c_rxData	= 	RCREG;
			TXREG		=	c_rxData;
			PORTB		=	c_rxData;
		}

		PIR1bits.RCIF	=	0;
	}

	if(PIR1bits.TXIF)	//	interrupt di trasmissione seriale
	{
	}

}

//----------------------------------------------------------------------------
// Low priority interrupt vector

#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(void)
{
}

void	EnableSerialInterrupt(void)
{
	PIR1bits.RCIF	=	0;
	PIE1bits.RCIE	=	1;
	INTCONbits.PEIE	=	1;
	INTCONbits.GIE	=	1;
}

void InitIO(void)
{
	PORTA = 0;
   	TRISA = 0;   /* configure all PORTB pins for output */

	PORTB = 0;
   	LATB  = 0;
	TRISB = 0;   /* configure all PORTB pins for output */

	//	Configura pin 6 porta C in output

	TRISCbits.TRISC6 =	0;
}

void	InitSerial(void)
{
	//	Imposta la velocita' a 19200 della seriale con 
	//	quarzo a 19660800 e con divisore HIGH

	TXSTAbits.BRGH	=	1;
	SPBRG	= 0x3f;
	
	//	

	TXSTAbits.TXEN	=	1;

	//	Abilita la porta seriale
	
	RCSTAbits.SPEN	=	1;
	
	//	Abilita la ricezione continua

	RCSTAbits.CREN	=	1;

	//	Resetta il flag di interrupt della seriale in ricezione 

	PIR1bits.RCIF	=	0;

	//	Abilita' l'interrupt di ricezione della seriale 

	PIE1bits.RCIE	=	1;
}


void	main	(void)
{
	InitIO();

	InitSerial();

	INTCONbits.PEIE	=	1;
	INTCONbits.GIE	=	1;	
	
	while(1);
}

