//#pragma SMALL DB OE
#include "at898252.h"
#include "rs232.h"
//#include "protocolo.h"

#define	OSC			11059200L	//Frecuencia del cristal
#define FAUX		(OSC / (12 * 16))

#define BAUDRATE	57600

extern bit F_MANDADO,F_NUEVODATO;
//extern bit salir;
extern UCHAR dato_en_serie;

////////////////////////////////////////////////////////////////////////
//Seccion de funciones para elmanejo del puerto serie CON INTERRUPCION//
////////////////////////////////////////////////////////////////////////

//Inicializamos el puerto serie al BAUDRATE y con interrupciones
void init_serie_int(void)
{
	F_NUEVODATO=0;
	F_MANDADO=0;	//Bajamos el flag de caracter mandado
	EA=0;			//Deshabilitamos las interrupciones
	ET1=0;			//Enmascara la interrupcion del timer 1ç
	TR1=0;			//Timer 1 parado
	PCON |= 0x80;	//Configuracion de la uart
	SCON = 0x52;
	TMOD &= 0x0F;	//Configuracion del timer 1 para la uart
	TMOD |= 0x20;
	TH1 = (UCHAR)  (256 - (FAUX / BAUDRATE));
	TR1 = 1;	//Timer 1 en marcha
//Configuracion de la int de la uart
	ES=1;	//Permitimos interrupcion serie
	PS=0;	//Con prioridad baja
	EA=1;	//Habilitamos interrupciones
}//fin de init_serie_int()


void enviar_serie_int(UCHAR dato) 
{
	while( F_MANDADO == 0);
	SBUF=dato;				//Pasamos el caracter q queremos mandar
	F_MANDADO=0;
}

void recibir_serie_int(void)
{
	dato_en_serie=SBUF ;
//	salir=1;
}

//Cuando el puerto serie crea una interrupcion ejecutamos esta funcion
void int_serie() interrupt 4
{
	if (RI==1)	//Si hemos recibido
	{
		RI=0;
//		recibir();	//Funcion que se encarga de recibir los parametros
		recibir_serie_int();
		F_NUEVODATO=1;

	}
	if (TI==1)	//Si hemos finalizado el envio
	{
		TI=0;
		F_MANDADO=1;
	}
}

//Fin de las funciones del puerto serie CON INTERRUPCION




//*******************************************************************//
//Seccion de funciones para el manejo del puerto serie SIN INTERRUPCION
//*******************************************************************//

//Inicializar el puerto serie
void ini_serie(void)
{
	PCON |= 0x80;
	SCON = 0x52;
	TMOD &= 0xF;
	TMOD |= 0x20;
	TH1 = (UCHAR)  (256 - (FAUX / BAUDRATE));
	TR1 = 1;
}
//Recibir un dato, espera hasta q se alce la flag RI
UCHAR recibir_serie(void) 
{
	while (RI==0);
	RI = 0;
	return SBUF;
}
//Enviar un dato, antes de enviar espera q se alce la flag TI
void enviar_serie(UCHAR c) 
{
	while( TI == 0);
	TI = 0;
	SBUF=c;				//Pasamos el caracter q queremos mandar
}

void enviar_cadena_serie(UCHAR * punt)
{
	while(*punt)
	{
		enviar_serie(*punt);
		punt++;
	}
}

void eco_serie(void)//Sencilla funcion q hace eco(manda lo q recive por el puerto serie)
{
	UCHAR c;
	while(1)
	{
		c=recibir_serie();
		enviar_serie(c);
	}	
}

