/*************************************************************************** */
/* sg-echo-pic16F876A-skypic.c  Julio 2006                                   */
/*---------------------------------------------------------------------------*/
/* Servidor de eco para la tarjeta Skypic (a 20MHZ)                          */
/* Se hace eco de todo lo recibido por el puerto serie y se envia tambien    */
/* por el puerto B para que se pueda ver con una tarjeta de leds, como la    */
/* FREELEDS                                                                  */
/*---------------------------------------------------------------------------*/
/*  Juan Gonzalez <juan@iearobotics.com>                                     */
/*---------------------------------------------------------------------------*/
/*  LICENCIA GPL                                                             */
/*****************************************************************************/

//-- Especificar el pic a emplear
#define __16f877
#include "pic16f877.h"

//-- CONSTANTES
#define B9600_4MHZ   0x19
#define B9600_20MHZ  0x81

//---------------------------------------------
//-- CONSTANTES MODIFICABLES POR EL USUARIO
//---------------------------------------------
//-- Establecer la velocidad para un cristal de 20MHZ
//-- La skypic lleva 20Mhz
#define B9600 B9600_20MHZ


/****************************************************/
/* Configurar el puerto serie a N81 y 9600 Baudios  */
/****************************************************/
void sci_conf(void)
{
  SPBRG = 0x81;  //-- 9600 baudios (con cristal de 20MHz)
  TXSTA = 0x24;  //-- Configurar transmisor
  RCSTA = 0x90;  //-- Configurar receptor 
}

/******************************************/
/* Recibir un caracter por el SCI         */
/*----------------------------------------*/
/* DEVUELVE:                              */
/*   -Caracter recibido                   */
/******************************************/
unsigned char sci_read(void)
{
  //-- Eserar hasta que llegue el dato
  while (!RCIF);
    
  return RCREG;
}

/*****************************************/
/* Transmitir un caracter por el SCI     */
/*---------------------------------------*/
/* ENTRADAS:                             */
/*   -car: Caracter a enviar             */
/*****************************************/
void sci_write(unsigned char car)
{
  //-- Esperar a que Flag de lista para transmitir se active
  while (!TXIF);
    
  //-- Hacer la transmision
  TXREG=car;
}


/*********************************/
/* Programa principal            */
/*********************************/
void main(void)
{
  unsigned char c;

  //-- Configurar el puerto B para salida 
  TRISB=0x00;
  
  //-- Inicialmente activar todos los leds
  PORTB=0xFF;
  
  //-- Configurar las comunicaciones serie
  sci_conf();
  
  //-- Bucle infinito
  for (;;) {
    
    //-- Esperar a que llegue dato del PC
    c=sci_read();
    
    //-- Sacarlo por el puerto B para verlo en los leds
    PORTB=c; 
    
    //-- ...y enviar de vuelta el caracter por el puerto serie
    sci_write(c);
  }

}